Delete duplicate target short-cuts to dynamic sections
[external/binutils.git] / bfd / elf32-nds32.c
1 /* NDS32-specific support for 32-bit ELF.
2    Copyright (C) 2012-2016 Free Software Foundation, Inc.
3    Contributed by Andes Technology Corporation.
4
5    This file is part of BFD, the Binary File Descriptor library.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
20    02110-1301, USA.  */
21
22
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "bfd_stdint.h"
26 #include "bfdlink.h"
27 #include "libbfd.h"
28 #include "elf-bfd.h"
29 #include "libiberty.h"
30 #include "bfd_stdint.h"
31 #include "elf/nds32.h"
32 #include "opcode/nds32.h"
33 #include "elf32-nds32.h"
34 #include "opcode/cgen.h"
35 #include "../opcodes/nds32-opc.h"
36
37 /* Relocation HOWTO functions.  */
38 static bfd_reloc_status_type nds32_elf_ignore_reloc
39   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
40 static bfd_reloc_status_type nds32_elf_9_pcrel_reloc
41   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42 static bfd_reloc_status_type nds32_elf_hi20_reloc
43   (bfd *, arelent *, asymbol *, void *,
44    asection *, bfd *, char **);
45 static bfd_reloc_status_type nds32_elf_lo12_reloc
46   (bfd *, arelent *, asymbol *, void *,
47    asection *, bfd *, char **);
48 static bfd_reloc_status_type nds32_elf_generic_reloc
49   (bfd *, arelent *, asymbol *, void *,
50    asection *, bfd *, char **);
51 static bfd_reloc_status_type nds32_elf_sda15_reloc
52   (bfd *, arelent *, asymbol *, void *,
53    asection *, bfd *, char **);
54
55 /* Helper functions for HOWTO.  */
56 static bfd_reloc_status_type nds32_elf_do_9_pcrel_reloc
57   (bfd *, reloc_howto_type *, asection *, bfd_byte *, bfd_vma,
58    asection *, bfd_vma, bfd_vma);
59 static void nds32_elf_relocate_hi20
60   (bfd *, int, Elf_Internal_Rela *, Elf_Internal_Rela *, bfd_byte *, bfd_vma);
61 static reloc_howto_type *bfd_elf32_bfd_reloc_type_table_lookup
62   (enum elf_nds32_reloc_type);
63 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
64   (bfd *, bfd_reloc_code_real_type);
65
66 /* Target hooks.  */
67 static void nds32_info_to_howto_rel
68   (bfd *, arelent *, Elf_Internal_Rela *dst);
69 static void nds32_info_to_howto
70   (bfd *, arelent *, Elf_Internal_Rela *dst);
71 static bfd_boolean nds32_elf_add_symbol_hook
72   (bfd *, struct bfd_link_info *, Elf_Internal_Sym *, const char **,
73    flagword *, asection **, bfd_vma *);
74 static bfd_boolean nds32_elf_relocate_section
75   (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
76    Elf_Internal_Rela *, Elf_Internal_Sym *, asection **);
77 static bfd_boolean nds32_elf_object_p (bfd *);
78 static void nds32_elf_final_write_processing (bfd *, bfd_boolean);
79 static bfd_boolean nds32_elf_set_private_flags (bfd *, flagword);
80 static bfd_boolean nds32_elf_merge_private_bfd_data
81   (bfd *, struct bfd_link_info *);
82 static bfd_boolean nds32_elf_print_private_bfd_data (bfd *, void *);
83 static bfd_boolean nds32_elf_gc_sweep_hook
84   (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
85 static bfd_boolean nds32_elf_check_relocs
86   (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
87 static asection *nds32_elf_gc_mark_hook
88   (asection *, struct bfd_link_info *, Elf_Internal_Rela *,
89    struct elf_link_hash_entry *, Elf_Internal_Sym *);
90 static bfd_boolean nds32_elf_adjust_dynamic_symbol
91   (struct bfd_link_info *, struct elf_link_hash_entry *);
92 static bfd_boolean nds32_elf_size_dynamic_sections
93   (bfd *, struct bfd_link_info *);
94 static bfd_boolean nds32_elf_create_dynamic_sections
95   (bfd *, struct bfd_link_info *);
96 static bfd_boolean nds32_elf_finish_dynamic_sections
97   (bfd *, struct bfd_link_info *info);
98 static bfd_boolean nds32_elf_finish_dynamic_symbol
99   (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
100    Elf_Internal_Sym *);
101 static bfd_boolean nds32_elf_mkobject (bfd *);
102
103 /* Nds32 helper functions.  */
104 static bfd_reloc_status_type nds32_elf_final_sda_base
105   (bfd *, struct bfd_link_info *, bfd_vma *, bfd_boolean);
106 static bfd_boolean allocate_dynrelocs (struct elf_link_hash_entry *, void *);
107 static bfd_boolean readonly_dynrelocs (struct elf_link_hash_entry *, void *);
108 static Elf_Internal_Rela *find_relocs_at_address
109   (Elf_Internal_Rela *, Elf_Internal_Rela *,
110    Elf_Internal_Rela *, enum elf_nds32_reloc_type);
111 static bfd_vma calculate_memory_address
112 (bfd *, Elf_Internal_Rela *, Elf_Internal_Sym *, Elf_Internal_Shdr *);
113 static int nds32_get_section_contents (bfd *, asection *,
114                                        bfd_byte **, bfd_boolean);
115 static bfd_boolean nds32_elf_ex9_build_hash_table
116 (bfd *, asection *, struct bfd_link_info *);
117 static bfd_boolean nds32_elf_ex9_itb_base (struct bfd_link_info *);
118 static void nds32_elf_ex9_import_table (struct bfd_link_info *);
119 static void nds32_elf_ex9_finish (struct bfd_link_info *);
120 static void nds32_elf_ex9_reloc_jmp (struct bfd_link_info *);
121 static void nds32_elf_get_insn_with_reg
122   (Elf_Internal_Rela *, uint32_t, uint32_t *);
123 static int nds32_get_local_syms (bfd *, asection *ATTRIBUTE_UNUSED,
124                                  Elf_Internal_Sym **);
125 static bfd_boolean nds32_elf_ex9_replace_instruction
126   (struct bfd_link_info *, bfd *, asection *);
127 static bfd_boolean nds32_elf_ifc_calc (struct bfd_link_info *, bfd *,
128                                        asection *);
129 static bfd_boolean nds32_elf_ifc_finish (struct bfd_link_info *);
130 static bfd_boolean nds32_elf_ifc_replace (struct bfd_link_info *);
131 static bfd_boolean nds32_elf_ifc_reloc (void);
132 static bfd_boolean  nds32_relax_fp_as_gp
133   (struct bfd_link_info *link_info, bfd *abfd, asection *sec,
134    Elf_Internal_Rela *internal_relocs, Elf_Internal_Rela *irelend,
135    Elf_Internal_Sym *isymbuf);
136 static bfd_boolean nds32_fag_remove_unused_fpbase
137   (bfd *abfd, asection *sec, Elf_Internal_Rela *internal_relocs,
138    Elf_Internal_Rela *irelend);
139 static bfd_byte *
140 nds32_elf_get_relocated_section_contents (bfd *abfd,
141                                           struct bfd_link_info *link_info,
142                                           struct bfd_link_order *link_order,
143                                           bfd_byte *data,
144                                           bfd_boolean relocatable,
145                                           asymbol **symbols);
146
147 enum
148 {
149   MACH_V1 = bfd_mach_n1h,
150   MACH_V2 = bfd_mach_n1h_v2,
151   MACH_V3 = bfd_mach_n1h_v3,
152   MACH_V3M = bfd_mach_n1h_v3m
153 };
154
155 #define MIN(a, b) ((a) > (b) ? (b) : (a))
156 #define MAX(a, b) ((a) > (b) ? (a) : (b))
157
158 /* The name of the dynamic interpreter.  This is put in the .interp
159    section.  */
160 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
161
162 /* The nop opcode we use.  */
163 #define NDS32_NOP32 0x40000009
164 #define NDS32_NOP16 0x9200
165
166 /* The size in bytes of an entry in the procedure linkage table.  */
167 #define PLT_ENTRY_SIZE 24
168 #define PLT_HEADER_SIZE 24
169
170 /* The first entry in a procedure linkage table are reserved,
171    and the initial contents are unimportant (we zero them out).
172    Subsequent entries look like this.  */
173 #define PLT0_ENTRY_WORD0  0x46f00000            /* sethi   r15, HI20(.got+4)      */
174 #define PLT0_ENTRY_WORD1  0x58f78000            /* ori     r15, r25, LO12(.got+4) */
175 #define PLT0_ENTRY_WORD2  0x05178000            /* lwi     r17, [r15+0]           */
176 #define PLT0_ENTRY_WORD3  0x04f78001            /* lwi     r15, [r15+4]           */
177 #define PLT0_ENTRY_WORD4  0x4a003c00            /* jr      r15                    */
178
179 /* $ta is change to $r15 (from $r25).  */
180 #define PLT0_PIC_ENTRY_WORD0  0x46f00000        /* sethi   r15, HI20(got[1]@GOT)  */
181 #define PLT0_PIC_ENTRY_WORD1  0x58f78000        /* ori     r15, r15, LO12(got[1]@GOT) */
182 #define PLT0_PIC_ENTRY_WORD2  0x40f7f400        /* add     r15, gp, r15           */
183 #define PLT0_PIC_ENTRY_WORD3  0x05178000        /* lwi     r17, [r15+0]           */
184 #define PLT0_PIC_ENTRY_WORD4  0x04f78001        /* lwi     r15, [r15+4]           */
185 #define PLT0_PIC_ENTRY_WORD5  0x4a003c00        /* jr      r15                    */
186
187 #define PLT_ENTRY_WORD0  0x46f00000             /* sethi   r15, HI20(&got[n+3])      */
188 #define PLT_ENTRY_WORD1  0x04f78000             /* lwi     r15, r15, LO12(&got[n+3]) */
189 #define PLT_ENTRY_WORD2  0x4a003c00             /* jr      r15                       */
190 #define PLT_ENTRY_WORD3  0x45000000             /* movi    r16, sizeof(RELA) * n     */
191 #define PLT_ENTRY_WORD4  0x48000000             /* j      .plt0.                     */
192
193 #define PLT_PIC_ENTRY_WORD0  0x46f00000         /* sethi  r15, HI20(got[n+3]@GOT)    */
194 #define PLT_PIC_ENTRY_WORD1  0x58f78000         /* ori    r15, r15,    LO12(got[n+3]@GOT) */
195 #define PLT_PIC_ENTRY_WORD2  0x38febc02         /* lw     r15, [gp+r15]              */
196 #define PLT_PIC_ENTRY_WORD3  0x4a003c00         /* jr     r15                        */
197 #define PLT_PIC_ENTRY_WORD4  0x45000000         /* movi   r16, sizeof(RELA) * n      */
198 #define PLT_PIC_ENTRY_WORD5  0x48000000         /* j      .plt0                      */
199
200 /* These are macros used to get the relocation accurate value.  */
201 #define ACCURATE_8BIT_S1        (0x100)
202 #define ACCURATE_U9BIT_S1       (0x400)
203 #define ACCURATE_12BIT_S1       (0x2000)
204 #define ACCURATE_14BIT_S1       (0x4000)
205 #define ACCURATE_19BIT          (0x40000)
206
207 /* These are macros used to get the relocation conservative value.  */
208 #define CONSERVATIVE_8BIT_S1    (0x100 - 4)
209 #define CONSERVATIVE_14BIT_S1   (0x4000 - 4)
210 #define CONSERVATIVE_16BIT_S1   (0x10000 - 4)
211 #define CONSERVATIVE_24BIT_S1   (0x1000000 - 4)
212 /* These must be more conservative because the address may be in
213    different segment.  */
214 #define CONSERVATIVE_15BIT      (0x4000 - 0x1000)
215 #define CONSERVATIVE_15BIT_S1   (0x8000 - 0x1000)
216 #define CONSERVATIVE_15BIT_S2   (0x10000 - 0x1000)
217 #define CONSERVATIVE_19BIT      (0x40000 - 0x1000)
218 #define CONSERVATIVE_20BIT      (0x80000 - 0x1000)
219
220 /* Size of small data/bss sections, used to calculate SDA_BASE.  */
221 static long got_size = 0;
222 static int is_SDA_BASE_set = 0;
223 static int is_ITB_BASE_set = 0;
224
225 /* Convert ELF-VER in eflags to string for debugging purpose.  */
226 static const char *const nds32_elfver_strtab[] =
227 {
228   "ELF-1.2",
229   "ELF-1.3",
230   "ELF-1.4",
231 };
232
233 /* The nds32 linker needs to keep track of the number of relocs that it
234    decides to copy in check_relocs for each symbol.  This is so that
235    it can discard PC relative relocs if it doesn't need them when
236    linking with -Bsymbolic.  We store the information in a field
237    extending the regular ELF linker hash table.  */
238
239 /* This structure keeps track of the number of PC relative relocs we
240    have copied for a given symbol.  */
241
242 struct elf_nds32_pcrel_relocs_copied
243 {
244   /* Next section.  */
245   struct elf_nds32_pcrel_relocs_copied *next;
246   /* A section in dynobj.  */
247   asection *section;
248   /* Number of relocs copied in this section.  */
249   bfd_size_type count;
250 };
251
252 /* The sh linker needs to keep track of the number of relocs that it
253    decides to copy as dynamic relocs in check_relocs for each symbol.
254    This is so that it can later discard them if they are found to be
255    unnecessary.  We store the information in a field extending the
256    regular ELF linker hash table.  */
257
258 struct elf_nds32_dyn_relocs
259 {
260   struct elf_nds32_dyn_relocs *next;
261
262   /* The input section of the reloc.  */
263   asection *sec;
264
265   /* Total number of relocs copied for the input section.  */
266   bfd_size_type count;
267
268   /* Number of pc-relative relocs copied for the input section.  */
269   bfd_size_type pc_count;
270 };
271
272 /* Nds32 ELF linker hash entry.  */
273
274 struct elf_nds32_link_hash_entry
275 {
276   struct elf_link_hash_entry root;
277
278   /* Track dynamic relocs copied for this symbol.  */
279   struct elf_nds32_dyn_relocs *dyn_relocs;
280
281   /* For checking relocation type.  */
282 #define GOT_UNKNOWN     0
283 #define GOT_NORMAL      1
284 #define GOT_TLS_IE      2
285   unsigned int tls_type;
286 };
287
288 /* Get the nds32 ELF linker hash table from a link_info structure.  */
289
290 #define FP_BASE_NAME "_FP_BASE_"
291 static int check_start_export_sym = 0;
292 static size_t ex9_relax_size = 0;               /* Save ex9 predicted reducing size.  */
293
294 /* The offset for executable tls relaxation.  */
295 #define TP_OFFSET 0x0
296
297 struct elf_nds32_obj_tdata
298 {
299   struct elf_obj_tdata root;
300
301   /* tls_type for each local got entry.  */
302   char *local_got_tls_type;
303 };
304
305 #define elf_nds32_tdata(bfd) \
306   ((struct elf_nds32_obj_tdata *) (bfd)->tdata.any)
307
308 #define elf32_nds32_local_got_tls_type(bfd) \
309   (elf_nds32_tdata (bfd)->local_got_tls_type)
310
311 #define elf32_nds32_hash_entry(ent) ((struct elf_nds32_link_hash_entry *)(ent))
312
313 static bfd_boolean
314 nds32_elf_mkobject (bfd *abfd)
315 {
316   return bfd_elf_allocate_object (abfd, sizeof (struct elf_nds32_obj_tdata),
317                                   NDS32_ELF_DATA);
318 }
319
320 /* Relocations used for relocation.  */
321 static reloc_howto_type nds32_elf_howto_table[] =
322 {
323   /* This reloc does nothing.  */
324   HOWTO (R_NDS32_NONE,          /* type */
325          0,                     /* rightshift */
326          3,                     /* size (0 = byte, 1 = short, 2 = long) */
327          0,                     /* bitsize */
328          FALSE,                 /* pc_relative */
329          0,                     /* bitpos */
330          complain_overflow_dont,        /* complain_on_overflow */
331          bfd_elf_generic_reloc, /* special_function */
332          "R_NDS32_NONE",        /* name */
333          FALSE,                 /* partial_inplace */
334          0,                     /* src_mask */
335          0,                     /* dst_mask */
336          FALSE),                /* pcrel_offset */
337
338   /* A 16 bit absolute relocation.  */
339   HOWTO (R_NDS32_16,            /* type */
340          0,                     /* rightshift */
341          1,                     /* size (0 = byte, 1 = short, 2 = long) */
342          16,                    /* bitsize */
343          FALSE,                 /* pc_relative */
344          0,                     /* bitpos */
345          complain_overflow_bitfield,    /* complain_on_overflow */
346          nds32_elf_generic_reloc,       /* special_function */
347          "R_NDS32_16",          /* name */
348          FALSE,                 /* partial_inplace */
349          0xffff,                /* src_mask */
350          0xffff,                /* dst_mask */
351          FALSE),                /* pcrel_offset */
352
353   /* A 32 bit absolute relocation.  */
354   HOWTO (R_NDS32_32,            /* type */
355          0,                     /* rightshift */
356          2,                     /* size (0 = byte, 1 = short, 2 = long) */
357          32,                    /* bitsize */
358          FALSE,                 /* pc_relative */
359          0,                     /* bitpos */
360          complain_overflow_bitfield,    /* complain_on_overflow */
361          nds32_elf_generic_reloc,       /* special_function */
362          "R_NDS32_32",          /* name */
363          FALSE,                 /* partial_inplace */
364          0xffffffff,            /* src_mask */
365          0xffffffff,            /* dst_mask */
366          FALSE),                /* pcrel_offset */
367
368   /* A 20 bit address.  */
369   HOWTO (R_NDS32_20,            /* type */
370          0,                     /* rightshift */
371          2,                     /* size (0 = byte, 1 = short, 2 = long) */
372          20,                    /* bitsize */
373          FALSE,                 /* pc_relative */
374          0,                     /* bitpos */
375          complain_overflow_unsigned,    /* complain_on_overflow */
376          nds32_elf_generic_reloc,       /* special_function */
377          "R_NDS32_20",          /* name */
378          FALSE,                 /* partial_inplace */
379          0xfffff,               /* src_mask */
380          0xfffff,               /* dst_mask */
381          FALSE),                /* pcrel_offset */
382
383   /* An PC Relative 9-bit relocation, shifted by 2.
384      This reloc is complicated because relocations are relative to pc & -4.
385      i.e. branches in the right insn slot use the address of the left insn
386      slot for pc.  */
387   /* ??? It's not clear whether this should have partial_inplace set or not.
388      Branch relaxing in the assembler can store the addend in the insn,
389      and if bfd_install_relocation gets called the addend may get added
390      again.  */
391   HOWTO (R_NDS32_9_PCREL,       /* type */
392          1,                     /* rightshift */
393          1,                     /* size (0 = byte, 1 = short, 2 = long) */
394          8,                     /* bitsize */
395          TRUE,                  /* pc_relative */
396          0,                     /* bitpos */
397          complain_overflow_signed,      /* complain_on_overflow */
398          nds32_elf_9_pcrel_reloc,       /* special_function */
399          "R_NDS32_9_PCREL",     /* name */
400          FALSE,                 /* partial_inplace */
401          0xff,                  /* src_mask */
402          0xff,                  /* dst_mask */
403          TRUE),                 /* pcrel_offset */
404
405   /* A relative 15 bit relocation, right shifted by 1.  */
406   HOWTO (R_NDS32_15_PCREL,      /* type */
407          1,                     /* rightshift */
408          2,                     /* size (0 = byte, 1 = short, 2 = long) */
409          14,                    /* bitsize */
410          TRUE,                  /* pc_relative */
411          0,                     /* bitpos */
412          complain_overflow_signed,      /* complain_on_overflow */
413          bfd_elf_generic_reloc, /* special_function */
414          "R_NDS32_15_PCREL",    /* name */
415          FALSE,                 /* partial_inplace */
416          0x3fff,                /* src_mask */
417          0x3fff,                /* dst_mask */
418          TRUE),                 /* pcrel_offset */
419
420   /* A relative 17 bit relocation, right shifted by 1.  */
421   HOWTO (R_NDS32_17_PCREL,      /* type */
422          1,                     /* rightshift */
423          2,                     /* size (0 = byte, 1 = short, 2 = long) */
424          16,                    /* bitsize */
425          TRUE,                  /* pc_relative */
426          0,                     /* bitpos */
427          complain_overflow_signed,      /* complain_on_overflow */
428          bfd_elf_generic_reloc, /* special_function */
429          "R_NDS32_17_PCREL",    /* name */
430          FALSE,                 /* partial_inplace */
431          0xffff,                /* src_mask */
432          0xffff,                /* dst_mask */
433          TRUE),                 /* pcrel_offset */
434
435   /* A relative 25 bit relocation, right shifted by 1.  */
436   /* ??? It's not clear whether this should have partial_inplace set or not.
437      Branch relaxing in the assembler can store the addend in the insn,
438      and if bfd_install_relocation gets called the addend may get added
439      again.  */
440   HOWTO (R_NDS32_25_PCREL,      /* type */
441          1,                     /* rightshift */
442          2,                     /* size (0 = byte, 1 = short, 2 = long) */
443          24,                    /* bitsize */
444          TRUE,                  /* pc_relative */
445          0,                     /* bitpos */
446          complain_overflow_signed,      /* complain_on_overflow */
447          bfd_elf_generic_reloc, /* special_function */
448          "R_NDS32_25_PCREL",    /* name */
449          FALSE,                 /* partial_inplace */
450          0xffffff,              /* src_mask */
451          0xffffff,              /* dst_mask */
452          TRUE),                 /* pcrel_offset */
453
454   /* High 20 bits of address when lower 12 is or'd in.  */
455   HOWTO (R_NDS32_HI20,          /* type */
456          12,                    /* rightshift */
457          2,                     /* size (0 = byte, 1 = short, 2 = long) */
458          20,                    /* bitsize */
459          FALSE,                 /* pc_relative */
460          0,                     /* bitpos */
461          complain_overflow_dont,/* complain_on_overflow */
462          nds32_elf_hi20_reloc,  /* special_function */
463          "R_NDS32_HI20",        /* name */
464          FALSE,                 /* partial_inplace */
465          0x000fffff,            /* src_mask */
466          0x000fffff,            /* dst_mask */
467          FALSE),                /* pcrel_offset */
468
469   /* Lower 12 bits of address.  */
470   HOWTO (R_NDS32_LO12S3,        /* type */
471          3,                     /* rightshift */
472          2,                     /* size (0 = byte, 1 = short, 2 = long) */
473          9,                     /* bitsize */
474          FALSE,                 /* pc_relative */
475          0,                     /* bitpos */
476          complain_overflow_dont,/* complain_on_overflow */
477          nds32_elf_lo12_reloc,  /* special_function */
478          "R_NDS32_LO12S3",      /* name */
479          FALSE,                 /* partial_inplace */
480          0x000001ff,            /* src_mask */
481          0x000001ff,            /* dst_mask */
482          FALSE),                /* pcrel_offset */
483
484   /* Lower 12 bits of address.  */
485   HOWTO (R_NDS32_LO12S2,        /* type */
486          2,                     /* rightshift */
487          2,                     /* size (0 = byte, 1 = short, 2 = long) */
488          10,                    /* bitsize */
489          FALSE,                 /* pc_relative */
490          0,                     /* bitpos */
491          complain_overflow_dont,/* complain_on_overflow */
492          nds32_elf_lo12_reloc,  /* special_function */
493          "R_NDS32_LO12S2",      /* name */
494          FALSE,                 /* partial_inplace */
495          0x000003ff,            /* src_mask */
496          0x000003ff,            /* dst_mask */
497          FALSE),                /* pcrel_offset */
498
499   /* Lower 12 bits of address.  */
500   HOWTO (R_NDS32_LO12S1,        /* type */
501          1,                     /* rightshift */
502          2,                     /* size (0 = byte, 1 = short, 2 = long) */
503          11,                    /* bitsize */
504          FALSE,                 /* pc_relative */
505          0,                     /* bitpos */
506          complain_overflow_dont,/* complain_on_overflow */
507          nds32_elf_lo12_reloc,  /* special_function */
508          "R_NDS32_LO12S1",      /* name */
509          FALSE,                 /* partial_inplace */
510          0x000007ff,            /* src_mask */
511          0x000007ff,            /* dst_mask */
512          FALSE),                /* pcrel_offset */
513
514   /* Lower 12 bits of address.  */
515   HOWTO (R_NDS32_LO12S0,        /* type */
516          0,                     /* rightshift */
517          2,                     /* size (0 = byte, 1 = short, 2 = long) */
518          12,                    /* bitsize */
519          FALSE,                 /* pc_relative */
520          0,                     /* bitpos */
521          complain_overflow_dont,/* complain_on_overflow */
522          nds32_elf_lo12_reloc,  /* special_function */
523          "R_NDS32_LO12S0",      /* name */
524          FALSE,                 /* partial_inplace */
525          0x00000fff,            /* src_mask */
526          0x00000fff,            /* dst_mask */
527          FALSE),                /* pcrel_offset */
528
529   /* Small data area 15 bits offset.  */
530   HOWTO (R_NDS32_SDA15S3,       /* type */
531          3,                     /* rightshift */
532          2,                     /* size (0 = byte, 1 = short, 2 = long) */
533          15,                    /* bitsize */
534          FALSE,                 /* pc_relative */
535          0,                     /* bitpos */
536          complain_overflow_signed,      /* complain_on_overflow */
537          nds32_elf_sda15_reloc, /* special_function */
538          "R_NDS32_SDA15S3",     /* name */
539          FALSE,                 /* partial_inplace */
540          0x00007fff,            /* src_mask */
541          0x00007fff,            /* dst_mask */
542          FALSE),                /* pcrel_offset */
543
544   /* Small data area 15 bits offset.  */
545   HOWTO (R_NDS32_SDA15S2,       /* type */
546          2,                     /* rightshift */
547          2,                     /* size (0 = byte, 1 = short, 2 = long) */
548          15,                    /* bitsize */
549          FALSE,                 /* pc_relative */
550          0,                     /* bitpos */
551          complain_overflow_signed,      /* complain_on_overflow */
552          nds32_elf_sda15_reloc, /* special_function */
553          "R_NDS32_SDA15S2",     /* name */
554          FALSE,                 /* partial_inplace */
555          0x00007fff,            /* src_mask */
556          0x00007fff,            /* dst_mask */
557          FALSE),                /* pcrel_offset */
558
559   /* Small data area 15 bits offset.  */
560   HOWTO (R_NDS32_SDA15S1,       /* type */
561          1,                     /* rightshift */
562          2,                     /* size (0 = byte, 1 = short, 2 = long) */
563          15,                    /* bitsize */
564          FALSE,                 /* pc_relative */
565          0,                     /* bitpos */
566          complain_overflow_signed,      /* complain_on_overflow */
567          nds32_elf_sda15_reloc, /* special_function */
568          "R_NDS32_SDA15S1",     /* name */
569          FALSE,                 /* partial_inplace */
570          0x00007fff,            /* src_mask */
571          0x00007fff,            /* dst_mask */
572          FALSE),                /* pcrel_offset */
573
574   /* Small data area 15 bits offset.  */
575   HOWTO (R_NDS32_SDA15S0,       /* type */
576          0,                     /* rightshift */
577          2,                     /* size (0 = byte, 1 = short, 2 = long) */
578          15,                    /* bitsize */
579          FALSE,                 /* pc_relative */
580          0,                     /* bitpos */
581          complain_overflow_signed,      /* complain_on_overflow */
582          nds32_elf_sda15_reloc, /* special_function */
583          "R_NDS32_SDA15S0",     /* name */
584          FALSE,                 /* partial_inplace */
585          0x00007fff,            /* src_mask */
586          0x00007fff,            /* dst_mask */
587          FALSE),                /* pcrel_offset */
588
589   /* GNU extension to record C++ vtable hierarchy */
590   HOWTO (R_NDS32_GNU_VTINHERIT, /* type */
591          0,                     /* rightshift */
592          2,                     /* size (0 = byte, 1 = short, 2 = long) */
593          0,                     /* bitsize */
594          FALSE,                 /* pc_relative */
595          0,                     /* bitpos */
596          complain_overflow_dont,/* complain_on_overflow */
597          NULL,                  /* special_function */
598          "R_NDS32_GNU_VTINHERIT",       /* name */
599          FALSE,                 /* partial_inplace */
600          0,                     /* src_mask */
601          0,                     /* dst_mask */
602          FALSE),                /* pcrel_offset */
603
604   /* GNU extension to record C++ vtable member usage */
605   HOWTO (R_NDS32_GNU_VTENTRY,   /* type */
606          0,                     /* rightshift */
607          2,                     /* size (0 = byte, 1 = short, 2 = long) */
608          0,                     /* bitsize */
609          FALSE,                 /* pc_relative */
610          0,                     /* bitpos */
611          complain_overflow_dont,/* complain_on_overflow */
612          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
613          "R_NDS32_GNU_VTENTRY", /* name */
614          FALSE,                 /* partial_inplace */
615          0,                     /* src_mask */
616          0,                     /* dst_mask */
617          FALSE),                /* pcrel_offset */
618
619   /* A 16 bit absolute relocation.  */
620   HOWTO (R_NDS32_16_RELA,       /* type */
621          0,                     /* rightshift */
622          1,                     /* size (0 = byte, 1 = short, 2 = long) */
623          16,                    /* bitsize */
624          FALSE,                 /* pc_relative */
625          0,                     /* bitpos */
626          complain_overflow_bitfield,    /* complain_on_overflow */
627          bfd_elf_generic_reloc, /* special_function */
628          "R_NDS32_16_RELA",     /* name */
629          FALSE,                 /* partial_inplace */
630          0xffff,                /* src_mask */
631          0xffff,                /* dst_mask */
632          FALSE),                /* pcrel_offset */
633
634   /* A 32 bit absolute relocation.  */
635   HOWTO (R_NDS32_32_RELA,       /* type */
636          0,                     /* rightshift */
637          2,                     /* size (0 = byte, 1 = short, 2 = long) */
638          32,                    /* bitsize */
639          FALSE,                 /* pc_relative */
640          0,                     /* bitpos */
641          complain_overflow_bitfield,    /* complain_on_overflow */
642          bfd_elf_generic_reloc, /* special_function */
643          "R_NDS32_32_RELA",     /* name */
644          FALSE,                 /* partial_inplace */
645          0xffffffff,            /* src_mask */
646          0xffffffff,            /* dst_mask */
647          FALSE),                /* pcrel_offset */
648
649   /* A 20 bit address.  */
650   HOWTO (R_NDS32_20_RELA,       /* type */
651          0,                     /* rightshift */
652          2,                     /* size (0 = byte, 1 = short, 2 = long) */
653          20,                    /* bitsize */
654          FALSE,                 /* pc_relative */
655          0,                     /* bitpos */
656          complain_overflow_signed,      /* complain_on_overflow */
657          bfd_elf_generic_reloc, /* special_function */
658          "R_NDS32_20_RELA",     /* name */
659          FALSE,                 /* partial_inplace */
660          0xfffff,               /* src_mask */
661          0xfffff,               /* dst_mask */
662          FALSE),                /* pcrel_offset */
663
664   HOWTO (R_NDS32_9_PCREL_RELA,  /* type */
665          1,                     /* rightshift */
666          1,                     /* size (0 = byte, 1 = short, 2 = long) */
667          8,                     /* bitsize */
668          TRUE,                  /* pc_relative */
669          0,                     /* bitpos */
670          complain_overflow_signed,      /* complain_on_overflow */
671          bfd_elf_generic_reloc, /* special_function */
672          "R_NDS32_9_PCREL_RELA",/* name */
673          FALSE,                 /* partial_inplace */
674          0xff,                  /* src_mask */
675          0xff,                  /* dst_mask */
676          TRUE),                 /* pcrel_offset */
677
678   /* A relative 15 bit relocation, right shifted by 1.  */
679   HOWTO (R_NDS32_15_PCREL_RELA, /* type */
680          1,                     /* rightshift */
681          2,                     /* size (0 = byte, 1 = short, 2 = long) */
682          14,                    /* bitsize */
683          TRUE,                  /* pc_relative */
684          0,                     /* bitpos */
685          complain_overflow_signed,      /* complain_on_overflow */
686          bfd_elf_generic_reloc, /* special_function */
687          "R_NDS32_15_PCREL_RELA",       /* name */
688          FALSE,                 /* partial_inplace */
689          0x3fff,                /* src_mask */
690          0x3fff,                /* dst_mask */
691          TRUE),                 /* pcrel_offset */
692
693   /* A relative 17 bit relocation, right shifted by 1.  */
694   HOWTO (R_NDS32_17_PCREL_RELA, /* type */
695          1,                     /* rightshift */
696          2,                     /* size (0 = byte, 1 = short, 2 = long) */
697          16,                    /* bitsize */
698          TRUE,                  /* pc_relative */
699          0,                     /* bitpos */
700          complain_overflow_signed,      /* complain_on_overflow */
701          bfd_elf_generic_reloc, /* special_function */
702          "R_NDS32_17_PCREL_RELA",       /* name */
703          FALSE,                 /* partial_inplace */
704          0xffff,                /* src_mask */
705          0xffff,                /* dst_mask */
706          TRUE),                 /* pcrel_offset */
707
708   /* A relative 25 bit relocation, right shifted by 2.  */
709   HOWTO (R_NDS32_25_PCREL_RELA, /* type */
710          1,                     /* rightshift */
711          2,                     /* size (0 = byte, 1 = short, 2 = long) */
712          24,                    /* bitsize */
713          TRUE,                  /* pc_relative */
714          0,                     /* bitpos */
715          complain_overflow_signed,      /* complain_on_overflow */
716          bfd_elf_generic_reloc, /* special_function */
717          "R_NDS32_25_PCREL_RELA",       /* name */
718          FALSE,                 /* partial_inplace */
719          0xffffff,              /* src_mask */
720          0xffffff,              /* dst_mask */
721          TRUE),                 /* pcrel_offset */
722
723   /* High 20 bits of address when lower 16 is or'd in.  */
724   HOWTO (R_NDS32_HI20_RELA,     /* type */
725          12,                    /* rightshift */
726          2,                     /* size (0 = byte, 1 = short, 2 = long) */
727          20,                    /* bitsize */
728          FALSE,                 /* pc_relative */
729          0,                     /* bitpos */
730          complain_overflow_dont,/* complain_on_overflow */
731          bfd_elf_generic_reloc, /* special_function */
732          "R_NDS32_HI20_RELA",   /* name */
733          FALSE,                 /* partial_inplace */
734          0x000fffff,            /* src_mask */
735          0x000fffff,            /* dst_mask */
736          FALSE),                /* pcrel_offset */
737
738   /* Lower 12 bits of address.  */
739   HOWTO (R_NDS32_LO12S3_RELA,   /* type */
740          3,                     /* rightshift */
741          2,                     /* size (0 = byte, 1 = short, 2 = long) */
742          9,                     /* bitsize */
743          FALSE,                 /* pc_relative */
744          0,                     /* bitpos */
745          complain_overflow_dont,/* complain_on_overflow */
746          bfd_elf_generic_reloc, /* special_function */
747          "R_NDS32_LO12S3_RELA", /* name */
748          FALSE,                 /* partial_inplace */
749          0x000001ff,            /* src_mask */
750          0x000001ff,            /* dst_mask */
751          FALSE),                /* pcrel_offset */
752
753   /* Lower 12 bits of address.  */
754   HOWTO (R_NDS32_LO12S2_RELA,   /* type */
755          2,                     /* rightshift */
756          2,                     /* size (0 = byte, 1 = short, 2 = long) */
757          10,                    /* bitsize */
758          FALSE,                 /* pc_relative */
759          0,                     /* bitpos */
760          complain_overflow_dont,/* complain_on_overflow */
761          bfd_elf_generic_reloc, /* special_function */
762          "R_NDS32_LO12S2_RELA", /* name */
763          FALSE,                 /* partial_inplace */
764          0x000003ff,            /* src_mask */
765          0x000003ff,            /* dst_mask */
766          FALSE),                /* pcrel_offset */
767
768   /* Lower 12 bits of address.  */
769   HOWTO (R_NDS32_LO12S1_RELA,   /* type */
770          1,                     /* rightshift */
771          2,                     /* size (0 = byte, 1 = short, 2 = long) */
772          11,                    /* bitsize */
773          FALSE,                 /* pc_relative */
774          0,                     /* bitpos */
775          complain_overflow_dont,/* complain_on_overflow */
776          bfd_elf_generic_reloc, /* special_function */
777          "R_NDS32_LO12S1_RELA", /* name */
778          FALSE,                 /* partial_inplace */
779          0x000007ff,            /* src_mask */
780          0x000007ff,            /* dst_mask */
781          FALSE),                /* pcrel_offset */
782
783   /* Lower 12 bits of address.  */
784   HOWTO (R_NDS32_LO12S0_RELA,   /* type */
785          0,                     /* rightshift */
786          2,                     /* size (0 = byte, 1 = short, 2 = long) */
787          12,                    /* bitsize */
788          FALSE,                 /* pc_relative */
789          0,                     /* bitpos */
790          complain_overflow_dont,/* complain_on_overflow */
791          bfd_elf_generic_reloc, /* special_function */
792          "R_NDS32_LO12S0_RELA", /* name */
793          FALSE,                 /* partial_inplace */
794          0x00000fff,            /* src_mask */
795          0x00000fff,            /* dst_mask */
796          FALSE),                /* pcrel_offset */
797
798   /* Small data area 15 bits offset.  */
799   HOWTO (R_NDS32_SDA15S3_RELA,  /* type */
800          3,                     /* rightshift */
801          2,                     /* size (0 = byte, 1 = short, 2 = long) */
802          15,                    /* bitsize */
803          FALSE,                 /* pc_relative */
804          0,                     /* bitpos */
805          complain_overflow_signed,      /* complain_on_overflow */
806          bfd_elf_generic_reloc, /* special_function */
807          "R_NDS32_SDA15S3_RELA",/* name */
808          FALSE,                 /* partial_inplace */
809          0x00007fff,            /* src_mask */
810          0x00007fff,            /* dst_mask */
811          FALSE),                /* pcrel_offset */
812
813   /* Small data area 15 bits offset.  */
814   HOWTO (R_NDS32_SDA15S2_RELA,  /* type */
815          2,                     /* rightshift */
816          2,                     /* size (0 = byte, 1 = short, 2 = long) */
817          15,                    /* bitsize */
818          FALSE,                 /* pc_relative */
819          0,                     /* bitpos */
820          complain_overflow_signed,      /* complain_on_overflow */
821          bfd_elf_generic_reloc, /* special_function */
822          "R_NDS32_SDA15S2_RELA",/* name */
823          FALSE,                 /* partial_inplace */
824          0x00007fff,            /* src_mask */
825          0x00007fff,            /* dst_mask */
826          FALSE),                /* pcrel_offset */
827
828   HOWTO (R_NDS32_SDA15S1_RELA,  /* type */
829          1,                     /* rightshift */
830          2,                     /* size (0 = byte, 1 = short, 2 = long) */
831          15,                    /* bitsize */
832          FALSE,                 /* pc_relative */
833          0,                     /* bitpos */
834          complain_overflow_signed,      /* complain_on_overflow */
835          bfd_elf_generic_reloc, /* special_function */
836          "R_NDS32_SDA15S1_RELA",/* name */
837          FALSE,                 /* partial_inplace */
838          0x00007fff,            /* src_mask */
839          0x00007fff,            /* dst_mask */
840          FALSE),                /* pcrel_offset */
841
842   HOWTO (R_NDS32_SDA15S0_RELA,  /* type */
843          0,                     /* rightshift */
844          2,                     /* size (0 = byte, 1 = short, 2 = long) */
845          15,                    /* bitsize */
846          FALSE,                 /* pc_relative */
847          0,                     /* bitpos */
848          complain_overflow_signed,      /* complain_on_overflow */
849          bfd_elf_generic_reloc, /* special_function */
850          "R_NDS32_SDA15S0_RELA",/* name */
851          FALSE,                 /* partial_inplace */
852          0x00007fff,            /* src_mask */
853          0x00007fff,            /* dst_mask */
854          FALSE),                /* pcrel_offset */
855
856   /* GNU extension to record C++ vtable hierarchy */
857   HOWTO (R_NDS32_RELA_GNU_VTINHERIT,    /* type */
858          0,                     /* rightshift */
859          2,                     /* size (0 = byte, 1 = short, 2 = long) */
860          0,                     /* bitsize */
861          FALSE,                 /* pc_relative */
862          0,                     /* bitpos */
863          complain_overflow_dont,/* complain_on_overflow */
864          NULL,                  /* special_function */
865          "R_NDS32_RELA_GNU_VTINHERIT",  /* name */
866          FALSE,                 /* partial_inplace */
867          0,                     /* src_mask */
868          0,                     /* dst_mask */
869          FALSE),                /* pcrel_offset */
870
871   /* GNU extension to record C++ vtable member usage */
872   HOWTO (R_NDS32_RELA_GNU_VTENTRY,      /* type */
873          0,                     /* rightshift */
874          2,                     /* size (0 = byte, 1 = short, 2 = long) */
875          0,                     /* bitsize */
876          FALSE,                 /* pc_relative */
877          0,                     /* bitpos */
878          complain_overflow_dont,/* complain_on_overflow */
879          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
880          "R_NDS32_RELA_GNU_VTENTRY",    /* name */
881          FALSE,                 /* partial_inplace */
882          0,                     /* src_mask */
883          0,                     /* dst_mask */
884          FALSE),                /* pcrel_offset */
885
886   /* Like R_NDS32_20, but referring to the GOT table entry for
887      the symbol.  */
888   HOWTO (R_NDS32_GOT20,         /* type */
889          0,                     /* rightshift */
890          2,                     /* size (0 = byte, 1 = short, 2 = long) */
891          20,                    /* bitsize */
892          FALSE,                 /* pc_relative */
893          0,                     /* bitpos */
894          complain_overflow_signed,      /* complain_on_overflow */
895          bfd_elf_generic_reloc, /* special_function */
896          "R_NDS32_GOT20",       /* name */
897          FALSE,                 /* partial_inplace */
898          0xfffff,               /* src_mask */
899          0xfffff,               /* dst_mask */
900          FALSE),                /* pcrel_offset */
901
902   /* Like R_NDS32_PCREL, but referring to the procedure linkage table
903      entry for the symbol.  */
904   HOWTO (R_NDS32_25_PLTREL,     /* type */
905          1,                     /* rightshift */
906          2,                     /* size (0 = byte, 1 = short, 2 = long) */
907          24,                    /* bitsize */
908          TRUE,                  /* pc_relative */
909          0,                     /* bitpos */
910          complain_overflow_signed,      /* complain_on_overflow */
911          bfd_elf_generic_reloc, /* special_function */
912          "R_NDS32_25_PLTREL",   /* name */
913          FALSE,                 /* partial_inplace */
914          0xffffff,              /* src_mask */
915          0xffffff,              /* dst_mask */
916          TRUE),                 /* pcrel_offset */
917
918   /* This is used only by the dynamic linker.  The symbol should exist
919      both in the object being run and in some shared library.  The
920      dynamic linker copies the data addressed by the symbol from the
921      shared library into the object, because the object being
922      run has to have the data at some particular address.  */
923   HOWTO (R_NDS32_COPY,          /* type */
924          0,                     /* rightshift */
925          2,                     /* size (0 = byte, 1 = short, 2 = long) */
926          32,                    /* bitsize */
927          FALSE,                 /* pc_relative */
928          0,                     /* bitpos */
929          complain_overflow_bitfield,    /* complain_on_overflow */
930          bfd_elf_generic_reloc, /* special_function */
931          "R_NDS32_COPY",        /* name */
932          FALSE,                 /* partial_inplace */
933          0xffffffff,            /* src_mask */
934          0xffffffff,            /* dst_mask */
935          FALSE),                /* pcrel_offset */
936
937   /* Like R_NDS32_20, but used when setting global offset table
938      entries.  */
939   HOWTO (R_NDS32_GLOB_DAT,      /* type */
940          0,                     /* rightshift */
941          2,                     /* size (0 = byte, 1 = short, 2 = long) */
942          32,                    /* bitsize */
943          FALSE,                 /* pc_relative */
944          0,                     /* bitpos */
945          complain_overflow_bitfield,    /* complain_on_overflow */
946          bfd_elf_generic_reloc, /* special_function */
947          "R_NDS32_GLOB_DAT",    /* name */
948          FALSE,                 /* partial_inplace */
949          0xffffffff,            /* src_mask */
950          0xffffffff,            /* dst_mask */
951          FALSE),                /* pcrel_offset */
952
953   /* Marks a procedure linkage table entry for a symbol.  */
954   HOWTO (R_NDS32_JMP_SLOT,      /* type */
955          0,                     /* rightshift */
956          2,                     /* size (0 = byte, 1 = short, 2 = long) */
957          32,                    /* bitsize */
958          FALSE,                 /* pc_relative */
959          0,                     /* bitpos */
960          complain_overflow_bitfield,    /* complain_on_overflow */
961          bfd_elf_generic_reloc, /* special_function */
962          "R_NDS32_JMP_SLOT",    /* name */
963          FALSE,                 /* partial_inplace */
964          0xffffffff,            /* src_mask */
965          0xffffffff,            /* dst_mask */
966          FALSE),                /* pcrel_offset */
967
968   /* Used only by the dynamic linker.  When the object is run, this
969      longword is set to the load address of the object, plus the
970      addend.  */
971   HOWTO (R_NDS32_RELATIVE,      /* type */
972          0,                     /* rightshift */
973          2,                     /* size (0 = byte, 1 = short, 2 = long) */
974          32,                    /* bitsize */
975          FALSE,                 /* pc_relative */
976          0,                     /* bitpos */
977          complain_overflow_bitfield,    /* complain_on_overflow */
978          bfd_elf_generic_reloc, /* special_function */
979          "R_NDS32_RELATIVE",    /* name */
980          FALSE,                 /* partial_inplace */
981          0xffffffff,            /* src_mask */
982          0xffffffff,            /* dst_mask */
983          FALSE),                /* pcrel_offset */
984
985   HOWTO (R_NDS32_GOTOFF,        /* type */
986          0,                     /* rightshift */
987          2,                     /* size (0 = byte, 1 = short, 2 = long) */
988          20,                    /* bitsize */
989          FALSE,                 /* pc_relative */
990          0,                     /* bitpos */
991          complain_overflow_signed,      /* complain_on_overflow */
992          bfd_elf_generic_reloc, /* special_function */
993          "R_NDS32_GOTOFF",      /* name */
994          FALSE,                 /* partial_inplace */
995          0xfffff,               /* src_mask */
996          0xfffff,               /* dst_mask */
997          FALSE),                /* pcrel_offset */
998
999   /* An PC Relative 20-bit relocation used when setting PIC offset
1000      table register.  */
1001   HOWTO (R_NDS32_GOTPC20,       /* type */
1002          0,                     /* rightshift */
1003          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1004          20,                    /* bitsize */
1005          TRUE,                  /* pc_relative */
1006          0,                     /* bitpos */
1007          complain_overflow_signed,      /* complain_on_overflow */
1008          bfd_elf_generic_reloc, /* special_function */
1009          "R_NDS32_GOTPC20",     /* name */
1010          FALSE,                 /* partial_inplace */
1011          0xfffff,               /* src_mask */
1012          0xfffff,               /* dst_mask */
1013          TRUE),                 /* pcrel_offset */
1014
1015   /* Like R_NDS32_HI20, but referring to the GOT table entry for
1016      the symbol.  */
1017   HOWTO (R_NDS32_GOT_HI20,      /* type */
1018          12,                    /* rightshift */
1019          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1020          20,                    /* bitsize */
1021          FALSE,                 /* pc_relative */
1022          0,                     /* bitpos */
1023          complain_overflow_dont,/* complain_on_overflow */
1024          bfd_elf_generic_reloc, /* special_function */
1025          "R_NDS32_GOT_HI20",    /* name */
1026          FALSE,                 /* partial_inplace */
1027          0x000fffff,            /* src_mask */
1028          0x000fffff,            /* dst_mask */
1029          FALSE),                /* pcrel_offset */
1030   HOWTO (R_NDS32_GOT_LO12,      /* type */
1031          0,                     /* rightshift */
1032          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1033          12,                    /* bitsize */
1034          FALSE,                 /* pc_relative */
1035          0,                     /* bitpos */
1036          complain_overflow_dont,/* complain_on_overflow */
1037          bfd_elf_generic_reloc, /* special_function */
1038          "R_NDS32_GOT_LO12",    /* name */
1039          FALSE,                 /* partial_inplace */
1040          0x00000fff,            /* src_mask */
1041          0x00000fff,            /* dst_mask */
1042          FALSE),                /* pcrel_offset */
1043
1044   /* An PC Relative relocation used when setting PIC offset table register.
1045      Like R_NDS32_HI20, but referring to the GOT table entry for
1046      the symbol.  */
1047   HOWTO (R_NDS32_GOTPC_HI20,    /* type */
1048          12,                    /* rightshift */
1049          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1050          20,                    /* bitsize */
1051          FALSE,                 /* pc_relative */
1052          0,                     /* bitpos */
1053          complain_overflow_dont,/* complain_on_overflow */
1054          bfd_elf_generic_reloc, /* special_function */
1055          "R_NDS32_GOTPC_HI20",  /* name */
1056          FALSE,                 /* partial_inplace */
1057          0x000fffff,            /* src_mask */
1058          0x000fffff,            /* dst_mask */
1059          TRUE),                 /* pcrel_offset */
1060   HOWTO (R_NDS32_GOTPC_LO12,    /* type */
1061          0,                     /* rightshift */
1062          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1063          12,                    /* bitsize */
1064          FALSE,                 /* pc_relative */
1065          0,                     /* bitpos */
1066          complain_overflow_dont,        /* complain_on_overflow */
1067          bfd_elf_generic_reloc, /* special_function */
1068          "R_NDS32_GOTPC_LO12",  /* name */
1069          FALSE,                 /* partial_inplace */
1070          0x00000fff,            /* src_mask */
1071          0x00000fff,            /* dst_mask */
1072          TRUE),                 /* pcrel_offset */
1073
1074   HOWTO (R_NDS32_GOTOFF_HI20,   /* type */
1075          12,                    /* rightshift */
1076          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1077          20,                    /* bitsize */
1078          FALSE,                 /* pc_relative */
1079          0,                     /* bitpos */
1080          complain_overflow_dont,/* complain_on_overflow */
1081          bfd_elf_generic_reloc, /* special_function */
1082          "R_NDS32_GOTOFF_HI20", /* name */
1083          FALSE,                 /* partial_inplace */
1084          0x000fffff,            /* src_mask */
1085          0x000fffff,            /* dst_mask */
1086          FALSE),                /* pcrel_offset */
1087   HOWTO (R_NDS32_GOTOFF_LO12,   /* type */
1088          0,                     /* rightshift */
1089          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1090          12,                    /* bitsize */
1091          FALSE,                 /* pc_relative */
1092          0,                     /* bitpos */
1093          complain_overflow_dont,/* complain_on_overflow */
1094          bfd_elf_generic_reloc, /* special_function */
1095          "R_NDS32_GOTOFF_LO12", /* name */
1096          FALSE,                 /* partial_inplace */
1097          0x00000fff,            /* src_mask */
1098          0x00000fff,            /* dst_mask */
1099          FALSE),                /* pcrel_offset */
1100
1101   /* Alignment hint for relaxable instruction.  This is used with
1102      R_NDS32_LABEL as a pair.  Relax this instruction from 4 bytes to 2
1103      in order to make next label aligned on word boundary.  */
1104   HOWTO (R_NDS32_INSN16,        /* type */
1105          0,                     /* rightshift */
1106          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1107          32,                    /* bitsize */
1108          FALSE,                 /* pc_relative */
1109          0,                     /* bitpos */
1110          complain_overflow_dont,/* complain_on_overflow */
1111          nds32_elf_ignore_reloc,/* special_function */
1112          "R_NDS32_INSN16",      /* name */
1113          FALSE,                 /* partial_inplace */
1114          0x00000fff,            /* src_mask */
1115          0x00000fff,            /* dst_mask */
1116          FALSE),                /* pcrel_offset */
1117
1118   /* Alignment hint for label.  */
1119   HOWTO (R_NDS32_LABEL,         /* type */
1120          0,                     /* rightshift */
1121          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1122          32,                    /* bitsize */
1123          FALSE,                 /* pc_relative */
1124          0,                     /* bitpos */
1125          complain_overflow_dont,/* complain_on_overflow */
1126          nds32_elf_ignore_reloc,/* special_function */
1127          "R_NDS32_LABEL",       /* name */
1128          FALSE,                 /* partial_inplace */
1129          0xffffffff,            /* src_mask */
1130          0xffffffff,            /* dst_mask */
1131          FALSE),                /* pcrel_offset */
1132
1133   /* Relax hint for unconditional call sequence  */
1134   HOWTO (R_NDS32_LONGCALL1,     /* type */
1135          0,                     /* rightshift */
1136          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1137          32,                    /* bitsize */
1138          FALSE,                 /* pc_relative */
1139          0,                     /* bitpos */
1140          complain_overflow_dont,/* complain_on_overflow */
1141          nds32_elf_ignore_reloc,/* special_function */
1142          "R_NDS32_LONGCALL1",   /* name */
1143          FALSE,                 /* partial_inplace */
1144          0xffffffff,            /* src_mask */
1145          0xffffffff,            /* dst_mask */
1146          FALSE),                /* pcrel_offset */
1147
1148   /* Relax hint for conditional call sequence.  */
1149   HOWTO (R_NDS32_LONGCALL2,     /* type */
1150          0,                     /* rightshift */
1151          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1152          32,                    /* bitsize */
1153          FALSE,                 /* pc_relative */
1154          0,                     /* bitpos */
1155          complain_overflow_dont,/* complain_on_overflow */
1156          nds32_elf_ignore_reloc,/* special_function */
1157          "R_NDS32_LONGCALL2",   /* name */
1158          FALSE,                 /* partial_inplace */
1159          0xffffffff,            /* src_mask */
1160          0xffffffff,            /* dst_mask */
1161          FALSE),                /* pcrel_offset */
1162
1163   /* Relax hint for conditional call sequence.  */
1164   HOWTO (R_NDS32_LONGCALL3,     /* type */
1165          0,                     /* rightshift */
1166          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1167          32,                    /* bitsize */
1168          FALSE,                 /* pc_relative */
1169          0,                     /* bitpos */
1170          complain_overflow_dont,/* complain_on_overflow */
1171          nds32_elf_ignore_reloc,/* special_function */
1172          "R_NDS32_LONGCALL3",   /* name */
1173          FALSE,                 /* partial_inplace */
1174          0xffffffff,            /* src_mask */
1175          0xffffffff,            /* dst_mask */
1176          FALSE),                /* pcrel_offset */
1177
1178   /* Relax hint for unconditional branch sequence.  */
1179   HOWTO (R_NDS32_LONGJUMP1,     /* type */
1180          0,                     /* rightshift */
1181          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1182          32,                    /* bitsize */
1183          FALSE,                 /* pc_relative */
1184          0,                     /* bitpos */
1185          complain_overflow_dont,/* complain_on_overflow */
1186          nds32_elf_ignore_reloc,/* special_function */
1187          "R_NDS32_LONGJUMP1",   /* name */
1188          FALSE,                 /* partial_inplace */
1189          0xffffffff,            /* src_mask */
1190          0xffffffff,            /* dst_mask */
1191          FALSE),                /* pcrel_offset */
1192
1193   /* Relax hint for conditional branch sequence.  */
1194   HOWTO (R_NDS32_LONGJUMP2,     /* type */
1195          0,                     /* rightshift */
1196          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1197          32,                    /* bitsize */
1198          FALSE,                 /* pc_relative */
1199          0,                     /* bitpos */
1200          complain_overflow_dont,/* complain_on_overflow */
1201          nds32_elf_ignore_reloc,/* special_function */
1202          "R_NDS32_LONGJUMP2",   /* name */
1203          FALSE,                 /* partial_inplace */
1204          0xffffffff,            /* src_mask */
1205          0xffffffff,            /* dst_mask */
1206          FALSE),                /* pcrel_offset */
1207
1208   /* Relax hint for conditional branch sequence.  */
1209   HOWTO (R_NDS32_LONGJUMP3,     /* type */
1210          0,                     /* rightshift */
1211          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1212          32,                    /* bitsize */
1213          FALSE,                 /* pc_relative */
1214          0,                     /* bitpos */
1215          complain_overflow_dont,/* complain_on_overflow */
1216          nds32_elf_ignore_reloc,/* special_function */
1217          "R_NDS32_LONGJUMP3",   /* name */
1218          FALSE,                 /* partial_inplace */
1219          0xffffffff,            /* src_mask */
1220          0xffffffff,            /* dst_mask */
1221          FALSE),                /* pcrel_offset */
1222
1223   /* Relax hint for load/store sequence.   */
1224   HOWTO (R_NDS32_LOADSTORE,     /* type */
1225          0,                     /* rightshift */
1226          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1227          32,                    /* bitsize */
1228          FALSE,                 /* pc_relative */
1229          0,                     /* bitpos */
1230          complain_overflow_dont,/* complain_on_overflow */
1231          nds32_elf_ignore_reloc,/* special_function */
1232          "R_NDS32_LOADSTORE",   /* name */
1233          FALSE,                 /* partial_inplace */
1234          0xffffffff,            /* src_mask */
1235          0xffffffff,            /* dst_mask */
1236          FALSE),                /* pcrel_offset */
1237
1238   /* Relax hint for load/store sequence.  */
1239   HOWTO (R_NDS32_9_FIXED_RELA,  /* type */
1240          0,                     /* rightshift */
1241          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1242          16,                    /* bitsize */
1243          FALSE,                 /* pc_relative */
1244          0,                     /* bitpos */
1245          complain_overflow_dont,/* complain_on_overflow */
1246          nds32_elf_ignore_reloc,/* special_function */
1247          "R_NDS32_9_FIXED_RELA",/* name */
1248          FALSE,                 /* partial_inplace */
1249          0x000000ff,            /* src_mask */
1250          0x000000ff,            /* dst_mask */
1251          FALSE),                /* pcrel_offset */
1252
1253   /* Relax hint for load/store sequence.  */
1254   HOWTO (R_NDS32_15_FIXED_RELA, /* type */
1255          0,                     /* rightshift */
1256          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1257          32,                    /* bitsize */
1258          FALSE,                 /* pc_relative */
1259          0,                     /* bitpos */
1260          complain_overflow_dont,/* complain_on_overflow */
1261          nds32_elf_ignore_reloc,/* special_function */
1262          "R_NDS32_15_FIXED_RELA",       /* name */
1263          FALSE,                 /* partial_inplace */
1264          0x00003fff,            /* src_mask */
1265          0x00003fff,            /* dst_mask */
1266          FALSE),                /* pcrel_offset */
1267
1268   /* Relax hint for load/store sequence.  */
1269   HOWTO (R_NDS32_17_FIXED_RELA, /* type */
1270          0,                     /* rightshift */
1271          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1272          32,                    /* bitsize */
1273          FALSE,                 /* pc_relative */
1274          0,                     /* bitpos */
1275          complain_overflow_dont,/* complain_on_overflow */
1276          nds32_elf_ignore_reloc,/* special_function */
1277          "R_NDS32_17_FIXED_RELA",       /* name */
1278          FALSE,                 /* partial_inplace */
1279          0x0000ffff,            /* src_mask */
1280          0x0000ffff,            /* dst_mask */
1281          FALSE),                /* pcrel_offset */
1282
1283   /* Relax hint for load/store sequence.  */
1284   HOWTO (R_NDS32_25_FIXED_RELA, /* type */
1285          0,                     /* rightshift */
1286          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1287          32,                    /* bitsize */
1288          FALSE,                 /* pc_relative */
1289          0,                     /* bitpos */
1290          complain_overflow_dont,/* complain_on_overflow */
1291          nds32_elf_ignore_reloc,/* special_function */
1292          "R_NDS32_25_FIXED_RELA",       /* name */
1293          FALSE,                 /* partial_inplace */
1294          0x00ffffff,            /* src_mask */
1295          0x00ffffff,            /* dst_mask */
1296          FALSE),                /* pcrel_offset */
1297
1298   /* High 20 bits of PLT symbol offset relative to PC.  */
1299   HOWTO (R_NDS32_PLTREL_HI20,   /* type */
1300          12,                    /* rightshift */
1301          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1302          20,                    /* bitsize */
1303          FALSE,                 /* pc_relative */
1304          0,                     /* bitpos */
1305          complain_overflow_dont,/* complain_on_overflow */
1306          bfd_elf_generic_reloc, /* special_function */
1307          "R_NDS32_PLTREL_HI20", /* name */
1308          FALSE,                 /* partial_inplace */
1309          0x000fffff,            /* src_mask */
1310          0x000fffff,            /* dst_mask */
1311          FALSE),                /* pcrel_offset */
1312
1313   /* Low 12 bits of PLT symbol offset relative to PC.  */
1314   HOWTO (R_NDS32_PLTREL_LO12,   /* type */
1315          0,                     /* rightshift */
1316          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1317          12,                    /* bitsize */
1318          FALSE,                 /* pc_relative */
1319          0,                     /* bitpos */
1320          complain_overflow_dont,/* complain_on_overflow */
1321          bfd_elf_generic_reloc, /* special_function */
1322          "R_NDS32_PLTREL_LO12", /* name */
1323          FALSE,                 /* partial_inplace */
1324          0x00000fff,            /* src_mask */
1325          0x00000fff,            /* dst_mask */
1326          FALSE),                /* pcrel_offset */
1327
1328   /* High 20 bits of PLT symbol offset relative to GOT (GP).  */
1329   HOWTO (R_NDS32_PLT_GOTREL_HI20,       /* type */
1330          12,                    /* rightshift */
1331          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1332          20,                    /* bitsize */
1333          FALSE,                 /* pc_relative */
1334          0,                     /* bitpos */
1335          complain_overflow_dont,/* complain_on_overflow */
1336          bfd_elf_generic_reloc, /* special_function */
1337          "R_NDS32_PLT_GOTREL_HI20",     /* name */
1338          FALSE,                 /* partial_inplace */
1339          0x000fffff,            /* src_mask */
1340          0x000fffff,            /* dst_mask */
1341          FALSE),                /* pcrel_offset */
1342
1343   /* Low 12 bits of PLT symbol offset relative to GOT (GP).  */
1344   HOWTO (R_NDS32_PLT_GOTREL_LO12,       /* type */
1345          0,                     /* rightshift */
1346          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1347          12,                    /* bitsize */
1348          FALSE,                 /* pc_relative */
1349          0,                     /* bitpos */
1350          complain_overflow_dont,/* complain_on_overflow */
1351          bfd_elf_generic_reloc, /* special_function */
1352          "R_NDS32_PLT_GOTREL_LO12",     /* name */
1353          FALSE,                 /* partial_inplace */
1354          0x00000fff,            /* src_mask */
1355          0x00000fff,            /* dst_mask */
1356          FALSE),                /* pcrel_offset */
1357
1358   /* Small data area 12 bits offset.  */
1359   HOWTO (R_NDS32_SDA12S2_DP_RELA,       /* type */
1360          2,                     /* rightshift */
1361          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1362          12,                    /* bitsize */
1363          FALSE,                 /* pc_relative */
1364          0,                     /* bitpos */
1365          complain_overflow_signed,      /* complain_on_overflow */
1366          bfd_elf_generic_reloc, /* special_function */
1367          "R_NDS32_SDA12S2_DP_RELA",     /* name */
1368          FALSE,                 /* partial_inplace */
1369          0x00000fff,            /* src_mask */
1370          0x00000fff,            /* dst_mask */
1371          FALSE),                /* pcrel_offset */
1372
1373   /* Small data area 12 bits offset.  */
1374   HOWTO (R_NDS32_SDA12S2_SP_RELA,       /* type */
1375          2,                     /* rightshift */
1376          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1377          12,                    /* bitsize */
1378          FALSE,                 /* pc_relative */
1379          0,                     /* bitpos */
1380          complain_overflow_signed,      /* complain_on_overflow */
1381          bfd_elf_generic_reloc, /* special_function */
1382          "R_NDS32_SDA12S2_SP_RELA",     /* name */
1383          FALSE,                 /* partial_inplace */
1384          0x00000fff,            /* src_mask */
1385          0x00000fff,            /* dst_mask */
1386          FALSE),                /* pcrel_offset */
1387   /* Lower 12 bits of address.  */
1388
1389   HOWTO (R_NDS32_LO12S2_DP_RELA,        /* type */
1390          2,                     /* rightshift */
1391          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1392          10,                    /* bitsize */
1393          FALSE,                 /* pc_relative */
1394          0,                     /* bitpos */
1395          complain_overflow_dont,/* complain_on_overflow */
1396          bfd_elf_generic_reloc, /* special_function */
1397          "R_NDS32_LO12S2_DP_RELA",      /* name */
1398          FALSE,                 /* partial_inplace */
1399          0x000003ff,            /* src_mask */
1400          0x000003ff,            /* dst_mask */
1401          FALSE),                /* pcrel_offset */
1402
1403   /* Lower 12 bits of address.  */
1404   HOWTO (R_NDS32_LO12S2_SP_RELA,/* type */
1405          2,                     /* rightshift */
1406          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1407          10,                    /* bitsize */
1408          FALSE,                 /* pc_relative */
1409          0,                     /* bitpos */
1410          complain_overflow_dont,/* complain_on_overflow */
1411          bfd_elf_generic_reloc, /* special_function */
1412          "R_NDS32_LO12S2_SP_RELA",      /* name */
1413          FALSE,                 /* partial_inplace */
1414          0x000003ff,            /* src_mask */
1415          0x000003ff,            /* dst_mask */
1416          FALSE),                /* pcrel_offset */
1417   /* Lower 12 bits of address.  Special identity for or case.  */
1418   HOWTO (R_NDS32_LO12S0_ORI_RELA,       /* type */
1419          0,                     /* rightshift */
1420          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1421          12,                    /* bitsize */
1422          FALSE,                 /* pc_relative */
1423          0,                     /* bitpos */
1424          complain_overflow_dont,/* complain_on_overflow */
1425          bfd_elf_generic_reloc, /* special_function */
1426          "R_NDS32_LO12S0_ORI_RELA",     /* name */
1427          FALSE,                 /* partial_inplace */
1428          0x00000fff,            /* src_mask */
1429          0x00000fff,            /* dst_mask */
1430          FALSE),                /* pcrel_offset */
1431   /* Small data area 19 bits offset.  */
1432   HOWTO (R_NDS32_SDA16S3_RELA,  /* type */
1433          3,                     /* rightshift */
1434          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1435          16,                    /* bitsize */
1436          FALSE,                 /* pc_relative */
1437          0,                     /* bitpos */
1438          complain_overflow_signed,      /* complain_on_overflow */
1439          bfd_elf_generic_reloc, /* special_function */
1440          "R_NDS32_SDA16S3_RELA",/* name */
1441          FALSE,                 /* partial_inplace */
1442          0x0000ffff,            /* src_mask */
1443          0x0000ffff,            /* dst_mask */
1444          FALSE),                /* pcrel_offset */
1445
1446   /* Small data area 15 bits offset.  */
1447   HOWTO (R_NDS32_SDA17S2_RELA,  /* type */
1448          2,                     /* rightshift */
1449          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1450          17,                    /* bitsize */
1451          FALSE,                 /* pc_relative */
1452          0,                     /* bitpos */
1453          complain_overflow_signed,      /* complain_on_overflow */
1454          bfd_elf_generic_reloc, /* special_function */
1455          "R_NDS32_SDA17S2_RELA",/* name */
1456          FALSE,                 /* partial_inplace */
1457          0x0001ffff,            /* src_mask */
1458          0x0001ffff,            /* dst_mask */
1459          FALSE),                /* pcrel_offset */
1460
1461   HOWTO (R_NDS32_SDA18S1_RELA,  /* type */
1462          1,                     /* rightshift */
1463          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1464          18,                    /* bitsize */
1465          FALSE,                 /* pc_relative */
1466          0,                     /* bitpos */
1467          complain_overflow_signed,      /* complain_on_overflow */
1468          bfd_elf_generic_reloc, /* special_function */
1469          "R_NDS32_SDA18S1_RELA",/* name */
1470          FALSE,                 /* partial_inplace */
1471          0x0003ffff,            /* src_mask */
1472          0x0003ffff,            /* dst_mask */
1473          FALSE),                /* pcrel_offset */
1474
1475   HOWTO (R_NDS32_SDA19S0_RELA,  /* type */
1476          0,                     /* rightshift */
1477          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1478          19,                    /* bitsize */
1479          FALSE,                 /* pc_relative */
1480          0,                     /* bitpos */
1481          complain_overflow_signed,      /* complain_on_overflow */
1482          bfd_elf_generic_reloc, /* special_function */
1483          "R_NDS32_SDA19S0_RELA",/* name */
1484          FALSE,                 /* partial_inplace */
1485          0x0007ffff,            /* src_mask */
1486          0x0007ffff,            /* dst_mask */
1487          FALSE),                /* pcrel_offset */
1488   HOWTO (R_NDS32_DWARF2_OP1_RELA,       /* type */
1489          0,                     /* rightshift */
1490          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1491          8,                     /* bitsize */
1492          FALSE,                 /* pc_relative */
1493          0,                     /* bitpos */
1494          complain_overflow_dont,/* complain_on_overflow */
1495          nds32_elf_ignore_reloc,/* special_function */
1496          "R_NDS32_DWARF2_OP1_RELA",     /* name */
1497          FALSE,                 /* partial_inplace */
1498          0xff,                  /* src_mask */
1499          0xff,                  /* dst_mask */
1500          FALSE),                /* pcrel_offset */
1501   HOWTO (R_NDS32_DWARF2_OP2_RELA,       /* type */
1502          0,                     /* rightshift */
1503          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1504          16,                    /* bitsize */
1505          FALSE,                 /* pc_relative */
1506          0,                     /* bitpos */
1507          complain_overflow_dont,/* complain_on_overflow */
1508          nds32_elf_ignore_reloc,/* special_function */
1509          "R_NDS32_DWARF2_OP2_RELA",     /* name */
1510          FALSE,                 /* partial_inplace */
1511          0xffff,                /* src_mask */
1512          0xffff,                /* dst_mask */
1513          FALSE),                /* pcrel_offset */
1514   HOWTO (R_NDS32_DWARF2_LEB_RELA,       /* type */
1515          0,                     /* rightshift */
1516          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1517          32,                    /* bitsize */
1518          FALSE,                 /* pc_relative */
1519          0,                     /* bitpos */
1520          complain_overflow_dont,/* complain_on_overflow */
1521          nds32_elf_ignore_reloc,/* special_function */
1522          "R_NDS32_DWARF2_LEB_RELA",     /* name */
1523          FALSE,                 /* partial_inplace */
1524          0xffffffff,            /* src_mask */
1525          0xffffffff,            /* dst_mask */
1526          FALSE),                /* pcrel_offset */
1527   HOWTO (R_NDS32_UPDATE_TA_RELA,/* type */
1528          0,                     /* rightshift */
1529          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1530          16,                    /* bitsize */
1531          FALSE,                 /* pc_relative */
1532          0,                     /* bitpos */
1533          complain_overflow_dont,/* complain_on_overflow */
1534          nds32_elf_ignore_reloc,/* special_function */
1535          "R_NDS32_UPDATE_TA_RELA",      /* name */
1536          FALSE,                 /* partial_inplace */
1537          0xffff,                /* src_mask */
1538          0xffff,                /* dst_mask */
1539          FALSE),                /* pcrel_offset */
1540   /* Like R_NDS32_PCREL, but referring to the procedure linkage table
1541      entry for the symbol.  */
1542   HOWTO (R_NDS32_9_PLTREL,      /* type */
1543          1,                     /* rightshift */
1544          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1545          8,                     /* bitsize */
1546          TRUE,                  /* pc_relative */
1547          0,                     /* bitpos */
1548          complain_overflow_signed,      /* complain_on_overflow */
1549          bfd_elf_generic_reloc, /* special_function */
1550          "R_NDS32_9_PLTREL",    /* name */
1551          FALSE,                 /* partial_inplace */
1552          0xff,                  /* src_mask */
1553          0xff,                  /* dst_mask */
1554          TRUE),                 /* pcrel_offset */
1555   /* Low 20 bits of PLT symbol offset relative to GOT (GP).  */
1556   HOWTO (R_NDS32_PLT_GOTREL_LO20,       /* type */
1557          0,                     /* rightshift */
1558          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1559          20,                    /* bitsize */
1560          FALSE,                 /* pc_relative */
1561          0,                     /* bitpos */
1562          complain_overflow_dont,/* complain_on_overflow */
1563          bfd_elf_generic_reloc, /* special_function */
1564          "R_NDS32_PLT_GOTREL_LO20",     /* name */
1565          FALSE,                 /* partial_inplace */
1566          0x000fffff,            /* src_mask */
1567          0x000fffff,            /* dst_mask */
1568          FALSE),                /* pcrel_offset */
1569   /* low 15 bits of PLT symbol offset relative to GOT (GP) */
1570   HOWTO (R_NDS32_PLT_GOTREL_LO15,       /* type */
1571          0,                     /* rightshift */
1572          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1573          15,                    /* bitsize */
1574          FALSE,                 /* pc_relative */
1575          0,                     /* bitpos */
1576          complain_overflow_dont,/* complain_on_overflow */
1577          bfd_elf_generic_reloc, /* special_function */
1578          "R_NDS32_PLT_GOTREL_LO15",     /* name */
1579          FALSE,                 /* partial_inplace */
1580          0x00007fff,            /* src_mask */
1581          0x00007fff,            /* dst_mask */
1582          FALSE),                /* pcrel_offset */
1583   /* Low 19 bits of PLT symbol offset relative to GOT (GP).  */
1584   HOWTO (R_NDS32_PLT_GOTREL_LO19,       /* type */
1585          0,                     /* rightshift */
1586          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1587          19,                    /* bitsize */
1588          FALSE,                 /* pc_relative */
1589          0,                     /* bitpos */
1590          complain_overflow_dont,/* complain_on_overflow */
1591          bfd_elf_generic_reloc, /* special_function */
1592          "R_NDS32_PLT_GOTREL_LO19",     /* name */
1593          FALSE,                 /* partial_inplace */
1594          0x0007ffff,            /* src_mask */
1595          0x0007ffff,            /* dst_mask */
1596          FALSE),                /* pcrel_offset */
1597   HOWTO (R_NDS32_GOT_LO15,      /* type */
1598          0,                     /* rightshift */
1599          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1600          15,                    /* bitsize */
1601          FALSE,                 /* pc_relative */
1602          0,                     /* bitpos */
1603          complain_overflow_dont,/* complain_on_overflow */
1604          bfd_elf_generic_reloc, /* special_function */
1605          "R_NDS32_GOT_LO15",    /* name */
1606          FALSE,                 /* partial_inplace */
1607          0x00007fff,            /* src_mask */
1608          0x00007fff,            /* dst_mask */
1609          FALSE),                /* pcrel_offset */
1610   HOWTO (R_NDS32_GOT_LO19,      /* type */
1611          0,                     /* rightshift */
1612          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1613          19,                    /* bitsize */
1614          FALSE,                 /* pc_relative */
1615          0,                     /* bitpos */
1616          complain_overflow_dont,/* complain_on_overflow */
1617          bfd_elf_generic_reloc, /* special_function */
1618          "R_NDS32_GOT_LO19",    /* name */
1619          FALSE,                 /* partial_inplace */
1620          0x0007ffff,            /* src_mask */
1621          0x0007ffff,            /* dst_mask */
1622          FALSE),                /* pcrel_offset */
1623   HOWTO (R_NDS32_GOTOFF_LO15,   /* type */
1624          0,                     /* rightshift */
1625          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1626          15,                    /* bitsize */
1627          FALSE,                 /* pc_relative */
1628          0,                     /* bitpos */
1629          complain_overflow_dont,/* complain_on_overflow */
1630          bfd_elf_generic_reloc, /* special_function */
1631          "R_NDS32_GOTOFF_LO15", /* name */
1632          FALSE,                 /* partial_inplace */
1633          0x00007fff,            /* src_mask */
1634          0x00007fff,            /* dst_mask */
1635          FALSE),                /* pcrel_offset */
1636   HOWTO (R_NDS32_GOTOFF_LO19,   /* type */
1637          0,                     /* rightshift */
1638          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1639          19,                    /* bitsize */
1640          FALSE,                 /* pc_relative */
1641          0,                     /* bitpos */
1642          complain_overflow_dont,/* complain_on_overflow */
1643          bfd_elf_generic_reloc, /* special_function */
1644          "R_NDS32_GOTOFF_LO19", /* name */
1645          FALSE,                 /* partial_inplace */
1646          0x0007ffff,            /* src_mask */
1647          0x0007ffff,            /* dst_mask */
1648          FALSE),                /* pcrel_offset */
1649   /* GOT 15 bits offset.  */
1650   HOWTO (R_NDS32_GOT15S2_RELA,  /* type */
1651          2,                     /* rightshift */
1652          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1653          15,                    /* bitsize */
1654          FALSE,                 /* pc_relative */
1655          0,                     /* bitpos */
1656          complain_overflow_signed,      /* complain_on_overflow */
1657          bfd_elf_generic_reloc, /* special_function */
1658          "R_NDS32_GOT15S2_RELA",/* name */
1659          FALSE,                 /* partial_inplace */
1660          0x00007fff,            /* src_mask */
1661          0x00007fff,            /* dst_mask */
1662          FALSE),                /* pcrel_offset */
1663   /* GOT 17 bits offset.  */
1664   HOWTO (R_NDS32_GOT17S2_RELA,  /* type */
1665          2,                     /* rightshift */
1666          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1667          17,                    /* bitsize */
1668          FALSE,                 /* pc_relative */
1669          0,                     /* bitpos */
1670          complain_overflow_signed,      /* complain_on_overflow */
1671          bfd_elf_generic_reloc, /* special_function */
1672          "R_NDS32_GOT17S2_RELA",/* name */
1673          FALSE,                 /* partial_inplace */
1674          0x0001ffff,            /* src_mask */
1675          0x0001ffff,            /* dst_mask */
1676          FALSE),                /* pcrel_offset */
1677   /* A 5 bit address.  */
1678   HOWTO (R_NDS32_5_RELA,        /* type */
1679          0,                     /* rightshift */
1680          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1681          5,                     /* bitsize */
1682          FALSE,                 /* pc_relative */
1683          0,                     /* bitpos */
1684          complain_overflow_signed,      /* complain_on_overflow */
1685          bfd_elf_generic_reloc, /* special_function */
1686          "R_NDS32_5_RELA",      /* name */
1687          FALSE,                 /* partial_inplace */
1688          0x1f,                  /* src_mask */
1689          0x1f,                  /* dst_mask */
1690          FALSE),                /* pcrel_offset */
1691   HOWTO (R_NDS32_10_UPCREL_RELA,/* type */
1692          1,                     /* rightshift */
1693          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1694          9,                     /* bitsize */
1695          TRUE,                  /* pc_relative */
1696          0,                     /* bitpos */
1697          complain_overflow_unsigned,    /* complain_on_overflow */
1698          bfd_elf_generic_reloc, /* special_function */
1699          "R_NDS32_10_UPCREL_RELA",      /* name */
1700          FALSE,                 /* partial_inplace */
1701          0x1ff,                 /* src_mask */
1702          0x1ff,                 /* dst_mask */
1703          TRUE),                 /* pcrel_offset */
1704   HOWTO (R_NDS32_SDA_FP7U2_RELA,/* type */
1705          2,                     /* rightshift */
1706          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1707          7,                     /* bitsize */
1708          FALSE,                 /* pc_relative */
1709          0,                     /* bitpos */
1710          complain_overflow_unsigned,    /* complain_on_overflow */
1711          bfd_elf_generic_reloc, /* special_function */
1712          "R_NDS32_SDA_FP7U2_RELA",      /* name */
1713          FALSE,                 /* partial_inplace */
1714          0x0000007f,            /* src_mask */
1715          0x0000007f,            /* dst_mask */
1716          FALSE),                /* pcrel_offset */
1717   HOWTO (R_NDS32_WORD_9_PCREL_RELA,     /* type */
1718          1,                     /* rightshift */
1719          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1720          8,                     /* bitsize */
1721          TRUE,                  /* pc_relative */
1722          0,                     /* bitpos */
1723          complain_overflow_signed,      /* complain_on_overflow */
1724          bfd_elf_generic_reloc, /* special_function */
1725          "R_NDS32_WORD_9_PCREL_RELA",   /* name */
1726          FALSE,                 /* partial_inplace */
1727          0xff,                  /* src_mask */
1728          0xff,                  /* dst_mask */
1729          TRUE),                 /* pcrel_offset */
1730   HOWTO (R_NDS32_25_ABS_RELA,   /* type */
1731          1,                     /* rightshift */
1732          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1733          24,                    /* bitsize */
1734          FALSE,                 /* pc_relative */
1735          0,                     /* bitpos */
1736          complain_overflow_dont,/* complain_on_overflow */
1737          bfd_elf_generic_reloc, /* special_function */
1738          "R_NDS32_25_ABS_RELA", /* name */
1739          FALSE,                 /* partial_inplace */
1740          0xffffff,              /* src_mask */
1741          0xffffff,              /* dst_mask */
1742          FALSE),                /* pcrel_offset */
1743
1744   /* A relative 17 bit relocation for ifc, right shifted by 1.  */
1745   HOWTO (R_NDS32_17IFC_PCREL_RELA,      /* type */
1746          1,                     /* rightshift */
1747          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1748          16,                    /* bitsize */
1749          TRUE,                  /* pc_relative */
1750          0,                     /* bitpos */
1751          complain_overflow_signed,      /* complain_on_overflow */
1752          bfd_elf_generic_reloc, /* special_function */
1753          "R_NDS32_17IFC_PCREL_RELA",    /* name */
1754          FALSE,                 /* partial_inplace */
1755          0xffff,                /* src_mask */
1756          0xffff,                /* dst_mask */
1757          TRUE),                 /* pcrel_offset */
1758
1759   /* A relative unsigned 10 bit relocation for ifc, right shifted by 1.  */
1760   HOWTO (R_NDS32_10IFCU_PCREL_RELA,     /* type */
1761          1,                     /* rightshift */
1762          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1763          9,                     /* bitsize */
1764          TRUE,                  /* pc_relative */
1765          0,                     /* bitpos */
1766          complain_overflow_unsigned,    /* complain_on_overflow */
1767          bfd_elf_generic_reloc, /* special_function */
1768          "R_NDS32_10IFCU_PCREL_RELA",   /* name */
1769          FALSE,                 /* partial_inplace */
1770          0x1ff,                 /* src_mask */
1771          0x1ff,                 /* dst_mask */
1772          TRUE),                 /* pcrel_offset */
1773
1774   /* Like R_NDS32_HI20, but referring to the TLS entry for the symbol.  */
1775   HOWTO (R_NDS32_TLS_LE_HI20,   /* type */
1776          12,                    /* rightshift */
1777          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1778          20,                    /* bitsize */
1779          FALSE,                 /* pc_relative */
1780          0,                     /* bitpos */
1781          complain_overflow_dont,        /* complain_on_overflow */
1782          bfd_elf_generic_reloc, /* special_function */
1783          "R_NDS32_TLS_LE_HI20", /* name */
1784          FALSE,                 /* partial_inplace */
1785          0x000fffff,            /* src_mask */
1786          0x000fffff,            /* dst_mask */
1787          FALSE),                /* pcrel_offset */
1788   HOWTO (R_NDS32_TLS_LE_LO12,   /* type */
1789          0,                     /* rightshift */
1790          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1791          12,                    /* bitsize */
1792          FALSE,                 /* pc_relative */
1793          0,                     /* bitpos */
1794          complain_overflow_dont,        /* complain_on_overflow */
1795          bfd_elf_generic_reloc, /* special_function */
1796          "R_NDS32_TLS_LE_LO12", /* name */
1797          FALSE,                 /* partial_inplace */
1798          0x00000fff,            /* src_mask */
1799          0x00000fff,            /* dst_mask */
1800          FALSE),                /* pcrel_offset */
1801
1802   /* Like R_NDS32_HI20, but referring to the TLS entry for the symbol.  */
1803   HOWTO (R_NDS32_TLS_IE_HI20,   /* type */
1804          12,                    /* rightshift */
1805          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1806          20,                    /* bitsize */
1807          FALSE,                 /* pc_relative */
1808          0,                     /* bitpos */
1809          complain_overflow_dont,        /* complain_on_overflow */
1810          bfd_elf_generic_reloc, /* special_function */
1811          "R_NDS32_TLS_IE_HI20", /* name */
1812          FALSE,                 /* partial_inplace */
1813          0x000fffff,            /* src_mask */
1814          0x000fffff,            /* dst_mask */
1815          FALSE),                /* pcrel_offset */
1816   HOWTO (R_NDS32_TLS_IE_LO12S2, /* type */
1817          2,                     /* rightshift */
1818          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1819          10,                    /* bitsize */
1820          FALSE,                 /* pc_relative */
1821          0,                     /* bitpos */
1822          complain_overflow_dont,        /* complain_on_overflow */
1823          bfd_elf_generic_reloc, /* special_function */
1824          "R_NDS32_TLS_IE_LO12S2",       /* name */
1825          FALSE,                 /* partial_inplace */
1826          0x000003ff,            /* src_mask */
1827          0x000003ff,            /* dst_mask */
1828          FALSE),                /* pcrel_offset */
1829   /* Mark a TLS IE entry in GOT.  */
1830   HOWTO (R_NDS32_TLS_TPOFF,     /* type */
1831          0,                     /* rightshift */
1832          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1833          32,                    /* bitsize */
1834          FALSE,                 /* pc_relative */
1835          0,                     /* bitpos */
1836          complain_overflow_bitfield,    /* complain_on_overflow */
1837          bfd_elf_generic_reloc, /* special_function */
1838          "R_NDS32_TLS_TPOFF",   /* name */
1839          FALSE,                 /* partial_inplace */
1840          0xffffffff,            /* src_mask */
1841          0xffffffff,            /* dst_mask */
1842          FALSE),                /* pcrel_offset */
1843   /* A 20 bit address.  */
1844   HOWTO (R_NDS32_TLS_LE_20,     /* type */
1845          0,                     /* rightshift */
1846          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1847          20,                    /* bitsize */
1848          FALSE,         /* pc_relative */
1849          0,                     /* bitpos */
1850          complain_overflow_signed,      /* complain_on_overflow */
1851          bfd_elf_generic_reloc, /* special_function */
1852          "R_NDS32_TLS_LE_20",   /* name */
1853          FALSE,         /* partial_inplace */
1854          0xfffff,               /* src_mask */
1855          0xfffff,               /* dst_mask */
1856          FALSE),                /* pcrel_offset */
1857   HOWTO (R_NDS32_TLS_LE_15S0,   /* type */
1858          0,                     /* rightshift */
1859          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1860          15,                    /* bitsize */
1861          FALSE,         /* pc_relative */
1862          0,                     /* bitpos */
1863          complain_overflow_signed,      /* complain_on_overflow */
1864          bfd_elf_generic_reloc, /* special_function */
1865          "R_NDS32_TLS_LE_15S0", /* name */
1866          FALSE,         /* partial_inplace */
1867          0x7fff,                /* src_mask */
1868          0x7fff,                /* dst_mask */
1869          FALSE),                /* pcrel_offset */
1870   HOWTO (R_NDS32_TLS_LE_15S1,   /* type */
1871          1,                     /* rightshift */
1872          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1873          15,                    /* bitsize */
1874          FALSE,         /* pc_relative */
1875          0,                     /* bitpos */
1876          complain_overflow_signed,      /* complain_on_overflow */
1877          bfd_elf_generic_reloc, /* special_function */
1878          "R_NDS32_TLS_LE_15S1", /* name */
1879          FALSE,         /* partial_inplace */
1880          0x7fff,                /* src_mask */
1881          0x7fff,                /* dst_mask */
1882          FALSE),                /* pcrel_offset */
1883   HOWTO (R_NDS32_TLS_LE_15S2,   /* type */
1884          2,                     /* rightshift */
1885          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1886          15,                    /* bitsize */
1887          FALSE,         /* pc_relative */
1888          0,                     /* bitpos */
1889          complain_overflow_signed,      /* complain_on_overflow */
1890          bfd_elf_generic_reloc, /* special_function */
1891          "R_NDS32_TLS_LE_15S2", /* name */
1892          FALSE,         /* partial_inplace */
1893          0x7fff,                /* src_mask */
1894          0x7fff,                /* dst_mask */
1895          FALSE),                /* pcrel_offset */
1896
1897   /* Relax hint for unconditional call sequence  */
1898   HOWTO (R_NDS32_LONGCALL4,     /* type */
1899          0,                     /* rightshift */
1900          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1901          32,                    /* bitsize */
1902          FALSE,                 /* pc_relative */
1903          0,                     /* bitpos */
1904          complain_overflow_dont,        /* complain_on_overflow */
1905          nds32_elf_ignore_reloc,        /* special_function */
1906          "R_NDS32_LONGCALL4",   /* name */
1907          FALSE,                 /* partial_inplace */
1908          0xffffffff,            /* src_mask */
1909          0xffffffff,            /* dst_mask */
1910          FALSE),                /* pcrel_offset */
1911
1912   /* Relax hint for conditional call sequence.  */
1913   HOWTO (R_NDS32_LONGCALL5,     /* type */
1914          0,                     /* rightshift */
1915          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1916          32,                    /* bitsize */
1917          FALSE,                 /* pc_relative */
1918          0,                     /* bitpos */
1919          complain_overflow_dont,        /* complain_on_overflow */
1920          nds32_elf_ignore_reloc,        /* special_function */
1921          "R_NDS32_LONGCALL5",   /* name */
1922          FALSE,                 /* partial_inplace */
1923          0xffffffff,            /* src_mask */
1924          0xffffffff,            /* dst_mask */
1925          FALSE),                /* pcrel_offset */
1926
1927   /* Relax hint for conditional call sequence.  */
1928   HOWTO (R_NDS32_LONGCALL6,     /* type */
1929          0,                     /* rightshift */
1930          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1931          32,                    /* bitsize */
1932          FALSE,                 /* pc_relative */
1933          0,                     /* bitpos */
1934          complain_overflow_dont,        /* complain_on_overflow */
1935          nds32_elf_ignore_reloc,        /* special_function */
1936          "R_NDS32_LONGCALL6",   /* name */
1937          FALSE,                 /* partial_inplace */
1938          0xffffffff,            /* src_mask */
1939          0xffffffff,            /* dst_mask */
1940          FALSE),                /* pcrel_offset */
1941
1942   /* Relax hint for unconditional branch sequence.  */
1943   HOWTO (R_NDS32_LONGJUMP4,     /* type */
1944          0,                     /* rightshift */
1945          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1946          32,                    /* bitsize */
1947          FALSE,                 /* pc_relative */
1948          0,                     /* bitpos */
1949          complain_overflow_dont,        /* complain_on_overflow */
1950          nds32_elf_ignore_reloc,        /* special_function */
1951          "R_NDS32_LONGJUMP4",   /* name */
1952          FALSE,                 /* partial_inplace */
1953          0xffffffff,            /* src_mask */
1954          0xffffffff,            /* dst_mask */
1955          FALSE),                /* pcrel_offset */
1956
1957   /* Relax hint for conditional branch sequence.  */
1958   HOWTO (R_NDS32_LONGJUMP5,     /* type */
1959          0,                     /* rightshift */
1960          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1961          32,                    /* bitsize */
1962          FALSE,                 /* pc_relative */
1963          0,                     /* bitpos */
1964          complain_overflow_dont,        /* complain_on_overflow */
1965          nds32_elf_ignore_reloc,        /* special_function */
1966          "R_NDS32_LONGJUMP5",   /* name */
1967          FALSE,                 /* partial_inplace */
1968          0xffffffff,            /* src_mask */
1969          0xffffffff,            /* dst_mask */
1970          FALSE),                /* pcrel_offset */
1971
1972   /* Relax hint for conditional branch sequence.  */
1973   HOWTO (R_NDS32_LONGJUMP6,     /* type */
1974          0,                     /* rightshift */
1975          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1976          32,                    /* bitsize */
1977          FALSE,                 /* pc_relative */
1978          0,                     /* bitpos */
1979          complain_overflow_dont,        /* complain_on_overflow */
1980          nds32_elf_ignore_reloc,        /* special_function */
1981          "R_NDS32_LONGJUMP6",   /* name */
1982          FALSE,                 /* partial_inplace */
1983          0xffffffff,            /* src_mask */
1984          0xffffffff,            /* dst_mask */
1985          FALSE),                /* pcrel_offset */
1986
1987   /* Relax hint for conditional branch sequence.  */
1988   HOWTO (R_NDS32_LONGJUMP7,     /* type */
1989          0,                     /* rightshift */
1990          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1991          32,                    /* bitsize */
1992          FALSE,                 /* pc_relative */
1993          0,                     /* bitpos */
1994          complain_overflow_dont,        /* complain_on_overflow */
1995          nds32_elf_ignore_reloc,        /* special_function */
1996          "R_NDS32_LONGJUMP7",   /* name */
1997          FALSE,                 /* partial_inplace */
1998          0xffffffff,            /* src_mask */
1999          0xffffffff,            /* dst_mask */
2000          FALSE),                /* pcrel_offset */
2001 };
2002
2003 /* Relocations used for relaxation.  */
2004 static reloc_howto_type nds32_elf_relax_howto_table[] =
2005 {
2006   HOWTO (R_NDS32_RELAX_ENTRY,   /* type */
2007          0,                     /* rightshift */
2008          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2009          32,                    /* bitsize */
2010          FALSE,                 /* pc_relative */
2011          0,                     /* bitpos */
2012          complain_overflow_dont,/* complain_on_overflow */
2013          nds32_elf_ignore_reloc,/* special_function */
2014          "R_NDS32_RELAX_ENTRY", /* name */
2015          FALSE,                 /* partial_inplace */
2016          0xffffffff,            /* src_mask */
2017          0xffffffff,            /* dst_mask */
2018          FALSE),                /* pcrel_offset */
2019   HOWTO (R_NDS32_GOT_SUFF,      /* type */
2020          0,                     /* rightshift */
2021          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2022          32,                    /* bitsize */
2023          FALSE,                 /* pc_relative */
2024          0,                     /* bitpos */
2025          complain_overflow_dont,/* complain_on_overflow */
2026          nds32_elf_ignore_reloc,/* special_function */
2027          "R_NDS32_GOT_SUFF",    /* name */
2028          FALSE,                 /* partial_inplace */
2029          0xffffffff,            /* src_mask */
2030          0xffffffff,            /* dst_mask */
2031          FALSE),                /* pcrel_offset */
2032   HOWTO (R_NDS32_GOTOFF_SUFF,   /* type */
2033          0,                     /* rightshift */
2034          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2035          32,                    /* bitsize */
2036          FALSE,                 /* pc_relative */
2037          0,                     /* bitpos */
2038          complain_overflow_bitfield,    /* complain_on_overflow */
2039          nds32_elf_ignore_reloc,/* special_function */
2040          "R_NDS32_GOTOFF_SUFF", /* name */
2041          FALSE,                 /* partial_inplace */
2042          0xffffffff,            /* src_mask */
2043          0xffffffff,            /* dst_mask */
2044          FALSE),                /* pcrel_offset */
2045   HOWTO (R_NDS32_PLT_GOT_SUFF,  /* type */
2046          0,                     /* rightshift */
2047          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2048          32,                    /* bitsize */
2049          FALSE,                 /* pc_relative */
2050          0,                     /* bitpos */
2051          complain_overflow_dont,/* complain_on_overflow */
2052          nds32_elf_ignore_reloc,/* special_function */
2053          "R_NDS32_PLT_GOT_SUFF",/* name */
2054          FALSE,                 /* partial_inplace */
2055          0xffffffff,            /* src_mask */
2056          0xffffffff,            /* dst_mask */
2057          FALSE),                /* pcrel_offset */
2058   HOWTO (R_NDS32_MULCALL_SUFF,  /* type */
2059          0,                     /* rightshift */
2060          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2061          32,                    /* bitsize */
2062          FALSE,                 /* pc_relative */
2063          0,                     /* bitpos */
2064          complain_overflow_dont,/* complain_on_overflow */
2065          nds32_elf_ignore_reloc,/* special_function */
2066          "R_NDS32_MULCALL_SUFF",/* name */
2067          FALSE,                 /* partial_inplace */
2068          0xffffffff,            /* src_mask */
2069          0xffffffff,            /* dst_mask */
2070          FALSE),                /* pcrel_offset */
2071   HOWTO (R_NDS32_PTR,           /* type */
2072          0,                     /* rightshift */
2073          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2074          32,                    /* bitsize */
2075          FALSE,                 /* pc_relative */
2076          0,                     /* bitpos */
2077          complain_overflow_dont,/* complain_on_overflow */
2078          nds32_elf_ignore_reloc,/* special_function */
2079          "R_NDS32_PTR",         /* name */
2080          FALSE,                 /* partial_inplace */
2081          0xffffffff,            /* src_mask */
2082          0xffffffff,            /* dst_mask */
2083          FALSE),                /* pcrel_offset */
2084   HOWTO (R_NDS32_PTR_COUNT,     /* type */
2085          0,                     /* rightshift */
2086          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2087          32,                    /* bitsize */
2088          FALSE,                 /* pc_relative */
2089          0,                     /* bitpos */
2090          complain_overflow_dont,/* complain_on_overflow */
2091          nds32_elf_ignore_reloc,/* special_function */
2092          "R_NDS32_PTR_COUNT",   /* name */
2093          FALSE,                 /* partial_inplace */
2094          0xffffffff,            /* src_mask */
2095          0xffffffff,            /* dst_mask */
2096          FALSE),                /* pcrel_offset */
2097   HOWTO (R_NDS32_PTR_RESOLVED,  /* type */
2098          0,                     /* rightshift */
2099          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2100          32,                    /* bitsize */
2101          FALSE,                 /* pc_relative */
2102          0,                     /* bitpos */
2103          complain_overflow_dont,/* complain_on_overflow */
2104          nds32_elf_ignore_reloc,/* special_function */
2105          "R_NDS32_PTR_RESOLVED",/* name */
2106          FALSE,                 /* partial_inplace */
2107          0xffffffff,            /* src_mask */
2108          0xffffffff,            /* dst_mask */
2109          FALSE),                /* pcrel_offset */
2110   HOWTO (R_NDS32_PLTBLOCK,      /* type */
2111          0,                     /* rightshift */
2112          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2113          32,                    /* bitsize */
2114          FALSE,                 /* pc_relative */
2115          0,                     /* bitpos */
2116          complain_overflow_dont,/* complain_on_overflow */
2117          nds32_elf_ignore_reloc,/* special_function */
2118          "R_NDS32_PLTBLOCK",    /* name */
2119          FALSE,                 /* partial_inplace */
2120          0xffffffff,            /* src_mask */
2121          0xffffffff,            /* dst_mask */
2122          FALSE),                /* pcrel_offset */
2123   HOWTO (R_NDS32_RELAX_REGION_BEGIN,    /* type */
2124          0,                     /* rightshift */
2125          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2126          32,                    /* bitsize */
2127          FALSE,                 /* pc_relative */
2128          0,                     /* bitpos */
2129          complain_overflow_dont,/* complain_on_overflow */
2130          nds32_elf_ignore_reloc,/* special_function */
2131          "R_NDS32_RELAX_REGION_BEGIN",  /* name */
2132          FALSE,                 /* partial_inplace */
2133          0xffffffff,            /* src_mask */
2134          0xffffffff,            /* dst_mask */
2135          FALSE),                /* pcrel_offset */
2136   HOWTO (R_NDS32_RELAX_REGION_END,      /* type */
2137          0,                     /* rightshift */
2138          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2139          32,                    /* bitsize */
2140          FALSE,                 /* pc_relative */
2141          0,                     /* bitpos */
2142          complain_overflow_dont,/* complain_on_overflow */
2143          nds32_elf_ignore_reloc,/* special_function */
2144          "R_NDS32_RELAX_REGION_END",    /* name */
2145          FALSE,                 /* partial_inplace */
2146          0xffffffff,            /* src_mask */
2147          0xffffffff,            /* dst_mask */
2148          FALSE),                /* pcrel_offset */
2149   HOWTO (R_NDS32_MINUEND,       /* type */
2150          0,                     /* rightshift */
2151          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2152          32,                    /* bitsize */
2153          FALSE,                 /* pc_relative */
2154          0,                     /* bitpos */
2155          complain_overflow_dont,/* complain_on_overflow */
2156          nds32_elf_ignore_reloc,/* special_function */
2157          "R_NDS32_MINUEND",     /* name */
2158          FALSE,                 /* partial_inplace */
2159          0xffffffff,            /* src_mask */
2160          0xffffffff,            /* dst_mask */
2161          FALSE),                /* pcrel_offset */
2162   HOWTO (R_NDS32_SUBTRAHEND,    /* type */
2163          0,                     /* rightshift */
2164          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2165          32,                    /* bitsize */
2166          FALSE,                 /* pc_relative */
2167          0,                     /* bitpos */
2168          complain_overflow_dont,/* complain_on_overflow */
2169          nds32_elf_ignore_reloc,/* special_function */
2170          "R_NDS32_SUBTRAHEND",  /* name */
2171          FALSE,                 /* partial_inplace */
2172          0xffffffff,            /* src_mask */
2173          0xffffffff,            /* dst_mask */
2174          FALSE),                /* pcrel_offset */
2175   HOWTO (R_NDS32_DIFF8,         /* type */
2176          0,                     /* rightshift */
2177          0,                     /* size (0 = byte, 1 = short, 2 = long) */
2178          8,                     /* bitsize */
2179          FALSE,                 /* pc_relative */
2180          0,                     /* bitpos */
2181          complain_overflow_dont,/* complain_on_overflow */
2182          nds32_elf_ignore_reloc,/* special_function */
2183          "R_NDS32_DIFF8",       /* name */
2184          FALSE,                 /* partial_inplace */
2185          0x000000ff,            /* src_mask */
2186          0x000000ff,            /* dst_mask */
2187          FALSE),                /* pcrel_offset */
2188   HOWTO (R_NDS32_DIFF16,        /* type */
2189          0,                     /* rightshift */
2190          1,                     /* size (0 = byte, 1 = short, 2 = long) */
2191          16,                    /* bitsize */
2192          FALSE,                 /* pc_relative */
2193          0,                     /* bitpos */
2194          complain_overflow_dont,/* complain_on_overflow */
2195          nds32_elf_ignore_reloc,/* special_function */
2196          "R_NDS32_DIFF16",      /* name */
2197          FALSE,                 /* partial_inplace */
2198          0x0000ffff,            /* src_mask */
2199          0x0000ffff,            /* dst_mask */
2200          FALSE),                /* pcrel_offset */
2201   HOWTO (R_NDS32_DIFF32,        /* type */
2202          0,                     /* rightshift */
2203          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2204          32,                    /* bitsize */
2205          FALSE,                 /* pc_relative */
2206          0,                     /* bitpos */
2207          complain_overflow_dont,/* complain_on_overflow */
2208          nds32_elf_ignore_reloc,/* special_function */
2209          "R_NDS32_DIFF32",      /* name */
2210          FALSE,                 /* partial_inplace */
2211          0xffffffff,            /* src_mask */
2212          0xffffffff,            /* dst_mask */
2213          FALSE),                /* pcrel_offset */
2214   HOWTO (R_NDS32_DIFF_ULEB128,  /* type */
2215          0,                     /* rightshift */
2216          0,                     /* size (0 = byte, 1 = short, 2 = long) */
2217          0,                     /* bitsize */
2218          FALSE,                 /* pc_relative */
2219          0,                     /* bitpos */
2220          complain_overflow_dont,/* complain_on_overflow */
2221          nds32_elf_ignore_reloc,/* special_function */
2222          "R_NDS32_DIFF_ULEB128",/* name */
2223          FALSE,                 /* partial_inplace */
2224          0xffffffff,            /* src_mask */
2225          0xffffffff,            /* dst_mask */
2226          FALSE),                /* pcrel_offset */
2227   HOWTO (R_NDS32_DATA,          /* type */
2228          0,                     /* rightshift */
2229          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2230          32,                    /* bitsize */
2231          FALSE,                 /* pc_relative */
2232          0,                     /* bitpos */
2233          complain_overflow_dont,/* complain_on_overflow */
2234          nds32_elf_ignore_reloc,/* special_function */
2235          "R_NDS32_DATA",        /* name */
2236          FALSE,                 /* partial_inplace */
2237          0xffffffff,            /* src_mask */
2238          0xffffffff,            /* dst_mask */
2239          FALSE),                /* pcrel_offset */
2240   HOWTO (R_NDS32_TRAN,          /* type */
2241          0,                     /* rightshift */
2242          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2243          32,                    /* bitsize */
2244          FALSE,                 /* pc_relative */
2245          0,                     /* bitpos */
2246          complain_overflow_dont,/* complain_on_overflow */
2247          nds32_elf_ignore_reloc,/* special_function */
2248          "R_NDS32_TRAN",        /* name */
2249          FALSE,                 /* partial_inplace */
2250          0xffffffff,            /* src_mask */
2251          0xffffffff,            /* dst_mask */
2252          FALSE),                /* pcrel_offset */
2253   HOWTO (R_NDS32_TLS_LE_ADD,    /* type */
2254          0,                     /* rightshift */
2255          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2256          32,                    /* bitsize */
2257          FALSE,                 /* pc_relative */
2258          0,                     /* bitpos */
2259          complain_overflow_dont,        /* complain_on_overflow */
2260          nds32_elf_ignore_reloc,        /* special_function */
2261          "R_NDS32_TLS_LE_ADD",  /* name */
2262          FALSE,                 /* partial_inplace */
2263          0xffffffff,            /* src_mask */
2264          0xffffffff,            /* dst_mask */
2265          FALSE),                /* pcrel_offset */
2266   HOWTO (R_NDS32_TLS_LE_LS,     /* type */
2267          0,                     /* rightshift */
2268          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2269          32,                    /* bitsize */
2270          FALSE,                 /* pc_relative */
2271          0,                     /* bitpos */
2272          complain_overflow_dont,        /* complain_on_overflow */
2273          nds32_elf_ignore_reloc,        /* special_function */
2274          "R_NDS32_TLS_LE_LS",   /* name */
2275          FALSE,                 /* partial_inplace */
2276          0xffffffff,            /* src_mask */
2277          0xffffffff,            /* dst_mask */
2278          FALSE),                /* pcrel_offset */
2279   HOWTO (R_NDS32_EMPTY,         /* type */
2280          0,                     /* rightshift */
2281          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2282          32,                    /* bitsize */
2283          FALSE,                 /* pc_relative */
2284          0,                     /* bitpos */
2285          complain_overflow_dont,        /* complain_on_overflow */
2286          nds32_elf_ignore_reloc,        /* special_function */
2287          "R_NDS32_EMPTY",               /* name */
2288          FALSE,                 /* partial_inplace */
2289          0xffffffff,            /* src_mask */
2290          0xffffffff,            /* dst_mask */
2291          FALSE),                /* pcrel_offset */
2292 };
2293
2294 \f
2295 /* nds32_insertion_sort sorts an array with nmemb elements of size size.
2296    This prototype is the same as qsort ().  */
2297
2298 void
2299 nds32_insertion_sort (void *base, size_t nmemb, size_t size,
2300                       int (*compar) (const void *lhs, const void *rhs))
2301 {
2302   char *ptr = (char *) base;
2303   int i, j;
2304   char *tmp = xmalloc (size);
2305
2306   /* If i is less than j, i is inserted before j.
2307
2308      |---- j ----- i --------------|
2309       \          / \              /
2310          sorted         unsorted
2311    */
2312
2313   for (i = 1; i < (int) nmemb; i++)
2314     {
2315       for (j = (i - 1); j >= 0; j--)
2316         if (compar (ptr + i * size, ptr + j * size) >= 0)
2317           break;
2318
2319       j++;
2320
2321       if (i == j)
2322         continue; /* i is in order.  */
2323
2324       memcpy (tmp, ptr + i * size, size);
2325       memmove (ptr + (j + 1) * size, ptr + j * size, (i - j) * size);
2326       memcpy (ptr + j * size, tmp, size);
2327     }
2328   free (tmp);
2329 }
2330
2331 /* Sort relocation by r_offset.
2332
2333    We didn't use qsort () in stdlib, because quick-sort is not a stable sorting
2334    algorithm.  Relocations at the same r_offset must keep their order.
2335    For example, RELAX_ENTRY must be the very first relocation entry.
2336
2337    Currently, this function implements insertion-sort.
2338
2339    FIXME: If we already sort them in assembler, why bother sort them
2340           here again?  */
2341
2342 static int
2343 compar_reloc (const void *lhs, const void *rhs)
2344 {
2345   const Elf_Internal_Rela *l = (const Elf_Internal_Rela *) lhs;
2346   const Elf_Internal_Rela *r = (const Elf_Internal_Rela *) rhs;
2347
2348   if (l->r_offset > r->r_offset)
2349     return 1;
2350   else if (l->r_offset == r->r_offset)
2351     return 0;
2352   else
2353     return -1;
2354 }
2355
2356 /* Functions listed below are only used for old relocs.
2357    * nds32_elf_9_pcrel_reloc
2358    * nds32_elf_do_9_pcrel_reloc
2359    * nds32_elf_hi20_reloc
2360    * nds32_elf_relocate_hi20
2361    * nds32_elf_lo12_reloc
2362    * nds32_elf_sda15_reloc
2363    * nds32_elf_generic_reloc
2364    */
2365
2366 /* Handle the R_NDS32_9_PCREL & R_NDS32_9_PCREL_RELA reloc.  */
2367
2368 static bfd_reloc_status_type
2369 nds32_elf_9_pcrel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2370                          void *data, asection *input_section, bfd *output_bfd,
2371                          char **error_message ATTRIBUTE_UNUSED)
2372 {
2373   /* This part is from bfd_elf_generic_reloc.  */
2374   if (output_bfd != (bfd *) NULL
2375       && (symbol->flags & BSF_SECTION_SYM) == 0
2376       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2377     {
2378       reloc_entry->address += input_section->output_offset;
2379       return bfd_reloc_ok;
2380     }
2381
2382   if (output_bfd != NULL)
2383     {
2384       /* FIXME: See bfd_perform_relocation.  Is this right?  */
2385       return bfd_reloc_continue;
2386     }
2387
2388   return nds32_elf_do_9_pcrel_reloc (abfd, reloc_entry->howto,
2389                                      input_section,
2390                                      data, reloc_entry->address,
2391                                      symbol->section,
2392                                      (symbol->value
2393                                       + symbol->section->output_section->vma
2394                                       + symbol->section->output_offset),
2395                                      reloc_entry->addend);
2396 }
2397
2398 /* Utility to actually perform an R_NDS32_9_PCREL reloc.  */
2399 #define N_ONES(n) (((((bfd_vma) 1 << ((n) - 1)) - 1) << 1) | 1)
2400
2401 static bfd_reloc_status_type
2402 nds32_elf_do_9_pcrel_reloc (bfd *abfd, reloc_howto_type *howto,
2403                             asection *input_section, bfd_byte *data,
2404                             bfd_vma offset,
2405                             asection *symbol_section ATTRIBUTE_UNUSED,
2406                             bfd_vma symbol_value, bfd_vma addend)
2407 {
2408   bfd_signed_vma relocation;
2409   unsigned short x;
2410   bfd_reloc_status_type status;
2411
2412   /* Sanity check the address (offset in section).  */
2413   if (offset > bfd_get_section_limit (abfd, input_section))
2414     return bfd_reloc_outofrange;
2415
2416   relocation = symbol_value + addend;
2417   /* Make it pc relative.  */
2418   relocation -= (input_section->output_section->vma
2419                  + input_section->output_offset);
2420   /* These jumps mask off the lower two bits of the current address
2421      before doing pcrel calculations.  */
2422   relocation -= (offset & -(bfd_vma) 2);
2423
2424   if (relocation < -ACCURATE_8BIT_S1 || relocation >= ACCURATE_8BIT_S1)
2425     status = bfd_reloc_overflow;
2426   else
2427     status = bfd_reloc_ok;
2428
2429   x = bfd_getb16 (data + offset);
2430
2431   relocation >>= howto->rightshift;
2432   relocation <<= howto->bitpos;
2433   x = (x & ~howto->dst_mask)
2434       | (((x & howto->src_mask) + relocation) & howto->dst_mask);
2435
2436   bfd_putb16 ((bfd_vma) x, data + offset);
2437
2438   return status;
2439 }
2440
2441 /* Handle the R_NDS32_HI20_[SU]LO relocs.
2442    HI20_SLO is for the add3 and load/store with displacement instructions.
2443    HI20 is for the or3 instruction.
2444    For R_NDS32_HI20_SLO, the lower 16 bits are sign extended when added to
2445    the high 16 bytes so if the lower 16 bits are negative (bit 15 == 1) then
2446    we must add one to the high 16 bytes (which will get subtracted off when
2447    the low 16 bits are added).
2448    These relocs have to be done in combination with an R_NDS32_LO12 reloc
2449    because there is a carry from the LO12 to the HI20.  Here we just save
2450    the information we need; we do the actual relocation when we see the LO12.
2451    This code is copied from the elf32-mips.c.  We also support an arbitrary
2452    number of HI20 relocs to be associated with a single LO12 reloc.  The
2453    assembler sorts the relocs to ensure each HI20 immediately precedes its
2454    LO12.  However if there are multiple copies, the assembler may not find
2455    the real LO12 so it picks the first one it finds.  */
2456
2457 struct nds32_hi20
2458 {
2459   struct nds32_hi20 *next;
2460   bfd_byte *addr;
2461   bfd_vma addend;
2462 };
2463
2464 static struct nds32_hi20 *nds32_hi20_list;
2465
2466 static bfd_reloc_status_type
2467 nds32_elf_hi20_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2468                       asymbol *symbol, void *data, asection *input_section,
2469                       bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
2470 {
2471   bfd_reloc_status_type ret;
2472   bfd_vma relocation;
2473   struct nds32_hi20 *n;
2474
2475   /* This part is from bfd_elf_generic_reloc.
2476      If we're relocating, and this an external symbol, we don't want
2477      to change anything.  */
2478   if (output_bfd != (bfd *) NULL
2479       && (symbol->flags & BSF_SECTION_SYM) == 0 && reloc_entry->addend == 0)
2480     {
2481       reloc_entry->address += input_section->output_offset;
2482       return bfd_reloc_ok;
2483     }
2484
2485   /* Sanity check the address (offset in section).  */
2486   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2487     return bfd_reloc_outofrange;
2488
2489   ret = bfd_reloc_ok;
2490   if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
2491     ret = bfd_reloc_undefined;
2492
2493   if (bfd_is_com_section (symbol->section))
2494     relocation = 0;
2495   else
2496     relocation = symbol->value;
2497
2498   relocation += symbol->section->output_section->vma;
2499   relocation += symbol->section->output_offset;
2500   relocation += reloc_entry->addend;
2501
2502   /* Save the information, and let LO12 do the actual relocation.  */
2503   n = (struct nds32_hi20 *) bfd_malloc ((bfd_size_type) sizeof *n);
2504   if (n == NULL)
2505     return bfd_reloc_outofrange;
2506
2507   n->addr = (bfd_byte *) data + reloc_entry->address;
2508   n->addend = relocation;
2509   n->next = nds32_hi20_list;
2510   nds32_hi20_list = n;
2511
2512   if (output_bfd != (bfd *) NULL)
2513     reloc_entry->address += input_section->output_offset;
2514
2515   return ret;
2516 }
2517
2518 /* Handle an NDS32 ELF HI20 reloc.  */
2519
2520 static void
2521 nds32_elf_relocate_hi20 (bfd *input_bfd ATTRIBUTE_UNUSED,
2522                          int type ATTRIBUTE_UNUSED, Elf_Internal_Rela *relhi,
2523                          Elf_Internal_Rela *rello, bfd_byte *contents,
2524                          bfd_vma addend)
2525 {
2526   unsigned long insn;
2527   bfd_vma addlo;
2528
2529   insn = bfd_getb32 (contents + relhi->r_offset);
2530
2531   addlo = bfd_getb32 (contents + rello->r_offset);
2532   addlo &= 0xfff;
2533
2534   addend += ((insn & 0xfffff) << 20) + addlo;
2535
2536   insn = (insn & 0xfff00000) | ((addend >> 12) & 0xfffff);
2537   bfd_putb32 (insn, contents + relhi->r_offset);
2538 }
2539
2540 /* Do an R_NDS32_LO12 relocation.  This is a straightforward 12 bit
2541    inplace relocation; this function exists in order to do the
2542    R_NDS32_HI20_[SU]LO relocation described above.  */
2543
2544 static bfd_reloc_status_type
2545 nds32_elf_lo12_reloc (bfd *input_bfd, arelent *reloc_entry, asymbol *symbol,
2546                       void *data, asection *input_section, bfd *output_bfd,
2547                       char **error_message)
2548 {
2549   /* This part is from bfd_elf_generic_reloc.
2550      If we're relocating, and this an external symbol, we don't want
2551      to change anything.  */
2552   if (output_bfd != NULL && (symbol->flags & BSF_SECTION_SYM) == 0
2553       && reloc_entry->addend == 0)
2554     {
2555       reloc_entry->address += input_section->output_offset;
2556       return bfd_reloc_ok;
2557     }
2558
2559   if (nds32_hi20_list != NULL)
2560     {
2561       struct nds32_hi20 *l;
2562
2563       l = nds32_hi20_list;
2564       while (l != NULL)
2565         {
2566           unsigned long insn;
2567           unsigned long val;
2568           unsigned long vallo;
2569           struct nds32_hi20 *next;
2570
2571           /* Do the HI20 relocation.  Note that we actually don't need
2572              to know anything about the LO12 itself, except where to
2573              find the low 12 bits of the addend needed by the LO12.  */
2574           insn = bfd_getb32 (l->addr);
2575           vallo = bfd_getb32 ((bfd_byte *) data + reloc_entry->address);
2576           vallo &= 0xfff;
2577           switch (reloc_entry->howto->type)
2578             {
2579             case R_NDS32_LO12S3:
2580               vallo <<= 3;
2581               break;
2582
2583             case R_NDS32_LO12S2:
2584               vallo <<= 2;
2585               break;
2586
2587             case R_NDS32_LO12S1:
2588               vallo <<= 1;
2589               break;
2590
2591             case R_NDS32_LO12S0:
2592               vallo <<= 0;
2593               break;
2594             }
2595
2596           val = ((insn & 0xfffff) << 12) + vallo;
2597           val += l->addend;
2598
2599           insn = (insn & ~(bfd_vma) 0xfffff) | ((val >> 12) & 0xfffff);
2600           bfd_putb32 ((bfd_vma) insn, l->addr);
2601
2602           next = l->next;
2603           free (l);
2604           l = next;
2605         }
2606
2607       nds32_hi20_list = NULL;
2608     }
2609
2610   /* Now do the LO12 reloc in the usual way.
2611      ??? It would be nice to call bfd_elf_generic_reloc here,
2612      but we have partial_inplace set.  bfd_elf_generic_reloc will
2613      pass the handling back to bfd_install_relocation which will install
2614      a section relative addend which is wrong.  */
2615   return nds32_elf_generic_reloc (input_bfd, reloc_entry, symbol, data,
2616                                   input_section, output_bfd, error_message);
2617 }
2618
2619 /* Do generic partial_inplace relocation.
2620    This is a local replacement for bfd_elf_generic_reloc.  */
2621
2622 static bfd_reloc_status_type
2623 nds32_elf_generic_reloc (bfd *input_bfd, arelent *reloc_entry,
2624                          asymbol *symbol, void *data, asection *input_section,
2625                          bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
2626 {
2627   bfd_reloc_status_type ret;
2628   bfd_vma relocation;
2629   bfd_byte *inplace_address;
2630
2631   /* This part is from bfd_elf_generic_reloc.
2632      If we're relocating, and this an external symbol, we don't want
2633      to change anything.  */
2634   if (output_bfd != NULL && (symbol->flags & BSF_SECTION_SYM) == 0
2635       && reloc_entry->addend == 0)
2636     {
2637       reloc_entry->address += input_section->output_offset;
2638       return bfd_reloc_ok;
2639     }
2640
2641   /* Now do the reloc in the usual way.
2642      ??? It would be nice to call bfd_elf_generic_reloc here,
2643      but we have partial_inplace set.  bfd_elf_generic_reloc will
2644      pass the handling back to bfd_install_relocation which will install
2645      a section relative addend which is wrong.  */
2646
2647   /* Sanity check the address (offset in section).  */
2648   if (reloc_entry->address > bfd_get_section_limit (input_bfd, input_section))
2649     return bfd_reloc_outofrange;
2650
2651   ret = bfd_reloc_ok;
2652   if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
2653     ret = bfd_reloc_undefined;
2654
2655   if (bfd_is_com_section (symbol->section) || output_bfd != (bfd *) NULL)
2656     relocation = 0;
2657   else
2658     relocation = symbol->value;
2659
2660   /* Only do this for a final link.  */
2661   if (output_bfd == (bfd *) NULL)
2662     {
2663       relocation += symbol->section->output_section->vma;
2664       relocation += symbol->section->output_offset;
2665     }
2666
2667   relocation += reloc_entry->addend;
2668   switch (reloc_entry->howto->type)
2669     {
2670     case R_NDS32_LO12S3:
2671       relocation >>= 3;
2672       break;
2673
2674     case R_NDS32_LO12S2:
2675       relocation >>= 2;
2676       break;
2677
2678     case R_NDS32_LO12S1:
2679       relocation >>= 1;
2680       break;
2681
2682     case R_NDS32_LO12S0:
2683     default:
2684       relocation >>= 0;
2685       break;
2686     }
2687
2688   inplace_address = (bfd_byte *) data + reloc_entry->address;
2689
2690 #define DOIT(x)                                         \
2691   x = ((x & ~reloc_entry->howto->dst_mask) |            \
2692   (((x & reloc_entry->howto->src_mask) +  relocation) & \
2693   reloc_entry->howto->dst_mask))
2694
2695   switch (reloc_entry->howto->size)
2696     {
2697     case 1:
2698       {
2699         short x = bfd_getb16 (inplace_address);
2700
2701         DOIT (x);
2702         bfd_putb16 ((bfd_vma) x, inplace_address);
2703       }
2704       break;
2705     case 2:
2706       {
2707         unsigned long x = bfd_getb32 (inplace_address);
2708
2709         DOIT (x);
2710         bfd_putb32 ((bfd_vma) x, inplace_address);
2711       }
2712       break;
2713     default:
2714       BFD_ASSERT (0);
2715     }
2716
2717   if (output_bfd != (bfd *) NULL)
2718     reloc_entry->address += input_section->output_offset;
2719
2720   return ret;
2721 }
2722
2723 /* Handle the R_NDS32_SDA15 reloc.
2724    This reloc is used to compute the address of objects in the small data area
2725    and to perform loads and stores from that area.
2726    The lower 15 bits are sign extended and added to the register specified
2727    in the instruction, which is assumed to point to _SDA_BASE_.
2728
2729    Since the lower 15 bits offset is left-shifted 0, 1 or 2 bits depending on
2730    the access size, this must be taken care of.  */
2731
2732 static bfd_reloc_status_type
2733 nds32_elf_sda15_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2734                        asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2735                        asection *input_section, bfd *output_bfd,
2736                        char **error_message ATTRIBUTE_UNUSED)
2737 {
2738   /* This part is from bfd_elf_generic_reloc.  */
2739   if (output_bfd != (bfd *) NULL
2740       && (symbol->flags & BSF_SECTION_SYM) == 0
2741       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2742     {
2743       reloc_entry->address += input_section->output_offset;
2744       return bfd_reloc_ok;
2745     }
2746
2747   if (output_bfd != NULL)
2748     {
2749       /* FIXME: See bfd_perform_relocation.  Is this right?  */
2750       return bfd_reloc_continue;
2751     }
2752
2753   /* FIXME: not sure what to do here yet.  But then again, the linker
2754      may never call us.  */
2755   abort ();
2756 }
2757
2758 /* nds32_elf_ignore_reloc is the special function for
2759    relocation types which don't need to be relocated
2760    like relaxation relocation types.
2761    This function simply return bfd_reloc_ok when it is
2762    invoked.  */
2763
2764 static bfd_reloc_status_type
2765 nds32_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2766                         asymbol *symbol ATTRIBUTE_UNUSED,
2767                         void *data ATTRIBUTE_UNUSED, asection *input_section,
2768                         bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
2769 {
2770   if (output_bfd != NULL)
2771     reloc_entry->address += input_section->output_offset;
2772
2773   return bfd_reloc_ok;
2774 }
2775 \f
2776
2777 /* Map BFD reloc types to NDS32 ELF reloc types.  */
2778
2779 struct nds32_reloc_map_entry
2780 {
2781   bfd_reloc_code_real_type bfd_reloc_val;
2782   unsigned char elf_reloc_val;
2783 };
2784
2785 static const struct nds32_reloc_map_entry nds32_reloc_map[] =
2786 {
2787   {BFD_RELOC_NONE, R_NDS32_NONE},
2788   {BFD_RELOC_16, R_NDS32_16_RELA},
2789   {BFD_RELOC_32, R_NDS32_32_RELA},
2790   {BFD_RELOC_NDS32_20, R_NDS32_20_RELA},
2791   {BFD_RELOC_NDS32_5, R_NDS32_5_RELA},
2792   {BFD_RELOC_NDS32_9_PCREL, R_NDS32_9_PCREL_RELA},
2793   {BFD_RELOC_NDS32_WORD_9_PCREL, R_NDS32_WORD_9_PCREL_RELA},
2794   {BFD_RELOC_NDS32_15_PCREL, R_NDS32_15_PCREL_RELA},
2795   {BFD_RELOC_NDS32_17_PCREL, R_NDS32_17_PCREL_RELA},
2796   {BFD_RELOC_NDS32_25_PCREL, R_NDS32_25_PCREL_RELA},
2797   {BFD_RELOC_NDS32_10_UPCREL, R_NDS32_10_UPCREL_RELA},
2798   {BFD_RELOC_NDS32_HI20, R_NDS32_HI20_RELA},
2799   {BFD_RELOC_NDS32_LO12S3, R_NDS32_LO12S3_RELA},
2800   {BFD_RELOC_NDS32_LO12S2, R_NDS32_LO12S2_RELA},
2801   {BFD_RELOC_NDS32_LO12S1, R_NDS32_LO12S1_RELA},
2802   {BFD_RELOC_NDS32_LO12S0, R_NDS32_LO12S0_RELA},
2803   {BFD_RELOC_NDS32_LO12S0_ORI, R_NDS32_LO12S0_ORI_RELA},
2804   {BFD_RELOC_NDS32_SDA15S3, R_NDS32_SDA15S3_RELA},
2805   {BFD_RELOC_NDS32_SDA15S2, R_NDS32_SDA15S2_RELA},
2806   {BFD_RELOC_NDS32_SDA15S1, R_NDS32_SDA15S1_RELA},
2807   {BFD_RELOC_NDS32_SDA15S0, R_NDS32_SDA15S0_RELA},
2808   {BFD_RELOC_VTABLE_INHERIT, R_NDS32_RELA_GNU_VTINHERIT},
2809   {BFD_RELOC_VTABLE_ENTRY, R_NDS32_RELA_GNU_VTENTRY},
2810
2811   {BFD_RELOC_NDS32_GOT20, R_NDS32_GOT20},
2812   {BFD_RELOC_NDS32_9_PLTREL, R_NDS32_9_PLTREL},
2813   {BFD_RELOC_NDS32_25_PLTREL, R_NDS32_25_PLTREL},
2814   {BFD_RELOC_NDS32_COPY, R_NDS32_COPY},
2815   {BFD_RELOC_NDS32_GLOB_DAT, R_NDS32_GLOB_DAT},
2816   {BFD_RELOC_NDS32_JMP_SLOT, R_NDS32_JMP_SLOT},
2817   {BFD_RELOC_NDS32_RELATIVE, R_NDS32_RELATIVE},
2818   {BFD_RELOC_NDS32_GOTOFF, R_NDS32_GOTOFF},
2819   {BFD_RELOC_NDS32_GOTPC20, R_NDS32_GOTPC20},
2820   {BFD_RELOC_NDS32_GOT_HI20, R_NDS32_GOT_HI20},
2821   {BFD_RELOC_NDS32_GOT_LO12, R_NDS32_GOT_LO12},
2822   {BFD_RELOC_NDS32_GOT_LO15, R_NDS32_GOT_LO15},
2823   {BFD_RELOC_NDS32_GOT_LO19, R_NDS32_GOT_LO19},
2824   {BFD_RELOC_NDS32_GOTPC_HI20, R_NDS32_GOTPC_HI20},
2825   {BFD_RELOC_NDS32_GOTPC_LO12, R_NDS32_GOTPC_LO12},
2826   {BFD_RELOC_NDS32_GOTOFF_HI20, R_NDS32_GOTOFF_HI20},
2827   {BFD_RELOC_NDS32_GOTOFF_LO12, R_NDS32_GOTOFF_LO12},
2828   {BFD_RELOC_NDS32_GOTOFF_LO15, R_NDS32_GOTOFF_LO15},
2829   {BFD_RELOC_NDS32_GOTOFF_LO19, R_NDS32_GOTOFF_LO19},
2830   {BFD_RELOC_NDS32_INSN16, R_NDS32_INSN16},
2831   {BFD_RELOC_NDS32_LABEL, R_NDS32_LABEL},
2832   {BFD_RELOC_NDS32_LONGCALL1, R_NDS32_LONGCALL1},
2833   {BFD_RELOC_NDS32_LONGCALL2, R_NDS32_LONGCALL2},
2834   {BFD_RELOC_NDS32_LONGCALL3, R_NDS32_LONGCALL3},
2835   {BFD_RELOC_NDS32_LONGCALL4, R_NDS32_LONGCALL4},
2836   {BFD_RELOC_NDS32_LONGCALL5, R_NDS32_LONGCALL5},
2837   {BFD_RELOC_NDS32_LONGCALL6, R_NDS32_LONGCALL6},
2838   {BFD_RELOC_NDS32_LONGJUMP1, R_NDS32_LONGJUMP1},
2839   {BFD_RELOC_NDS32_LONGJUMP2, R_NDS32_LONGJUMP2},
2840   {BFD_RELOC_NDS32_LONGJUMP3, R_NDS32_LONGJUMP3},
2841   {BFD_RELOC_NDS32_LONGJUMP4, R_NDS32_LONGJUMP4},
2842   {BFD_RELOC_NDS32_LONGJUMP5, R_NDS32_LONGJUMP5},
2843   {BFD_RELOC_NDS32_LONGJUMP6, R_NDS32_LONGJUMP6},
2844   {BFD_RELOC_NDS32_LONGJUMP7, R_NDS32_LONGJUMP7},
2845   {BFD_RELOC_NDS32_LOADSTORE, R_NDS32_LOADSTORE},
2846   {BFD_RELOC_NDS32_9_FIXED, R_NDS32_9_FIXED_RELA},
2847   {BFD_RELOC_NDS32_15_FIXED, R_NDS32_15_FIXED_RELA},
2848   {BFD_RELOC_NDS32_17_FIXED, R_NDS32_17_FIXED_RELA},
2849   {BFD_RELOC_NDS32_25_FIXED, R_NDS32_25_FIXED_RELA},
2850   {BFD_RELOC_NDS32_PLTREL_HI20, R_NDS32_PLTREL_HI20},
2851   {BFD_RELOC_NDS32_PLTREL_LO12, R_NDS32_PLTREL_LO12},
2852   {BFD_RELOC_NDS32_PLT_GOTREL_HI20, R_NDS32_PLT_GOTREL_HI20},
2853   {BFD_RELOC_NDS32_PLT_GOTREL_LO12, R_NDS32_PLT_GOTREL_LO12},
2854   {BFD_RELOC_NDS32_PLT_GOTREL_LO15, R_NDS32_PLT_GOTREL_LO15},
2855   {BFD_RELOC_NDS32_PLT_GOTREL_LO19, R_NDS32_PLT_GOTREL_LO19},
2856   {BFD_RELOC_NDS32_PLT_GOTREL_LO20, R_NDS32_PLT_GOTREL_LO20},
2857   {BFD_RELOC_NDS32_SDA12S2_DP, R_NDS32_SDA12S2_DP_RELA},
2858   {BFD_RELOC_NDS32_SDA12S2_SP, R_NDS32_SDA12S2_SP_RELA},
2859   {BFD_RELOC_NDS32_LO12S2_DP, R_NDS32_LO12S2_DP_RELA},
2860   {BFD_RELOC_NDS32_LO12S2_SP, R_NDS32_LO12S2_SP_RELA},
2861   {BFD_RELOC_NDS32_SDA16S3, R_NDS32_SDA16S3_RELA},
2862   {BFD_RELOC_NDS32_SDA17S2, R_NDS32_SDA17S2_RELA},
2863   {BFD_RELOC_NDS32_SDA18S1, R_NDS32_SDA18S1_RELA},
2864   {BFD_RELOC_NDS32_SDA19S0, R_NDS32_SDA19S0_RELA},
2865   {BFD_RELOC_NDS32_SDA_FP7U2_RELA, R_NDS32_SDA_FP7U2_RELA},
2866   {BFD_RELOC_NDS32_DWARF2_OP1, R_NDS32_DWARF2_OP1_RELA},
2867   {BFD_RELOC_NDS32_DWARF2_OP2, R_NDS32_DWARF2_OP2_RELA},
2868   {BFD_RELOC_NDS32_DWARF2_LEB, R_NDS32_DWARF2_LEB_RELA},
2869   {BFD_RELOC_NDS32_UPDATE_TA, R_NDS32_UPDATE_TA_RELA},
2870   {BFD_RELOC_NDS32_GOT_SUFF, R_NDS32_GOT_SUFF},
2871   {BFD_RELOC_NDS32_GOTOFF_SUFF, R_NDS32_GOTOFF_SUFF},
2872   {BFD_RELOC_NDS32_GOT15S2, R_NDS32_GOT15S2_RELA},
2873   {BFD_RELOC_NDS32_GOT17S2, R_NDS32_GOT17S2_RELA},
2874   {BFD_RELOC_NDS32_PTR, R_NDS32_PTR},
2875   {BFD_RELOC_NDS32_PTR_COUNT, R_NDS32_PTR_COUNT},
2876   {BFD_RELOC_NDS32_PLT_GOT_SUFF, R_NDS32_PLT_GOT_SUFF},
2877   {BFD_RELOC_NDS32_PTR_RESOLVED, R_NDS32_PTR_RESOLVED},
2878   {BFD_RELOC_NDS32_RELAX_ENTRY, R_NDS32_RELAX_ENTRY},
2879   {BFD_RELOC_NDS32_MULCALL_SUFF, R_NDS32_MULCALL_SUFF},
2880   {BFD_RELOC_NDS32_PLTBLOCK, R_NDS32_PLTBLOCK},
2881   {BFD_RELOC_NDS32_RELAX_REGION_BEGIN, R_NDS32_RELAX_REGION_BEGIN},
2882   {BFD_RELOC_NDS32_RELAX_REGION_END, R_NDS32_RELAX_REGION_END},
2883   {BFD_RELOC_NDS32_MINUEND, R_NDS32_MINUEND},
2884   {BFD_RELOC_NDS32_SUBTRAHEND, R_NDS32_SUBTRAHEND},
2885   {BFD_RELOC_NDS32_EMPTY, R_NDS32_EMPTY},
2886
2887   {BFD_RELOC_NDS32_DIFF8, R_NDS32_DIFF8},
2888   {BFD_RELOC_NDS32_DIFF16, R_NDS32_DIFF16},
2889   {BFD_RELOC_NDS32_DIFF32, R_NDS32_DIFF32},
2890   {BFD_RELOC_NDS32_DIFF_ULEB128, R_NDS32_DIFF_ULEB128},
2891   {BFD_RELOC_NDS32_25_ABS, R_NDS32_25_ABS_RELA},
2892   {BFD_RELOC_NDS32_DATA, R_NDS32_DATA},
2893   {BFD_RELOC_NDS32_TRAN, R_NDS32_TRAN},
2894   {BFD_RELOC_NDS32_17IFC_PCREL, R_NDS32_17IFC_PCREL_RELA},
2895   {BFD_RELOC_NDS32_10IFCU_PCREL, R_NDS32_10IFCU_PCREL_RELA},
2896   {BFD_RELOC_NDS32_TLS_LE_HI20, R_NDS32_TLS_LE_HI20},
2897   {BFD_RELOC_NDS32_TLS_LE_LO12, R_NDS32_TLS_LE_LO12},
2898   {BFD_RELOC_NDS32_TLS_LE_ADD, R_NDS32_TLS_LE_ADD},
2899   {BFD_RELOC_NDS32_TLS_LE_LS, R_NDS32_TLS_LE_LS},
2900   {BFD_RELOC_NDS32_TLS_IE_HI20, R_NDS32_TLS_IE_HI20},
2901   {BFD_RELOC_NDS32_TLS_IE_LO12S2, R_NDS32_TLS_IE_LO12S2},
2902   {BFD_RELOC_NDS32_TLS_TPOFF, R_NDS32_TLS_TPOFF},
2903   {BFD_RELOC_NDS32_TLS_LE_20, R_NDS32_TLS_LE_20},
2904   {BFD_RELOC_NDS32_TLS_LE_15S0, R_NDS32_TLS_LE_15S0},
2905   {BFD_RELOC_NDS32_TLS_LE_15S1, R_NDS32_TLS_LE_15S1},
2906   {BFD_RELOC_NDS32_TLS_LE_15S2, R_NDS32_TLS_LE_15S2},
2907 };
2908
2909 /* Patch tag.  */
2910
2911 static reloc_howto_type *
2912 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2913                                  const char *r_name)
2914 {
2915   unsigned int i;
2916
2917   for (i = 0; i < ARRAY_SIZE (nds32_elf_howto_table); i++)
2918     if (nds32_elf_howto_table[i].name != NULL
2919         && strcasecmp (nds32_elf_howto_table[i].name, r_name) == 0)
2920       return &nds32_elf_howto_table[i];
2921
2922   for (i = 0; i < ARRAY_SIZE (nds32_elf_relax_howto_table); i++)
2923     if (nds32_elf_relax_howto_table[i].name != NULL
2924         && strcasecmp (nds32_elf_relax_howto_table[i].name, r_name) == 0)
2925       return &nds32_elf_relax_howto_table[i];
2926
2927   return NULL;
2928 }
2929
2930 static reloc_howto_type *
2931 bfd_elf32_bfd_reloc_type_table_lookup (enum elf_nds32_reloc_type code)
2932 {
2933   if (code < R_NDS32_RELAX_ENTRY)
2934     {
2935       BFD_ASSERT (code < ARRAY_SIZE (nds32_elf_howto_table));
2936       return &nds32_elf_howto_table[code];
2937     }
2938   else
2939     {
2940       BFD_ASSERT ((size_t) (code - R_NDS32_RELAX_ENTRY)
2941                   < ARRAY_SIZE (nds32_elf_relax_howto_table));
2942       return &nds32_elf_relax_howto_table[code - R_NDS32_RELAX_ENTRY];
2943     }
2944 }
2945
2946 static reloc_howto_type *
2947 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2948                                  bfd_reloc_code_real_type code)
2949 {
2950   unsigned int i;
2951
2952   for (i = 0; i < ARRAY_SIZE (nds32_reloc_map); i++)
2953     {
2954       if (nds32_reloc_map[i].bfd_reloc_val == code)
2955         return bfd_elf32_bfd_reloc_type_table_lookup
2956                  (nds32_reloc_map[i].elf_reloc_val);
2957     }
2958
2959   return NULL;
2960 }
2961
2962 /* Set the howto pointer for an NDS32 ELF reloc.  */
2963
2964 static void
2965 nds32_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2966                          Elf_Internal_Rela *dst)
2967 {
2968   enum elf_nds32_reloc_type r_type;
2969
2970   r_type = ELF32_R_TYPE (dst->r_info);
2971   if (r_type > R_NDS32_GNU_VTENTRY)
2972     {
2973       /* xgettext:c-format */
2974       _bfd_error_handler (_("%B: invalid NDS32 reloc number: %d"), abfd, r_type);
2975       r_type = 0;
2976     }
2977   cache_ptr->howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
2978 }
2979
2980 static void
2981 nds32_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2982                      Elf_Internal_Rela *dst)
2983 {
2984   BFD_ASSERT ((ELF32_R_TYPE (dst->r_info) == R_NDS32_NONE)
2985               || ((ELF32_R_TYPE (dst->r_info) > R_NDS32_GNU_VTENTRY)
2986                   && (ELF32_R_TYPE (dst->r_info) < R_NDS32_max)));
2987   cache_ptr->howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (dst->r_info));
2988 }
2989
2990 /* Support for core dump NOTE sections.
2991    Reference to include/linux/elfcore.h in Linux.  */
2992
2993 static bfd_boolean
2994 nds32_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2995 {
2996   int offset;
2997   size_t size;
2998
2999   switch (note->descsz)
3000     {
3001     case 0x114:
3002       /* Linux/NDS32 32-bit, ABI1 */
3003
3004       /* pr_cursig */
3005       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3006
3007       /* pr_pid */
3008       elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
3009
3010       /* pr_reg */
3011       offset = 72;
3012       size = 200;
3013       break;
3014
3015     case 0xfc:
3016       /* Linux/NDS32 32-bit */
3017
3018       /* pr_cursig */
3019       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3020
3021       /* pr_pid */
3022       elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
3023
3024       /* pr_reg */
3025       offset = 72;
3026       size = 176;
3027       break;
3028
3029     default:
3030       return FALSE;
3031     }
3032
3033   /* Make a ".reg" section.  */
3034   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3035                                           size, note->descpos + offset);
3036 }
3037
3038 static bfd_boolean
3039 nds32_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3040 {
3041   switch (note->descsz)
3042     {
3043     case 124:
3044       /* Linux/NDS32 */
3045
3046       /* __kernel_uid_t, __kernel_gid_t are short on NDS32 platform.  */
3047       elf_tdata (abfd)->core->program =
3048         _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
3049       elf_tdata (abfd)->core->command =
3050         _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
3051       break;
3052
3053     default:
3054       return FALSE;
3055     }
3056
3057   /* Note that for some reason, a spurious space is tacked
3058      onto the end of the args in some (at least one anyway)
3059      implementations, so strip it off if it exists.  */
3060   {
3061     char *command = elf_tdata (abfd)->core->command;
3062     int n = strlen (command);
3063
3064     if (0 < n && command[n - 1] == ' ')
3065       command[n - 1] = '\0';
3066   }
3067
3068   return TRUE;
3069 }
3070
3071 /* Hook called by the linker routine which adds symbols from an object
3072    file.  We must handle the special NDS32 section numbers here.
3073    We also keep watching for whether we need to create the sdata special
3074    linker sections.  */
3075
3076 static bfd_boolean
3077 nds32_elf_add_symbol_hook (bfd *abfd,
3078                            struct bfd_link_info *info ATTRIBUTE_UNUSED,
3079                            Elf_Internal_Sym *sym,
3080                            const char **namep ATTRIBUTE_UNUSED,
3081                            flagword *flagsp ATTRIBUTE_UNUSED,
3082                            asection **secp, bfd_vma *valp)
3083 {
3084   switch (sym->st_shndx)
3085     {
3086     case SHN_COMMON:
3087       /* Common symbols less than the GP size are automatically
3088          treated as SHN_MIPS_SCOMMON symbols.  */
3089       if (sym->st_size > elf_gp_size (abfd)
3090           || ELF_ST_TYPE (sym->st_info) == STT_TLS)
3091         break;
3092
3093       /* st_value is the alignemnt constraint.
3094          That might be its actual size if it is an array or structure.  */
3095       switch (sym->st_value)
3096         {
3097         case 1:
3098           *secp = bfd_make_section_old_way (abfd, ".scommon_b");
3099           break;
3100         case 2:
3101           *secp = bfd_make_section_old_way (abfd, ".scommon_h");
3102           break;
3103         case 4:
3104           *secp = bfd_make_section_old_way (abfd, ".scommon_w");
3105           break;
3106         case 8:
3107           *secp = bfd_make_section_old_way (abfd, ".scommon_d");
3108           break;
3109         default:
3110           return TRUE;
3111         }
3112
3113       (*secp)->flags |= SEC_IS_COMMON;
3114       *valp = sym->st_size;
3115       break;
3116     }
3117
3118   return TRUE;
3119 }
3120
3121
3122 /* This function can figure out the best location for a base register to access
3123    data relative to this base register
3124    INPUT:
3125    sda_d0: size of first DOUBLE WORD data section
3126    sda_w0: size of first WORD data section
3127    sda_h0: size of first HALF WORD data section
3128    sda_b : size of BYTE data section
3129    sda_hi: size of second HALF WORD data section
3130    sda_w1: size of second WORD data section
3131    sda_d1: size of second DOUBLE WORD data section
3132    OUTPUT:
3133    offset (always positive) from the beginning of sda_d0 if OK
3134    a negative error value if fail
3135    NOTE:
3136    these 7 sections have to be located back to back if exist
3137    a pass in 0 value for non-existing section   */
3138
3139 /* Due to the interpretation of simm15 field of load/store depending on
3140    data accessing size, the organization of base register relative data shall
3141    like the following figure
3142    -------------------------------------------
3143    |  DOUBLE WORD sized data (range +/- 128K)
3144    -------------------------------------------
3145    |  WORD sized data (range +/- 64K)
3146    -------------------------------------------
3147    |  HALF WORD sized data (range +/- 32K)
3148    -------------------------------------------
3149    |  BYTE sized data (range +/- 16K)
3150    -------------------------------------------
3151    |  HALF WORD sized data (range +/- 32K)
3152    -------------------------------------------
3153    |  WORD sized data (range +/- 64K)
3154    -------------------------------------------
3155    |  DOUBLE WORD sized data (range +/- 128K)
3156    -------------------------------------------
3157    Its base register shall be set to access these data freely.  */
3158
3159 /* We have to figure out the SDA_BASE value, so that we can adjust the
3160    symbol value correctly.  We look up the symbol _SDA_BASE_ in the output
3161    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
3162    target data.  We don't need to adjust the symbol value for an
3163    external symbol if we are producing relocatable output.  */
3164
3165 static asection *sda_rela_sec = NULL;
3166
3167 #define SDA_SECTION_NUM 10
3168
3169 static bfd_reloc_status_type
3170 nds32_elf_final_sda_base (bfd *output_bfd, struct bfd_link_info *info,
3171                           bfd_vma *psb, bfd_boolean add_symbol)
3172 {
3173   int relax_fp_as_gp;
3174   struct elf_nds32_link_hash_table *table;
3175   struct bfd_link_hash_entry *h, *h2;
3176   long unsigned int total = 0;
3177
3178   h = bfd_link_hash_lookup (info->hash, "_SDA_BASE_", FALSE, FALSE, TRUE);
3179   if (!h || (h->type != bfd_link_hash_defined && h->type != bfd_link_hash_defweak))
3180     {
3181       asection *first = NULL, *final = NULL, *temp;
3182       bfd_vma sda_base;
3183       /* The first section must be 4-byte aligned to promise _SDA_BASE_ being
3184          4 byte-aligned.  Therefore, it has to set the first section ".data"
3185          4 byte-aligned.  */
3186       static const char sec_name[SDA_SECTION_NUM][10] =
3187         {
3188           ".data", ".got", ".sdata_d", ".sdata_w", ".sdata_h", ".sdata_b",
3189           ".sbss_b", ".sbss_h", ".sbss_w", ".sbss_d"
3190         };
3191       size_t i = 0;
3192
3193       if (output_bfd->sections == NULL)
3194         {
3195           *psb = elf_gp (output_bfd);
3196           return bfd_reloc_ok;
3197         }
3198
3199       /* Get the first and final section.  */
3200       while (i < sizeof (sec_name) / sizeof (sec_name [0]))
3201         {
3202           temp = bfd_get_section_by_name (output_bfd, sec_name[i]);
3203           if (temp && !first && (temp->size != 0 || temp->rawsize != 0))
3204             first = temp;
3205           if (temp && (temp->size != 0 || temp->rawsize != 0))
3206             final = temp;
3207
3208           /* Summarize the sections in order to check if joining .bss.  */
3209           if (temp && temp->size != 0)
3210             total += temp->size;
3211           else if (temp && temp->rawsize != 0)
3212             total += temp->rawsize;
3213
3214           i++;
3215         }
3216
3217       /* Check .bss size.  */
3218       temp = bfd_get_section_by_name (output_bfd, ".bss");
3219       if (temp)
3220         {
3221           if (temp->size != 0)
3222             total += temp->size;
3223           else if (temp->rawsize != 0)
3224             total += temp->rawsize;
3225
3226           if (total < 0x80000)
3227             {
3228               if (!first && (temp->size != 0 || temp->rawsize != 0))
3229                 first = temp;
3230               if ((temp->size != 0 || temp->rawsize != 0))
3231                 final = temp;
3232             }
3233         }
3234
3235       if (first && final)
3236         {
3237           /* The middle of data region.  */
3238           sda_base = final->vma / 2 + final->rawsize / 2 + first->vma / 2;
3239
3240           /* Find the section sda_base located.  */
3241           i = 0;
3242           while (i < sizeof (sec_name) / sizeof (sec_name [0]))
3243             {
3244               final = bfd_get_section_by_name (output_bfd, sec_name[i]);
3245               if (final && (final->size != 0 || final->rawsize != 0)
3246                   && sda_base >= final->vma)
3247                 {
3248                   first = final;
3249                   i++;
3250                 }
3251               else
3252                 break;
3253             }
3254         }
3255       else
3256         {
3257           /* There is not any data section in output bfd, and set _SDA_BASE_ in
3258              first output section.  */
3259           first = output_bfd->sections;
3260           while (first && first->size == 0 && first->rawsize == 0)
3261             first = first->next;
3262           if (!first)
3263             {
3264               *psb = elf_gp (output_bfd);
3265               return bfd_reloc_ok;
3266             }
3267           sda_base = first->vma + first->rawsize;
3268         }
3269
3270       sda_base -= first->vma;
3271       sda_base = sda_base & (~7);
3272
3273       if (!_bfd_generic_link_add_one_symbol
3274              (info, output_bfd, "_SDA_BASE_", BSF_GLOBAL | BSF_WEAK, first,
3275               (bfd_vma) sda_base, (const char *) NULL, FALSE,
3276               get_elf_backend_data (output_bfd)->collect, &h))
3277         return FALSE;
3278
3279       sda_rela_sec = first;
3280
3281       table = nds32_elf_hash_table (info);
3282       relax_fp_as_gp = table->relax_fp_as_gp;
3283       if (relax_fp_as_gp)
3284         {
3285           h2 = bfd_link_hash_lookup (info->hash, FP_BASE_NAME,
3286                                      FALSE, FALSE, FALSE);
3287           /* Define a weak FP_BASE_NAME here to prevent the undefined symbol.
3288              And set FP equal to SDA_BASE to do relaxation for
3289              la $fp, _FP_BASE_.  */
3290           if (!_bfd_generic_link_add_one_symbol
3291                  (info, output_bfd, FP_BASE_NAME, BSF_GLOBAL | BSF_WEAK,
3292                   first, (bfd_vma) sda_base, (const char *) NULL,
3293                   FALSE, get_elf_backend_data (output_bfd)->collect, &h2))
3294             return FALSE;
3295         }
3296     }
3297
3298   if (add_symbol == TRUE)
3299     {
3300       if (h)
3301         {
3302           /* Now set gp.  */
3303           elf_gp (output_bfd) = (h->u.def.value
3304                                  + h->u.def.section->output_section->vma
3305                                  + h->u.def.section->output_offset);
3306         }
3307       else
3308         {
3309           _bfd_error_handler (_("error: Can't find symbol: _SDA_BASE_."));
3310           return bfd_reloc_dangerous;
3311         }
3312     }
3313
3314   *psb = h->u.def.value + h->u.def.section->output_section->vma
3315          + h->u.def.section->output_offset;
3316   return bfd_reloc_ok;
3317 }
3318 \f
3319
3320 /* Return size of a PLT entry.  */
3321 #define elf_nds32_sizeof_plt(info) PLT_ENTRY_SIZE
3322
3323
3324 /* Create an entry in an nds32 ELF linker hash table.  */
3325
3326 static struct bfd_hash_entry *
3327 nds32_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
3328                              struct bfd_hash_table *table,
3329                              const char *string)
3330 {
3331   struct elf_nds32_link_hash_entry *ret;
3332
3333   ret = (struct elf_nds32_link_hash_entry *) entry;
3334
3335   /* Allocate the structure if it has not already been allocated by a
3336      subclass.  */
3337   if (ret == NULL)
3338     ret = (struct elf_nds32_link_hash_entry *)
3339        bfd_hash_allocate (table, sizeof (struct elf_nds32_link_hash_entry));
3340
3341   if (ret == NULL)
3342     return (struct bfd_hash_entry *) ret;
3343
3344   /* Call the allocation method of the superclass.  */
3345   ret = (struct elf_nds32_link_hash_entry *)
3346     _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, table, string);
3347
3348   if (ret != NULL)
3349     {
3350       struct elf_nds32_link_hash_entry *eh;
3351
3352       eh = (struct elf_nds32_link_hash_entry *) ret;
3353       eh->dyn_relocs = NULL;
3354       eh->tls_type = GOT_UNKNOWN;
3355     }
3356
3357   return (struct bfd_hash_entry *) ret;
3358 }
3359
3360 /* Create an nds32 ELF linker hash table.  */
3361
3362 static struct bfd_link_hash_table *
3363 nds32_elf_link_hash_table_create (bfd *abfd)
3364 {
3365   struct elf_nds32_link_hash_table *ret;
3366
3367   bfd_size_type amt = sizeof (struct elf_nds32_link_hash_table);
3368
3369   ret = (struct elf_nds32_link_hash_table *) bfd_zmalloc (amt);
3370   if (ret == NULL)
3371     return NULL;
3372
3373   /* patch tag.  */
3374   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
3375                                       nds32_elf_link_hash_newfunc,
3376                                       sizeof (struct elf_nds32_link_hash_entry),
3377                                       NDS32_ELF_DATA))
3378     {
3379       free (ret);
3380       return NULL;
3381     }
3382
3383   return &ret->root.root;
3384 }
3385
3386 /* Create dynamic sections when linking against a dynamic object.  */
3387
3388 static bfd_boolean
3389 nds32_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
3390 {
3391   struct elf_nds32_link_hash_table *htab;
3392   flagword flags, pltflags;
3393   register asection *s;
3394   const struct elf_backend_data *bed;
3395   int ptralign = 2;             /* 32-bit  */
3396
3397   bed = get_elf_backend_data (abfd);
3398
3399   htab = nds32_elf_hash_table (info);
3400
3401   /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3402      .rel[a].bss sections.  */
3403
3404   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3405            | SEC_LINKER_CREATED);
3406
3407   pltflags = flags;
3408   pltflags |= SEC_CODE;
3409   if (bed->plt_not_loaded)
3410     pltflags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
3411   if (bed->plt_readonly)
3412     pltflags |= SEC_READONLY;
3413
3414   s = bfd_make_section (abfd, ".plt");
3415   htab->root.splt = s;
3416   if (s == NULL
3417       || !bfd_set_section_flags (abfd, s, pltflags)
3418       || !bfd_set_section_alignment (abfd, s, bed->plt_alignment))
3419     return FALSE;
3420
3421   if (bed->want_plt_sym)
3422     {
3423       /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3424          .plt section.  */
3425       struct bfd_link_hash_entry *bh = NULL;
3426       struct elf_link_hash_entry *h;
3427
3428       if (!(_bfd_generic_link_add_one_symbol
3429             (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
3430              (bfd_vma) 0, (const char *) NULL, FALSE,
3431              get_elf_backend_data (abfd)->collect, &bh)))
3432         return FALSE;
3433
3434       h = (struct elf_link_hash_entry *) bh;
3435       h->def_regular = 1;
3436       h->type = STT_OBJECT;
3437
3438       if (bfd_link_pic (info) && !bfd_elf_link_record_dynamic_symbol (info, h))
3439         return FALSE;
3440     }
3441
3442   s = bfd_make_section (abfd,
3443                         bed->default_use_rela_p ? ".rela.plt" : ".rel.plt");
3444   htab->root.srelplt = s;
3445   if (s == NULL
3446       || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
3447       || !bfd_set_section_alignment (abfd, s, ptralign))
3448     return FALSE;
3449
3450   if (htab->root.sgot == NULL && !_bfd_elf_create_got_section (abfd, info))
3451     return FALSE;
3452
3453   {
3454     const char *secname;
3455     char *relname;
3456     flagword secflags;
3457     asection *sec;
3458
3459     for (sec = abfd->sections; sec; sec = sec->next)
3460       {
3461         secflags = bfd_get_section_flags (abfd, sec);
3462         if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
3463             || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
3464           continue;
3465         secname = bfd_get_section_name (abfd, sec);
3466         relname = (char *) bfd_malloc ((bfd_size_type) strlen (secname) + 6);
3467         strcpy (relname, ".rela");
3468         strcat (relname, secname);
3469         if (bfd_get_section_by_name (abfd, secname))
3470           continue;
3471         s = bfd_make_section (abfd, relname);
3472         if (s == NULL
3473             || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
3474             || !bfd_set_section_alignment (abfd, s, ptralign))
3475           return FALSE;
3476       }
3477   }
3478
3479   if (bed->want_dynbss)
3480     {
3481       /* The .dynbss section is a place to put symbols which are defined
3482          by dynamic objects, are referenced by regular objects, and are
3483          not functions.  We must allocate space for them in the process
3484          image and use a R_*_COPY reloc to tell the dynamic linker to
3485          initialize them at run time.  The linker script puts the .dynbss
3486          section into the .bss section of the final image.  */
3487       s = bfd_make_section (abfd, ".dynbss");
3488       htab->sdynbss = s;
3489       if (s == NULL
3490           || !bfd_set_section_flags (abfd, s, SEC_ALLOC | SEC_LINKER_CREATED))
3491         return FALSE;
3492       /* The .rel[a].bss section holds copy relocs.  This section is not
3493          normally needed.  We need to create it here, though, so that the
3494          linker will map it to an output section.  We can't just create it
3495          only if we need it, because we will not know whether we need it
3496          until we have seen all the input files, and the first time the
3497          main linker code calls BFD after examining all the input files
3498          (size_dynamic_sections) the input sections have already been
3499          mapped to the output sections.  If the section turns out not to
3500          be needed, we can discard it later.  We will never need this
3501          section when generating a shared object, since they do not use
3502          copy relocs.  */
3503       if (!bfd_link_pic (info))
3504         {
3505           s = bfd_make_section (abfd, (bed->default_use_rela_p
3506                                        ? ".rela.bss" : ".rel.bss"));
3507           htab->srelbss = s;
3508           if (s == NULL
3509               || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
3510               || !bfd_set_section_alignment (abfd, s, ptralign))
3511             return FALSE;
3512         }
3513     }
3514
3515   return TRUE;
3516 }
3517
3518 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
3519 static void
3520 nds32_elf_copy_indirect_symbol (struct bfd_link_info *info,
3521                                 struct elf_link_hash_entry *dir,
3522                                 struct elf_link_hash_entry *ind)
3523 {
3524   struct elf_nds32_link_hash_entry *edir, *eind;
3525
3526   edir = (struct elf_nds32_link_hash_entry *) dir;
3527   eind = (struct elf_nds32_link_hash_entry *) ind;
3528
3529   if (eind->dyn_relocs != NULL)
3530     {
3531       if (edir->dyn_relocs != NULL)
3532         {
3533           struct elf_nds32_dyn_relocs **pp;
3534           struct elf_nds32_dyn_relocs *p;
3535
3536           if (ind->root.type == bfd_link_hash_indirect)
3537             abort ();
3538
3539           /* Add reloc counts against the weak sym to the strong sym
3540              list.  Merge any entries against the same section.  */
3541           for (pp = &eind->dyn_relocs; (p = *pp) != NULL;)
3542             {
3543               struct elf_nds32_dyn_relocs *q;
3544
3545               for (q = edir->dyn_relocs; q != NULL; q = q->next)
3546                 if (q->sec == p->sec)
3547                   {
3548                     q->pc_count += p->pc_count;
3549                     q->count += p->count;
3550                     *pp = p->next;
3551                     break;
3552                   }
3553               if (q == NULL)
3554                 pp = &p->next;
3555             }
3556           *pp = edir->dyn_relocs;
3557         }
3558
3559       edir->dyn_relocs = eind->dyn_relocs;
3560       eind->dyn_relocs = NULL;
3561     }
3562
3563   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3564 }
3565 \f
3566
3567 /* Adjust a symbol defined by a dynamic object and referenced by a
3568    regular object.  The current definition is in some section of the
3569    dynamic object, but we're not including those sections.  We have to
3570    change the definition to something the rest of the link can
3571    understand.  */
3572
3573 static bfd_boolean
3574 nds32_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
3575                                  struct elf_link_hash_entry *h)
3576 {
3577   struct elf_nds32_link_hash_table *htab;
3578   struct elf_nds32_link_hash_entry *eh;
3579   struct elf_nds32_dyn_relocs *p;
3580   bfd *dynobj;
3581   asection *s;
3582   unsigned int power_of_two;
3583
3584   dynobj = elf_hash_table (info)->dynobj;
3585
3586   /* Make sure we know what is going on here.  */
3587   BFD_ASSERT (dynobj != NULL
3588               && (h->needs_plt
3589                   || h->u.weakdef != NULL
3590                   || (h->def_dynamic && h->ref_regular && !h->def_regular)));
3591
3592
3593   /* If this is a function, put it in the procedure linkage table.  We
3594      will fill in the contents of the procedure linkage table later,
3595      when we know the address of the .got section.  */
3596   if (h->type == STT_FUNC || h->needs_plt)
3597     {
3598       if (!bfd_link_pic (info)
3599           && !h->def_dynamic
3600           && !h->ref_dynamic
3601           && h->root.type != bfd_link_hash_undefweak
3602           && h->root.type != bfd_link_hash_undefined)
3603         {
3604           /* This case can occur if we saw a PLT reloc in an input
3605              file, but the symbol was never referred to by a dynamic
3606              object.  In such a case, we don't actually need to build
3607              a procedure linkage table, and we can just do a PCREL
3608              reloc instead.  */
3609           h->plt.offset = (bfd_vma) - 1;
3610           h->needs_plt = 0;
3611         }
3612
3613       return TRUE;
3614     }
3615   else
3616     h->plt.offset = (bfd_vma) - 1;
3617
3618   /* If this is a weak symbol, and there is a real definition, the
3619      processor independent code will have arranged for us to see the
3620      real definition first, and we can just use the same value.  */
3621   if (h->u.weakdef != NULL)
3622     {
3623       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
3624                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
3625       h->root.u.def.section = h->u.weakdef->root.u.def.section;
3626       h->root.u.def.value = h->u.weakdef->root.u.def.value;
3627       return TRUE;
3628     }
3629
3630   /* This is a reference to a symbol defined by a dynamic object which
3631      is not a function.  */
3632
3633   /* If we are creating a shared library, we must presume that the
3634      only references to the symbol are via the global offset table.
3635      For such cases we need not do anything here; the relocations will
3636      be handled correctly by relocate_section.  */
3637   if (bfd_link_pic (info))
3638     return TRUE;
3639
3640   /* If there are no references to this symbol that do not use the
3641      GOT, we don't need to generate a copy reloc.  */
3642   if (!h->non_got_ref)
3643     return TRUE;
3644
3645   /* If -z nocopyreloc was given, we won't generate them either.  */
3646   if (info->nocopyreloc)
3647     {
3648       h->non_got_ref = 0;
3649       return TRUE;
3650     }
3651
3652   eh = (struct elf_nds32_link_hash_entry *) h;
3653   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3654     {
3655       s = p->sec->output_section;
3656       if (s != NULL && (s->flags & (SEC_READONLY | SEC_HAS_CONTENTS)) != 0)
3657         break;
3658     }
3659
3660   /* If we didn't find any dynamic relocs in sections which needs the
3661      copy reloc, then we'll be keeping the dynamic relocs and avoiding
3662      the copy reloc.  */
3663   if (p == NULL)
3664     {
3665       h->non_got_ref = 0;
3666       return TRUE;
3667     }
3668
3669   /* We must allocate the symbol in our .dynbss section, which will
3670      become part of the .bss section of the executable.  There will be
3671      an entry for this symbol in the .dynsym section.  The dynamic
3672      object will contain position independent code, so all references
3673      from the dynamic object to this symbol will go through the global
3674      offset table.  The dynamic linker will use the .dynsym entry to
3675      determine the address it must put in the global offset table, so
3676      both the dynamic object and the regular object will refer to the
3677      same memory location for the variable.  */
3678
3679   htab = nds32_elf_hash_table (info);
3680   s = htab->sdynbss;
3681   BFD_ASSERT (s != NULL);
3682
3683   /* We must generate a R_NDS32_COPY reloc to tell the dynamic linker
3684      to copy the initial value out of the dynamic object and into the
3685      runtime process image.  We need to remember the offset into the
3686      .rela.bss section we are going to use.  */
3687   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
3688     {
3689       asection *srel;
3690
3691       srel = htab->srelbss;
3692       BFD_ASSERT (srel != NULL);
3693       srel->size += sizeof (Elf32_External_Rela);
3694       h->needs_copy = 1;
3695     }
3696
3697   /* We need to figure out the alignment required for this symbol.  I
3698      have no idea how ELF linkers handle this.  */
3699   power_of_two = bfd_log2 (h->size);
3700   if (power_of_two > 3)
3701     power_of_two = 3;
3702
3703   /* Apply the required alignment.  */
3704   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
3705   if (power_of_two > bfd_get_section_alignment (dynobj, s))
3706     {
3707       if (!bfd_set_section_alignment (dynobj, s, power_of_two))
3708         return FALSE;
3709     }
3710
3711   /* Define the symbol as being at this point in the section.  */
3712   h->root.u.def.section = s;
3713   h->root.u.def.value = s->size;
3714
3715   /* Increment the section size to make room for the symbol.  */
3716   s->size += h->size;
3717
3718   return TRUE;
3719 }
3720
3721 /* Allocate space in .plt, .got and associated reloc sections for
3722    dynamic relocs.  */
3723
3724 static bfd_boolean
3725 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3726 {
3727   struct bfd_link_info *info;
3728   struct elf_nds32_link_hash_table *htab;
3729   struct elf_nds32_link_hash_entry *eh;
3730   struct elf_nds32_dyn_relocs *p;
3731
3732   if (h->root.type == bfd_link_hash_indirect)
3733     return TRUE;
3734
3735   if (h->root.type == bfd_link_hash_warning)
3736     /* When warning symbols are created, they **replace** the "real"
3737        entry in the hash table, thus we never get to see the real
3738        symbol in a hash traversal.  So look at it now.  */
3739     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3740
3741   info = (struct bfd_link_info *) inf;
3742   htab = nds32_elf_hash_table (info);
3743
3744   eh = (struct elf_nds32_link_hash_entry *) h;
3745
3746   if (htab->root.dynamic_sections_created && h->plt.refcount > 0)
3747     {
3748       /* Make sure this symbol is output as a dynamic symbol.
3749          Undefined weak syms won't yet be marked as dynamic.  */
3750       if (h->dynindx == -1 && !h->forced_local)
3751         {
3752           if (!bfd_elf_link_record_dynamic_symbol (info, h))
3753             return FALSE;
3754         }
3755
3756       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
3757         {
3758           asection *s = htab->root.splt;
3759
3760           /* If this is the first .plt entry, make room for the special
3761              first entry.  */
3762           if (s->size == 0)
3763             s->size += PLT_ENTRY_SIZE;
3764
3765           h->plt.offset = s->size;
3766
3767           /* If this symbol is not defined in a regular file, and we are
3768              not generating a shared library, then set the symbol to this
3769              location in the .plt.  This is required to make function
3770              pointers compare as equal between the normal executable and
3771              the shared library.  */
3772           if (!bfd_link_pic (info) && !h->def_regular)
3773             {
3774               h->root.u.def.section = s;
3775               h->root.u.def.value = h->plt.offset;
3776             }
3777
3778           /* Make room for this entry.  */
3779           s->size += PLT_ENTRY_SIZE;
3780
3781           /* We also need to make an entry in the .got.plt section, which
3782              will be placed in the .got section by the linker script.  */
3783           htab->root.sgotplt->size += 4;
3784
3785           /* We also need to make an entry in the .rel.plt section.  */
3786           htab->root.srelplt->size += sizeof (Elf32_External_Rela);
3787         }
3788       else
3789         {
3790           h->plt.offset = (bfd_vma) - 1;
3791           h->needs_plt = 0;
3792         }
3793     }
3794   else
3795     {
3796       h->plt.offset = (bfd_vma) - 1;
3797       h->needs_plt = 0;
3798     }
3799
3800   if (h->got.refcount > 0)
3801     {
3802       asection *s;
3803       bfd_boolean dyn;
3804       int tls_type = elf32_nds32_hash_entry (h)->tls_type;
3805
3806       /* Make sure this symbol is output as a dynamic symbol.
3807          Undefined weak syms won't yet be marked as dynamic.  */
3808       if (h->dynindx == -1 && !h->forced_local)
3809         {
3810           if (!bfd_elf_link_record_dynamic_symbol (info, h))
3811             return FALSE;
3812         }
3813
3814       s = htab->root.sgot;
3815       h->got.offset = s->size;
3816
3817       if (tls_type == GOT_UNKNOWN)
3818         abort ();
3819       else if (tls_type == GOT_NORMAL
3820                || tls_type == GOT_TLS_IE)
3821         /* Need a GOT slot.  */
3822         s->size += 4;
3823
3824       dyn = htab->root.dynamic_sections_created;
3825       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
3826         htab->root.srelgot->size += sizeof (Elf32_External_Rela);
3827     }
3828   else
3829     h->got.offset = (bfd_vma) - 1;
3830
3831   if (eh->dyn_relocs == NULL)
3832     return TRUE;
3833
3834   /* In the shared -Bsymbolic case, discard space allocated for
3835      dynamic pc-relative relocs against symbols which turn out to be
3836      defined in regular objects.  For the normal shared case, discard
3837      space for pc-relative relocs that have become local due to symbol
3838      visibility changes.  */
3839
3840   if (bfd_link_pic (info))
3841     {
3842       if (h->def_regular && (h->forced_local || info->symbolic))
3843         {
3844           struct elf_nds32_dyn_relocs **pp;
3845
3846           for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
3847             {
3848               p->count -= p->pc_count;
3849               p->pc_count = 0;
3850               if (p->count == 0)
3851                 *pp = p->next;
3852               else
3853                 pp = &p->next;
3854             }
3855         }
3856     }
3857   else
3858     {
3859       /* For the non-shared case, discard space for relocs against
3860          symbols which turn out to need copy relocs or are not dynamic.  */
3861
3862       if (!h->non_got_ref
3863           && ((h->def_dynamic
3864                && !h->def_regular)
3865               || (htab->root.dynamic_sections_created
3866                   && (h->root.type == bfd_link_hash_undefweak
3867                       || h->root.type == bfd_link_hash_undefined))))
3868         {
3869           /* Make sure this symbol is output as a dynamic symbol.
3870              Undefined weak syms won't yet be marked as dynamic.  */
3871           if (h->dynindx == -1 && !h->forced_local)
3872             {
3873               if (!bfd_elf_link_record_dynamic_symbol (info, h))
3874                 return FALSE;
3875             }
3876
3877           /* If that succeeded, we know we'll be keeping all the
3878              relocs.  */
3879           if (h->dynindx != -1)
3880             goto keep;
3881         }
3882
3883       eh->dyn_relocs = NULL;
3884
3885     keep:;
3886     }
3887
3888   /* Finally, allocate space.  */
3889   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3890     {
3891       asection *sreloc = elf_section_data (p->sec)->sreloc;
3892       sreloc->size += p->count * sizeof (Elf32_External_Rela);
3893     }
3894
3895   return TRUE;
3896 }
3897
3898 /* Find any dynamic relocs that apply to read-only sections.  */
3899
3900 static bfd_boolean
3901 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3902 {
3903   struct elf_nds32_link_hash_entry *eh;
3904   struct elf_nds32_dyn_relocs *p;
3905
3906   if (h->root.type == bfd_link_hash_warning)
3907     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3908
3909   eh = (struct elf_nds32_link_hash_entry *) h;
3910   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3911     {
3912       asection *s = p->sec->output_section;
3913
3914       if (s != NULL && (s->flags & SEC_READONLY) != 0)
3915         {
3916           struct bfd_link_info *info = (struct bfd_link_info *) inf;
3917
3918           info->flags |= DF_TEXTREL;
3919
3920           /* Not an error, just cut short the traversal.  */
3921           return FALSE;
3922         }
3923     }
3924   return TRUE;
3925 }
3926
3927 /* Set the sizes of the dynamic sections.  */
3928
3929 static bfd_boolean
3930 nds32_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3931                                  struct bfd_link_info *info)
3932 {
3933   struct elf_nds32_link_hash_table *htab;
3934   bfd *dynobj;
3935   asection *s;
3936   bfd_boolean relocs;
3937   bfd *ibfd;
3938
3939   htab = nds32_elf_hash_table (info);
3940   dynobj = htab->root.dynobj;
3941   BFD_ASSERT (dynobj != NULL);
3942
3943   if (htab->root.dynamic_sections_created)
3944     {
3945       /* Set the contents of the .interp section to the interpreter.  */
3946       if (!bfd_link_pic (info) && !info->nointerp)
3947         {
3948           s = bfd_get_section_by_name (dynobj, ".interp");
3949           BFD_ASSERT (s != NULL);
3950           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3951           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3952         }
3953     }
3954
3955   /* Set up .got offsets for local syms, and space for local dynamic
3956      relocs.  */
3957   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3958     {
3959       bfd_signed_vma *local_got;
3960       bfd_signed_vma *end_local_got;
3961       bfd_size_type locsymcount;
3962       Elf_Internal_Shdr *symtab_hdr;
3963       asection *srel;
3964
3965       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
3966         continue;
3967
3968       for (s = ibfd->sections; s != NULL; s = s->next)
3969         {
3970           struct elf_nds32_dyn_relocs *p;
3971
3972           for (p = ((struct elf_nds32_dyn_relocs *)
3973                     elf_section_data (s)->local_dynrel);
3974                p != NULL; p = p->next)
3975             {
3976               if (!bfd_is_abs_section (p->sec)
3977                   && bfd_is_abs_section (p->sec->output_section))
3978                 {
3979                   /* Input section has been discarded, either because
3980                      it is a copy of a linkonce section or due to
3981                      linker script /DISCARD/, so we'll be discarding
3982                      the relocs too.  */
3983                 }
3984               else if (p->count != 0)
3985                 {
3986                   srel = elf_section_data (p->sec)->sreloc;
3987                   srel->size += p->count * sizeof (Elf32_External_Rela);
3988                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
3989                     info->flags |= DF_TEXTREL;
3990                 }
3991             }
3992         }
3993
3994       local_got = elf_local_got_refcounts (ibfd);
3995       if (!local_got)
3996         continue;
3997
3998       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3999       locsymcount = symtab_hdr->sh_info;
4000       end_local_got = local_got + locsymcount;
4001       s = htab->root.sgot;
4002       srel = htab->root.srelgot;
4003       for (; local_got < end_local_got; ++local_got)
4004         {
4005           if (*local_got > 0)
4006             {
4007               *local_got = s->size;
4008               s->size += 4;
4009               if (bfd_link_pic (info))
4010                 srel->size += sizeof (Elf32_External_Rela);
4011             }
4012           else
4013             *local_got = (bfd_vma) - 1;
4014         }
4015     }
4016
4017   /* Allocate global sym .plt and .got entries, and space for global
4018      sym dynamic relocs.  */
4019   elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (void *) info);
4020
4021   /* We now have determined the sizes of the various dynamic sections.
4022      Allocate memory for them.  */
4023   relocs = FALSE;
4024   for (s = dynobj->sections; s != NULL; s = s->next)
4025     {
4026       if ((s->flags & SEC_LINKER_CREATED) == 0)
4027         continue;
4028
4029       if (s == htab->root.splt)
4030         {
4031           /* Strip this section if we don't need it; see the
4032              comment below.  */
4033         }
4034       else if (s == htab->root.sgot)
4035         {
4036           got_size += s->size;
4037         }
4038       else if (s == htab->root.sgotplt)
4039         {
4040           got_size += s->size;
4041         }
4042       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
4043         {
4044           if (s->size != 0 && s != htab->root.srelplt)
4045             relocs = TRUE;
4046
4047           /* We use the reloc_count field as a counter if we need
4048              to copy relocs into the output file.  */
4049           s->reloc_count = 0;
4050         }
4051       else
4052         {
4053           /* It's not one of our sections, so don't allocate space.  */
4054           continue;
4055         }
4056
4057       if (s->size == 0)
4058         {
4059           /* If we don't need this section, strip it from the
4060              output file.  This is mostly to handle .rela.bss and
4061              .rela.plt.  We must create both sections in
4062              create_dynamic_sections, because they must be created
4063              before the linker maps input sections to output
4064              sections.  The linker does that before
4065              adjust_dynamic_symbol is called, and it is that
4066              function which decides whether anything needs to go
4067              into these sections.  */
4068           s->flags |= SEC_EXCLUDE;
4069           continue;
4070         }
4071
4072       /* Allocate memory for the section contents.  We use bfd_zalloc
4073          here in case unused entries are not reclaimed before the
4074          section's contents are written out.  This should not happen,
4075          but this way if it does, we get a R_NDS32_NONE reloc instead
4076          of garbage.  */
4077       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
4078       if (s->contents == NULL)
4079         return FALSE;
4080     }
4081
4082
4083   if (htab->root.dynamic_sections_created)
4084     {
4085       /* Add some entries to the .dynamic section.  We fill in the
4086          values later, in nds32_elf_finish_dynamic_sections, but we
4087          must add the entries now so that we get the correct size for
4088          the .dynamic section.  The DT_DEBUG entry is filled in by the
4089          dynamic linker and used by the debugger.  */
4090 #define add_dynamic_entry(TAG, VAL) \
4091   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
4092
4093       if (!bfd_link_pic (info))
4094         {
4095           if (!add_dynamic_entry (DT_DEBUG, 0))
4096             return FALSE;
4097         }
4098
4099       if (htab->root.splt->size != 0)
4100         {
4101           if (!add_dynamic_entry (DT_PLTGOT, 0)
4102               || !add_dynamic_entry (DT_PLTRELSZ, 0)
4103               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
4104               || !add_dynamic_entry (DT_JMPREL, 0))
4105             return FALSE;
4106         }
4107
4108       if (relocs)
4109         {
4110           if (!add_dynamic_entry (DT_RELA, 0)
4111               || !add_dynamic_entry (DT_RELASZ, 0)
4112               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
4113             return FALSE;
4114
4115           /* If any dynamic relocs apply to a read-only section,
4116              then we need a DT_TEXTREL entry.  */
4117           if ((info->flags & DF_TEXTREL) == 0)
4118             elf_link_hash_traverse (&htab->root, readonly_dynrelocs,
4119                                     (void *) info);
4120
4121           if ((info->flags & DF_TEXTREL) != 0)
4122             {
4123               if (!add_dynamic_entry (DT_TEXTREL, 0))
4124                 return FALSE;
4125             }
4126         }
4127     }
4128 #undef add_dynamic_entry
4129
4130   return TRUE;
4131 }
4132
4133 static bfd_reloc_status_type
4134 nds32_relocate_contents (reloc_howto_type *howto, bfd *input_bfd,
4135                          bfd_vma relocation, bfd_byte *location)
4136 {
4137   int size;
4138   bfd_vma x = 0;
4139   bfd_reloc_status_type flag;
4140   unsigned int rightshift = howto->rightshift;
4141   unsigned int bitpos = howto->bitpos;
4142
4143   /* If the size is negative, negate RELOCATION.  This isn't very
4144      general.  */
4145   if (howto->size < 0)
4146     relocation = -relocation;
4147
4148   /* Get the value we are going to relocate.  */
4149   size = bfd_get_reloc_size (howto);
4150   switch (size)
4151     {
4152     default:
4153       abort ();
4154       break;
4155     case 0:
4156       return bfd_reloc_ok;
4157     case 2:
4158       x = bfd_getb16 (location);
4159       break;
4160     case 4:
4161       x = bfd_getb32 (location);
4162       break;
4163     }
4164
4165   /* Check for overflow.  FIXME: We may drop bits during the addition
4166      which we don't check for.  We must either check at every single
4167      operation, which would be tedious, or we must do the computations
4168      in a type larger than bfd_vma, which would be inefficient.  */
4169   flag = bfd_reloc_ok;
4170   if (howto->complain_on_overflow != complain_overflow_dont)
4171     {
4172       bfd_vma addrmask, fieldmask, signmask, ss;
4173       bfd_vma a, b, sum;
4174
4175       /* Get the values to be added together.  For signed and unsigned
4176          relocations, we assume that all values should be truncated to
4177          the size of an address.  For bitfields, all the bits matter.
4178          See also bfd_check_overflow.  */
4179       fieldmask = N_ONES (howto->bitsize);
4180       signmask = ~fieldmask;
4181       addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
4182       a = (relocation & addrmask) >> rightshift;
4183       b = (x & howto->src_mask & addrmask) >> bitpos;
4184
4185       switch (howto->complain_on_overflow)
4186         {
4187         case complain_overflow_signed:
4188           /* If any sign bits are set, all sign bits must be set.
4189              That is, A must be a valid negative address after
4190              shifting.  */
4191           signmask = ~(fieldmask >> 1);
4192           /* Fall through.  */
4193
4194         case complain_overflow_bitfield:
4195           /* Much like the signed check, but for a field one bit
4196              wider.  We allow a bitfield to represent numbers in the
4197              range -2**n to 2**n-1, where n is the number of bits in the
4198              field.  Note that when bfd_vma is 32 bits, a 32-bit reloc
4199              can't overflow, which is exactly what we want.  */
4200           ss = a & signmask;
4201           if (ss != 0 && ss != ((addrmask >> rightshift) & signmask))
4202             flag = bfd_reloc_overflow;
4203
4204           /* We only need this next bit of code if the sign bit of B
4205              is below the sign bit of A.  This would only happen if
4206              SRC_MASK had fewer bits than BITSIZE.  Note that if
4207              SRC_MASK has more bits than BITSIZE, we can get into
4208              trouble; we would need to verify that B is in range, as
4209              we do for A above.  */
4210           ss = ((~howto->src_mask) >> 1) & howto->src_mask;
4211           ss >>= bitpos;
4212
4213           /* Set all the bits above the sign bit.  */
4214           b = (b ^ ss) - ss;
4215
4216           /* Now we can do the addition.  */
4217           sum = a + b;
4218
4219           /* See if the result has the correct sign.  Bits above the
4220              sign bit are junk now; ignore them.  If the sum is
4221              positive, make sure we did not have all negative inputs;
4222              if the sum is negative, make sure we did not have all
4223              positive inputs.  The test below looks only at the sign
4224              bits, and it really just
4225              SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
4226
4227              We mask with addrmask here to explicitly allow an address
4228              wrap-around.  The Linux kernel relies on it, and it is
4229              the only way to write assembler code which can run when
4230              loaded at a location 0x80000000 away from the location at
4231              which it is linked.  */
4232           if (((~(a ^ b)) & (a ^ sum)) & signmask & addrmask)
4233             flag = bfd_reloc_overflow;
4234
4235           break;
4236
4237         case complain_overflow_unsigned:
4238           /* Checking for an unsigned overflow is relatively easy:
4239              trim the addresses and add, and trim the result as well.
4240              Overflow is normally indicated when the result does not
4241              fit in the field.  However, we also need to consider the
4242              case when, e.g., fieldmask is 0x7fffffff or smaller, an
4243              input is 0x80000000, and bfd_vma is only 32 bits; then we
4244              will get sum == 0, but there is an overflow, since the
4245              inputs did not fit in the field.  Instead of doing a
4246              separate test, we can check for this by or-ing in the
4247              operands when testing for the sum overflowing its final
4248              field.  */
4249           sum = (a + b) & addrmask;
4250           if ((a | b | sum) & signmask)
4251             flag = bfd_reloc_overflow;
4252           break;
4253
4254         default:
4255           abort ();
4256         }
4257     }
4258
4259   /* Put RELOCATION in the right bits.  */
4260   relocation >>= (bfd_vma) rightshift;
4261   relocation <<= (bfd_vma) bitpos;
4262
4263   /* Add RELOCATION to the right bits of X.  */
4264   /* FIXME : 090616
4265      Because the relaxation may generate duplicate relocation at one address,
4266      an addition to immediate in the instruction may cause the relocation added
4267      several times.
4268      This bug should be fixed in assembler, but a check is also needed here.  */
4269   if (howto->partial_inplace)
4270     x = ((x & ~howto->dst_mask)
4271          | (((x & howto->src_mask) + relocation) & howto->dst_mask));
4272   else
4273     x = ((x & ~howto->dst_mask) | ((relocation) & howto->dst_mask));
4274
4275
4276   /* Put the relocated value back in the object file.  */
4277   switch (size)
4278     {
4279     default:
4280     case 0:
4281     case 1:
4282     case 8:
4283       abort ();
4284       break;
4285     case 2:
4286       bfd_putb16 (x, location);
4287       break;
4288     case 4:
4289       bfd_putb32 (x, location);
4290       break;
4291     }
4292
4293   return flag;
4294 }
4295
4296 static bfd_reloc_status_type
4297 nds32_elf_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
4298                                asection *input_section, bfd_byte *contents,
4299                                bfd_vma address, bfd_vma value, bfd_vma addend)
4300 {
4301   bfd_vma relocation;
4302
4303   /* Sanity check the address.  */
4304   if (address > bfd_get_section_limit (input_bfd, input_section))
4305     return bfd_reloc_outofrange;
4306
4307   /* This function assumes that we are dealing with a basic relocation
4308      against a symbol.  We want to compute the value of the symbol to
4309      relocate to.  This is just VALUE, the value of the symbol, plus
4310      ADDEND, any addend associated with the reloc.  */
4311   relocation = value + addend;
4312
4313   /* If the relocation is PC relative, we want to set RELOCATION to
4314      the distance between the symbol (currently in RELOCATION) and the
4315      location we are relocating.  Some targets (e.g., i386-aout)
4316      arrange for the contents of the section to be the negative of the
4317      offset of the location within the section; for such targets
4318      pcrel_offset is FALSE.  Other targets (e.g., m88kbcs or ELF)
4319      simply leave the contents of the section as zero; for such
4320      targets pcrel_offset is TRUE.  If pcrel_offset is FALSE we do not
4321      need to subtract out the offset of the location within the
4322      section (which is just ADDRESS).  */
4323   if (howto->pc_relative)
4324     {
4325       relocation -= (input_section->output_section->vma
4326                      + input_section->output_offset);
4327       if (howto->pcrel_offset)
4328         relocation -= address;
4329     }
4330
4331   return nds32_relocate_contents (howto, input_bfd, relocation,
4332                                   contents + address);
4333 }
4334
4335 static bfd_boolean
4336 nds32_elf_output_symbol_hook (struct bfd_link_info *info,
4337                               const char *name,
4338                               Elf_Internal_Sym *elfsym ATTRIBUTE_UNUSED,
4339                               asection *input_sec,
4340                               struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
4341 {
4342   const char *source;
4343   FILE *sym_ld_script = NULL;
4344   struct elf_nds32_link_hash_table *table;
4345
4346   table = nds32_elf_hash_table (info);
4347   sym_ld_script = table->sym_ld_script;
4348   if (!sym_ld_script)
4349     return TRUE;
4350
4351   if (!h || !name || *name == '\0')
4352     return TRUE;
4353
4354   if (input_sec->flags & SEC_EXCLUDE)
4355     return TRUE;
4356
4357   if (!check_start_export_sym)
4358     {
4359       fprintf (sym_ld_script, "SECTIONS\n{\n");
4360       check_start_export_sym = 1;
4361     }
4362
4363   if (h->root.type == bfd_link_hash_defined
4364       || h->root.type == bfd_link_hash_defweak)
4365     {
4366       if (!h->root.u.def.section->output_section)
4367         return TRUE;
4368
4369       if (bfd_is_const_section (input_sec))
4370         source = input_sec->name;
4371       else
4372         source = input_sec->owner->filename;
4373
4374       fprintf (sym_ld_script, "\t%s = 0x%08lx;\t /* %s */\n",
4375                h->root.root.string,
4376                (long) (h->root.u.def.value
4377                 + h->root.u.def.section->output_section->vma
4378                 + h->root.u.def.section->output_offset), source);
4379     }
4380
4381   return TRUE;
4382 }
4383
4384 /* Relocate an NDS32/D ELF section.
4385    There is some attempt to make this function usable for many architectures,
4386    both for RELA and REL type relocs, if only to serve as a learning tool.
4387
4388    The RELOCATE_SECTION function is called by the new ELF backend linker
4389    to handle the relocations for a section.
4390
4391    The relocs are always passed as Rela structures; if the section
4392    actually uses Rel structures, the r_addend field will always be
4393    zero.
4394
4395    This function is responsible for adjust the section contents as
4396    necessary, and (if using Rela relocs and generating a
4397    relocatable output file) adjusting the reloc addend as
4398    necessary.
4399
4400    This function does not have to worry about setting the reloc
4401    address or the reloc symbol index.
4402
4403    LOCAL_SYMS is a pointer to the swapped in local symbols.
4404
4405    LOCAL_SECTIONS is an array giving the section in the input file
4406    corresponding to the st_shndx field of each local symbol.
4407
4408    The global hash table entry for the global symbols can be found
4409    via elf_sym_hashes (input_bfd).
4410
4411    When generating relocatable output, this function must handle
4412    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
4413    going to be the section symbol corresponding to the output
4414    section, which means that the addend must be adjusted
4415    accordingly.  */
4416
4417 static bfd_vma
4418 dtpoff_base (struct bfd_link_info *info)
4419 {
4420   /* If tls_sec is NULL, we should have signalled an error already.  */
4421   if (elf_hash_table (info)->tls_sec == NULL)
4422     return 0;
4423   return elf_hash_table (info)->tls_sec->vma;
4424 }
4425
4426 static bfd_boolean
4427 nds32_elf_relocate_section (bfd *                  output_bfd ATTRIBUTE_UNUSED,
4428                             struct bfd_link_info * info,
4429                             bfd *                  input_bfd,
4430                             asection *             input_section,
4431                             bfd_byte *             contents,
4432                             Elf_Internal_Rela *    relocs,
4433                             Elf_Internal_Sym *     local_syms,
4434                             asection **            local_sections)
4435 {
4436   Elf_Internal_Shdr *symtab_hdr;
4437   struct elf_link_hash_entry **sym_hashes;
4438   Elf_Internal_Rela *rel, *relend;
4439   bfd_boolean ret = TRUE;               /* Assume success.  */
4440   int align = 0;
4441   bfd_reloc_status_type r;
4442   const char *errmsg = NULL;
4443   bfd_vma gp;
4444   struct elf_nds32_link_hash_table *htab;
4445   bfd *dynobj;
4446   bfd_vma *local_got_offsets;
4447   asection *sgot, *splt, *sreloc;
4448   bfd_vma high_address;
4449   struct elf_nds32_link_hash_table *table;
4450   int eliminate_gc_relocs;
4451   bfd_vma fpbase_addr;
4452
4453   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4454   sym_hashes = elf_sym_hashes (input_bfd);
4455   htab = nds32_elf_hash_table (info);
4456   high_address = bfd_get_section_limit (input_bfd, input_section);
4457
4458   dynobj = htab->root.dynobj;
4459   local_got_offsets = elf_local_got_offsets (input_bfd);
4460
4461   sgot = htab->root.sgot;
4462   splt = htab->root.splt;
4463   sreloc = NULL;
4464
4465   rel = relocs;
4466   relend = relocs + input_section->reloc_count;
4467
4468   table = nds32_elf_hash_table (info);
4469   eliminate_gc_relocs = table->eliminate_gc_relocs;
4470   /* By this time, we can adjust the value of _SDA_BASE_.  */
4471   if ((!bfd_link_relocatable (info)))
4472     {
4473       is_SDA_BASE_set = 1;
4474       r = nds32_elf_final_sda_base (output_bfd, info, &gp, TRUE);
4475       if (r != bfd_reloc_ok)
4476         return FALSE;
4477     }
4478
4479   if (is_ITB_BASE_set == 0)
4480     {
4481       /* Set the _ITB_BASE_.  */
4482       if (!nds32_elf_ex9_itb_base (info))
4483         {
4484           _bfd_error_handler (_("%B: error: Cannot set _ITB_BASE_"),
4485                               output_bfd);
4486           bfd_set_error (bfd_error_bad_value);
4487         }
4488     }
4489
4490   if (table->target_optimize & NDS32_RELAX_JUMP_IFC_ON)
4491     if (!nds32_elf_ifc_reloc ())
4492       _bfd_error_handler (_("error: IFC relocation error."));
4493
4494  /* Relocation for .ex9.itable.  */
4495   if (table->target_optimize & NDS32_RELAX_EX9_ON
4496       || (table->ex9_import_file && table->update_ex9_table))
4497     nds32_elf_ex9_reloc_jmp (info);
4498
4499   /* Use gp as fp to prevent truncated fit.  Because in relaxation time
4500      the fp value is set as gp, and it has be reverted for instruction
4501      setting fp.  */
4502   fpbase_addr = elf_gp (output_bfd);
4503
4504   for (rel = relocs; rel < relend; rel++)
4505     {
4506       enum elf_nds32_reloc_type r_type;
4507       reloc_howto_type *howto = NULL;
4508       unsigned long r_symndx;
4509       struct elf_link_hash_entry *h = NULL;
4510       Elf_Internal_Sym *sym = NULL;
4511       asection *sec;
4512       bfd_vma relocation;
4513
4514       /* We can't modify r_addend here as elf_link_input_bfd has an assert to
4515          ensure it's zero (we use REL relocs, not RELA).  Therefore this
4516          should be assigning zero to `addend', but for clarity we use
4517          `r_addend'.  */
4518
4519       bfd_vma addend = rel->r_addend;
4520       bfd_vma offset = rel->r_offset;
4521
4522       r_type = ELF32_R_TYPE (rel->r_info);
4523       if (r_type >= R_NDS32_max)
4524         {
4525           /* xgettext:c-format */
4526           _bfd_error_handler (_("%B: error: unknown relocation type %d."),
4527                               input_bfd, r_type);
4528           bfd_set_error (bfd_error_bad_value);
4529           ret = FALSE;
4530           continue;
4531         }
4532
4533       if (r_type == R_NDS32_GNU_VTENTRY
4534           || r_type == R_NDS32_GNU_VTINHERIT
4535           || r_type == R_NDS32_NONE
4536           || r_type == R_NDS32_RELA_GNU_VTENTRY
4537           || r_type == R_NDS32_RELA_GNU_VTINHERIT
4538           || (r_type >= R_NDS32_INSN16 && r_type <= R_NDS32_25_FIXED_RELA)
4539           || r_type == R_NDS32_DATA
4540           || r_type == R_NDS32_TRAN
4541           || (r_type >= R_NDS32_LONGCALL4 && r_type <= R_NDS32_LONGJUMP7))
4542         continue;
4543
4544       /* If we enter the fp-as-gp region.  Resolve the address
4545          of best fp-base.  */
4546       if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_BEGIN
4547           && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
4548         {
4549           int dist;
4550
4551           /* Distance to relocation of best fp-base is encoded in R_SYM.  */
4552           dist =  rel->r_addend >> 16;
4553           fpbase_addr = calculate_memory_address (input_bfd, rel + dist,
4554                                                   local_syms, symtab_hdr);
4555         }
4556       else if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_END
4557                && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
4558         {
4559           fpbase_addr = elf_gp (output_bfd);
4560         }
4561
4562       if (((r_type >= R_NDS32_DWARF2_OP1_RELA
4563             && r_type <= R_NDS32_DWARF2_LEB_RELA)
4564            || r_type >= R_NDS32_RELAX_ENTRY) && !bfd_link_relocatable (info))
4565         continue;
4566
4567       howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
4568       r_symndx = ELF32_R_SYM (rel->r_info);
4569
4570       /* This is a final link.  */
4571       sym = NULL;
4572       sec = NULL;
4573       h = NULL;
4574
4575       if (r_symndx < symtab_hdr->sh_info)
4576         {
4577           /* Local symbol.  */
4578           sym = local_syms + r_symndx;
4579           sec = local_sections[r_symndx];
4580
4581           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4582           addend = rel->r_addend;
4583         }
4584       else
4585         {
4586           /* External symbol.  */
4587           bfd_boolean warned, ignored, unresolved_reloc;
4588           int symndx = r_symndx - symtab_hdr->sh_info;
4589
4590           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4591                                    r_symndx, symtab_hdr, sym_hashes, h, sec,
4592                                    relocation, unresolved_reloc, warned,
4593                                    ignored);
4594
4595           /* la $fp, _FP_BASE_ is per-function (region).
4596              Handle it specially.  */
4597           switch ((int) r_type)
4598             {
4599             case R_NDS32_SDA19S0_RELA:
4600             case R_NDS32_SDA15S0_RELA:
4601             case R_NDS32_20_RELA:
4602               if (strcmp (elf_sym_hashes (input_bfd)[symndx]->root.root.string,
4603                           FP_BASE_NAME) == 0)
4604                 {
4605                   relocation = fpbase_addr;
4606                   break;
4607                 }
4608             }
4609
4610         }
4611
4612       if (bfd_link_relocatable (info))
4613         {
4614           /* This is a relocatable link.  We don't have to change
4615              anything, unless the reloc is against a section symbol,
4616              in which case we have to adjust according to where the
4617              section symbol winds up in the output section.  */
4618           if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4619             rel->r_addend += sec->output_offset + sym->st_value;
4620
4621           continue;
4622         }
4623
4624       /* Sanity check the address.  */
4625       if (offset > high_address)
4626         {
4627           r = bfd_reloc_outofrange;
4628           goto check_reloc;
4629         }
4630
4631       if ((r_type >= R_NDS32_DWARF2_OP1_RELA
4632            && r_type <= R_NDS32_DWARF2_LEB_RELA)
4633           || r_type >= R_NDS32_RELAX_ENTRY)
4634         continue;
4635
4636       switch ((int) r_type)
4637         {
4638         case R_NDS32_GOTOFF:
4639           /* Relocation is relative to the start of the global offset
4640              table (for ld24 rx, #uimm24), e.g. access at label+addend
4641
4642              ld24 rx. #label@GOTOFF + addend
4643              sub  rx, r12.  */
4644         case R_NDS32_GOTOFF_HI20:
4645         case R_NDS32_GOTOFF_LO12:
4646         case R_NDS32_GOTOFF_LO15:
4647         case R_NDS32_GOTOFF_LO19:
4648           BFD_ASSERT (sgot != NULL);
4649
4650           relocation -= elf_gp (output_bfd);
4651           break;
4652
4653         case R_NDS32_9_PLTREL:
4654         case R_NDS32_25_PLTREL:
4655           /* Relocation is to the entry for this symbol in the
4656              procedure linkage table.  */
4657
4658           /* The native assembler will generate a 25_PLTREL reloc
4659              for a local symbol if you assemble a call from one
4660              section to another when using -K pic.  */
4661           if (h == NULL)
4662             break;
4663
4664           if (h->forced_local)
4665             break;
4666
4667           /* We didn't make a PLT entry for this symbol.  This
4668              happens when statically linking PIC code, or when
4669              using -Bsymbolic.  */
4670           if (h->plt.offset == (bfd_vma) - 1)
4671             break;
4672
4673           relocation = (splt->output_section->vma
4674                         + splt->output_offset + h->plt.offset);
4675           break;
4676
4677         case R_NDS32_PLT_GOTREL_HI20:
4678         case R_NDS32_PLT_GOTREL_LO12:
4679         case R_NDS32_PLT_GOTREL_LO15:
4680         case R_NDS32_PLT_GOTREL_LO19:
4681         case R_NDS32_PLT_GOTREL_LO20:
4682           if (h == NULL || h->forced_local || h->plt.offset == (bfd_vma) - 1)
4683             {
4684               /* We didn't make a PLT entry for this symbol.  This
4685                  happens when statically linking PIC code, or when
4686                  using -Bsymbolic.  */
4687               relocation -= elf_gp (output_bfd);
4688               break;
4689             }
4690
4691           relocation = (splt->output_section->vma
4692                         + splt->output_offset + h->plt.offset);
4693
4694           relocation -= elf_gp (output_bfd);
4695           break;
4696
4697         case R_NDS32_PLTREL_HI20:
4698         case R_NDS32_PLTREL_LO12:
4699
4700           /* Relocation is to the entry for this symbol in the
4701              procedure linkage table.  */
4702
4703           /* The native assembler will generate a 25_PLTREL reloc
4704              for a local symbol if you assemble a call from one
4705              section to another when using -K pic.  */
4706           if (h == NULL)
4707             break;
4708
4709           if (h->forced_local)
4710             break;
4711
4712           if (h->plt.offset == (bfd_vma) - 1)
4713             /* We didn't make a PLT entry for this symbol.  This
4714                happens when statically linking PIC code, or when
4715                using -Bsymbolic.  */
4716             break;
4717
4718           if (splt == NULL)
4719             break;
4720
4721           relocation = (splt->output_section->vma
4722                         + splt->output_offset
4723                         + h->plt.offset + 4)
4724                        - (input_section->output_section->vma
4725                           + input_section->output_offset
4726                           + rel->r_offset);
4727
4728           break;
4729
4730         case R_NDS32_GOTPC20:
4731           /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
4732              ld24 rx,#_GLOBAL_OFFSET_TABLE_  */
4733           relocation = elf_gp (output_bfd);
4734           break;
4735
4736         case R_NDS32_GOTPC_HI20:
4737         case R_NDS32_GOTPC_LO12:
4738             {
4739               /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
4740                  bl .+4
4741                  seth rx,#high(_GLOBAL_OFFSET_TABLE_)
4742                  or3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
4743                  or
4744                  bl .+4
4745                  seth rx,#shigh(_GLOBAL_OFFSET_TABLE_)
4746                  add3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
4747                */
4748               relocation = elf_gp (output_bfd);
4749               relocation -= (input_section->output_section->vma
4750                              + input_section->output_offset + rel->r_offset);
4751               break;
4752             }
4753
4754         case R_NDS32_GOT20:
4755           /* Fall through.  */
4756         case R_NDS32_GOT_HI20:
4757         case R_NDS32_GOT_LO12:
4758         case R_NDS32_GOT_LO15:
4759         case R_NDS32_GOT_LO19:
4760           /* Relocation is to the entry for this symbol in the global
4761              offset table.  */
4762           BFD_ASSERT (sgot != NULL);
4763
4764           if (h != NULL)
4765             {
4766               bfd_boolean dyn;
4767               bfd_vma off;
4768
4769               off = h->got.offset;
4770               BFD_ASSERT (off != (bfd_vma) - 1);
4771               dyn = htab->root.dynamic_sections_created;
4772               if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4773                                                     bfd_link_pic (info),
4774                                                     h)
4775                   || (bfd_link_pic (info)
4776                       && (info->symbolic
4777                           || h->dynindx == -1
4778                           || h->forced_local) && h->def_regular))
4779                 {
4780                   /* This is actually a static link, or it is a
4781                      -Bsymbolic link and the symbol is defined
4782                      locally, or the symbol was forced to be local
4783                      because of a version file.  We must initialize
4784                      this entry in the global offset table.  Since the
4785                      offset must always be a multiple of 4, we use the
4786                      least significant bit to record whether we have
4787                      initialized it already.
4788
4789                      When doing a dynamic link, we create a .rela.got
4790                      relocation entry to initialize the value.  This
4791                      is done in the finish_dynamic_symbol routine.  */
4792                   if ((off & 1) != 0)
4793                     off &= ~1;
4794                   else
4795                     {
4796                       bfd_put_32 (output_bfd, relocation, sgot->contents + off);
4797                       h->got.offset |= 1;
4798                     }
4799                 }
4800               relocation = sgot->output_section->vma + sgot->output_offset + off
4801                            - elf_gp (output_bfd);
4802             }
4803           else
4804             {
4805               bfd_vma off;
4806               bfd_byte *loc;
4807
4808               BFD_ASSERT (local_got_offsets != NULL
4809                           && local_got_offsets[r_symndx] != (bfd_vma) - 1);
4810
4811               off = local_got_offsets[r_symndx];
4812
4813               /* The offset must always be a multiple of 4.  We use
4814                  the least significant bit to record whether we have
4815                  already processed this entry.  */
4816               if ((off & 1) != 0)
4817                 off &= ~1;
4818               else
4819                 {
4820                   bfd_put_32 (output_bfd, relocation, sgot->contents + off);
4821
4822                   if (bfd_link_pic (info))
4823                     {
4824                       asection *srelgot;
4825                       Elf_Internal_Rela outrel;
4826
4827                       /* We need to generate a R_NDS32_RELATIVE reloc
4828                          for the dynamic linker.  */
4829                       srelgot = htab->root.srelgot;
4830                       BFD_ASSERT (srelgot != NULL);
4831
4832                       outrel.r_offset = (elf_gp (output_bfd)
4833                                          + sgot->output_offset + off);
4834                       outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
4835                       outrel.r_addend = relocation;
4836                       loc = srelgot->contents;
4837                       loc +=
4838                         srelgot->reloc_count * sizeof (Elf32_External_Rela);
4839                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4840                       ++srelgot->reloc_count;
4841                     }
4842                   local_got_offsets[r_symndx] |= 1;
4843                 }
4844               relocation = sgot->output_section->vma + sgot->output_offset + off
4845                            - elf_gp (output_bfd);
4846             }
4847
4848           break;
4849
4850         case R_NDS32_16_RELA:
4851         case R_NDS32_20_RELA:
4852         case R_NDS32_5_RELA:
4853         case R_NDS32_32_RELA:
4854         case R_NDS32_9_PCREL_RELA:
4855         case R_NDS32_WORD_9_PCREL_RELA:
4856         case R_NDS32_10_UPCREL_RELA:
4857         case R_NDS32_15_PCREL_RELA:
4858         case R_NDS32_17_PCREL_RELA:
4859         case R_NDS32_25_PCREL_RELA:
4860         case R_NDS32_HI20_RELA:
4861         case R_NDS32_LO12S3_RELA:
4862         case R_NDS32_LO12S2_RELA:
4863         case R_NDS32_LO12S2_DP_RELA:
4864         case R_NDS32_LO12S2_SP_RELA:
4865         case R_NDS32_LO12S1_RELA:
4866         case R_NDS32_LO12S0_RELA:
4867         case R_NDS32_LO12S0_ORI_RELA:
4868           if (bfd_link_pic (info) && r_symndx != 0
4869               && (input_section->flags & SEC_ALLOC) != 0
4870               && (eliminate_gc_relocs == 0
4871                   || (sec && (sec->flags & SEC_EXCLUDE) == 0))
4872               && ((r_type != R_NDS32_9_PCREL_RELA
4873                    && r_type != R_NDS32_WORD_9_PCREL_RELA
4874                    && r_type != R_NDS32_10_UPCREL_RELA
4875                    && r_type != R_NDS32_15_PCREL_RELA
4876                    && r_type != R_NDS32_17_PCREL_RELA
4877                    && r_type != R_NDS32_25_PCREL_RELA
4878                    && !(r_type == R_NDS32_32_RELA
4879                         && strcmp (input_section->name, ".eh_frame") == 0))
4880                   || (h != NULL && h->dynindx != -1
4881                       && (!info->symbolic || !h->def_regular))))
4882             {
4883               Elf_Internal_Rela outrel;
4884               bfd_boolean skip, relocate;
4885               bfd_byte *loc;
4886
4887               /* When generating a shared object, these relocations
4888                  are copied into the output file to be resolved at run
4889                  time.  */
4890
4891               if (sreloc == NULL)
4892                 {
4893                   const char *name;
4894
4895                   name = bfd_elf_string_from_elf_section
4896                     (input_bfd, elf_elfheader (input_bfd)->e_shstrndx,
4897                      elf_section_data (input_section)->rela.hdr->sh_name);
4898                   if (name == NULL)
4899                     return FALSE;
4900
4901                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
4902                               && strcmp (bfd_get_section_name (input_bfd,
4903                                                                input_section),
4904                                          name + 5) == 0);
4905
4906                   sreloc = bfd_get_section_by_name (dynobj, name);
4907                   BFD_ASSERT (sreloc != NULL);
4908                 }
4909
4910               skip = FALSE;
4911               relocate = FALSE;
4912
4913               outrel.r_offset = _bfd_elf_section_offset (output_bfd,
4914                                                          info,
4915                                                          input_section,
4916                                                          rel->r_offset);
4917               if (outrel.r_offset == (bfd_vma) - 1)
4918                 skip = TRUE;
4919               else if (outrel.r_offset == (bfd_vma) - 2)
4920                 skip = TRUE, relocate = TRUE;
4921               outrel.r_offset += (input_section->output_section->vma
4922                                   + input_section->output_offset);
4923
4924               if (skip)
4925                 memset (&outrel, 0, sizeof outrel);
4926               else if (r_type == R_NDS32_17_PCREL_RELA
4927                        || r_type == R_NDS32_15_PCREL_RELA
4928                        || r_type == R_NDS32_25_PCREL_RELA)
4929                 {
4930                   BFD_ASSERT (h != NULL && h->dynindx != -1);
4931                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4932                   outrel.r_addend = rel->r_addend;
4933                 }
4934               else
4935                 {
4936                   /* h->dynindx may be -1 if this symbol was marked to
4937                      become local.  */
4938                   if (h == NULL
4939                       || ((info->symbolic || h->dynindx == -1)
4940                           && h->def_regular))
4941                     {
4942                       relocate = TRUE;
4943                       outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
4944                       outrel.r_addend = relocation + rel->r_addend;
4945                     }
4946                   else
4947                     {
4948                       BFD_ASSERT (h->dynindx != -1);
4949                       outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4950                       outrel.r_addend = rel->r_addend;
4951                     }
4952                 }
4953
4954               loc = sreloc->contents;
4955               loc += sreloc->reloc_count * sizeof (Elf32_External_Rela);
4956               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4957               ++sreloc->reloc_count;
4958
4959               /* If this reloc is against an external symbol, we do
4960                  not want to fiddle with the addend.  Otherwise, we
4961                  need to include the symbol value so that it becomes
4962                  an addend for the dynamic reloc.  */
4963               if (!relocate)
4964                 continue;
4965             }
4966           break;
4967
4968         case R_NDS32_25_ABS_RELA:
4969           if (bfd_link_pic (info))
4970             {
4971               _bfd_error_handler
4972                 (_("%s: warning: cannot deal R_NDS32_25_ABS_RELA in shared "
4973                    "mode."), bfd_get_filename (input_bfd));
4974               return FALSE;
4975             }
4976           break;
4977
4978         case R_NDS32_9_PCREL:
4979           r = nds32_elf_do_9_pcrel_reloc (input_bfd, howto, input_section,
4980                                           contents, offset,
4981                                           sec, relocation, addend);
4982           goto check_reloc;
4983
4984         case R_NDS32_HI20:
4985             {
4986               Elf_Internal_Rela *lorel;
4987
4988               /* We allow an arbitrary number of HI20 relocs before the
4989                  LO12 reloc.  This permits gcc to emit the HI and LO relocs
4990                  itself.  */
4991               for (lorel = rel + 1;
4992                    (lorel < relend
4993                     && ELF32_R_TYPE (lorel->r_info) == R_NDS32_HI20); lorel++)
4994                 continue;
4995               if (lorel < relend
4996                   && (ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S3
4997                       || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S2
4998                       || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S1
4999                       || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S0))
5000                 {
5001                   nds32_elf_relocate_hi20 (input_bfd, r_type, rel, lorel,
5002                                            contents, relocation + addend);
5003                   r = bfd_reloc_ok;
5004                 }
5005               else
5006                 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5007                                               contents, offset, relocation,
5008                                               addend);
5009             }
5010
5011           goto check_reloc;
5012
5013         case R_NDS32_GOT17S2_RELA:
5014         case R_NDS32_GOT15S2_RELA:
5015             {
5016               bfd_vma off;
5017
5018               BFD_ASSERT (sgot != NULL);
5019
5020               if (h != NULL)
5021                 {
5022                   bfd_boolean dyn;
5023
5024                   off = h->got.offset;
5025                   BFD_ASSERT (off != (bfd_vma) - 1);
5026
5027                   dyn = htab->root.dynamic_sections_created;
5028                   if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL
5029                       (dyn, bfd_link_pic (info), h)
5030                       || (bfd_link_pic (info)
5031                           && (info->symbolic
5032                               || h->dynindx == -1
5033                               || h->forced_local)
5034                           && h->def_regular))
5035                     {
5036                       /* This is actually a static link, or it is a
5037                          -Bsymbolic link and the symbol is defined
5038                          locally, or the symbol was forced to be local
5039                          because of a version file.  We must initialize
5040                          this entry in the global offset table.  Since the
5041                          offset must always be a multiple of 4, we use the
5042                          least significant bit to record whether we have
5043                          initialized it already.
5044
5045                          When doing a dynamic link, we create a .rela.got
5046                          relocation entry to initialize the value.  This
5047                          is done in the finish_dynamic_symbol routine.  */
5048                       if ((off & 1) != 0)
5049                         off &= ~1;
5050                       else
5051                         {
5052                           bfd_put_32 (output_bfd, relocation,
5053                                       sgot->contents + off);
5054                           h->got.offset |= 1;
5055                         }
5056                     }
5057                 }
5058               else
5059                 {
5060                   bfd_byte *loc;
5061
5062                   BFD_ASSERT (local_got_offsets != NULL
5063                               && local_got_offsets[r_symndx] != (bfd_vma) - 1);
5064
5065                   off = local_got_offsets[r_symndx];
5066
5067                   /* The offset must always be a multiple of 4.  We use
5068                      the least significant bit to record whether we have
5069                      already processed this entry.  */
5070                   if ((off & 1) != 0)
5071                     off &= ~1;
5072                   else
5073                     {
5074                       bfd_put_32 (output_bfd, relocation, sgot->contents + off);
5075
5076                       if (bfd_link_pic (info))
5077                         {
5078                           asection *srelgot;
5079                           Elf_Internal_Rela outrel;
5080
5081                           /* We need to generate a R_NDS32_RELATIVE reloc
5082                              for the dynamic linker.  */
5083                           srelgot = htab->root.srelgot;
5084                           BFD_ASSERT (srelgot != NULL);
5085
5086                           outrel.r_offset = (elf_gp (output_bfd)
5087                                              + sgot->output_offset + off);
5088                           outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
5089                           outrel.r_addend = relocation;
5090                           loc = srelgot->contents;
5091                           loc +=
5092                             srelgot->reloc_count * sizeof (Elf32_External_Rela);
5093                           bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5094                           ++srelgot->reloc_count;
5095                         }
5096                       local_got_offsets[r_symndx] |= 1;
5097                     }
5098                 }
5099               relocation = sgot->output_section->vma + sgot->output_offset + off
5100                            - elf_gp (output_bfd);
5101             }
5102           if (relocation & align)
5103             {
5104               /* Incorrect alignment.  */
5105               _bfd_error_handler
5106                 (_("%B: warning: unaligned access to GOT entry."), input_bfd);
5107               ret = FALSE;
5108               r = bfd_reloc_dangerous;
5109               goto check_reloc;
5110             }
5111           break;
5112
5113         case R_NDS32_SDA16S3_RELA:
5114         case R_NDS32_SDA15S3_RELA:
5115         case R_NDS32_SDA15S3:
5116           align = 0x7;
5117           goto handle_sda;
5118
5119         case R_NDS32_SDA17S2_RELA:
5120         case R_NDS32_SDA15S2_RELA:
5121         case R_NDS32_SDA12S2_SP_RELA:
5122         case R_NDS32_SDA12S2_DP_RELA:
5123         case R_NDS32_SDA15S2:
5124         case R_NDS32_SDA_FP7U2_RELA:
5125           align = 0x3;
5126           goto handle_sda;
5127
5128         case R_NDS32_SDA18S1_RELA:
5129         case R_NDS32_SDA15S1_RELA:
5130         case R_NDS32_SDA15S1:
5131           align = 0x1;
5132           goto handle_sda;
5133
5134         case R_NDS32_SDA19S0_RELA:
5135         case R_NDS32_SDA15S0_RELA:
5136         case R_NDS32_SDA15S0:
5137             {
5138               align = 0x0;
5139 handle_sda:
5140               BFD_ASSERT (sec != NULL);
5141
5142               /* If the symbol is in the abs section, the out_bfd will be null.
5143                  This happens when the relocation has a symbol@GOTOFF.  */
5144               r = nds32_elf_final_sda_base (output_bfd, info, &gp, FALSE);
5145               if (r != bfd_reloc_ok)
5146                 {
5147                   _bfd_error_handler
5148                     (_("%B: warning: relocate SDA_BASE failed."), input_bfd);
5149                   ret = FALSE;
5150                   goto check_reloc;
5151                 }
5152
5153               /* At this point `relocation' contains the object's
5154                  address.  */
5155               if (r_type == R_NDS32_SDA_FP7U2_RELA)
5156                 {
5157                   relocation -= fpbase_addr;
5158                 }
5159               else
5160                 relocation -= gp;
5161               /* Now it contains the offset from _SDA_BASE_.  */
5162
5163               /* Make sure alignment is correct.  */
5164
5165               if (relocation & align)
5166                 {
5167                   /* Incorrect alignment.  */
5168                   _bfd_error_handler
5169                     /* xgettext:c-format */
5170                     (_("%B(%A): warning: unaligned small data access of type %d."),
5171                      input_bfd, input_section, r_type);
5172                   ret = FALSE;
5173                   goto check_reloc;
5174                 }
5175             }
5176
5177           break;
5178         case R_NDS32_17IFC_PCREL_RELA:
5179         case R_NDS32_10IFCU_PCREL_RELA:
5180           /* do nothing */
5181           break;
5182
5183         case R_NDS32_TLS_LE_HI20:
5184         case R_NDS32_TLS_LE_LO12:
5185         case R_NDS32_TLS_LE_20:
5186         case R_NDS32_TLS_LE_15S0:
5187         case R_NDS32_TLS_LE_15S1:
5188         case R_NDS32_TLS_LE_15S2:
5189           if (elf_hash_table (info)->tls_sec != NULL)
5190             relocation -= (elf_hash_table (info)->tls_sec->vma + TP_OFFSET);
5191           break;
5192         case R_NDS32_TLS_IE_HI20:
5193         case R_NDS32_TLS_IE_LO12S2:
5194           {
5195             /* Relocation is to the entry for this symbol in the global
5196                offset table.  */
5197             unsigned int tls_type;
5198             asection *srelgot;
5199             Elf_Internal_Rela outrel;
5200             bfd_vma off;
5201             bfd_byte *loc;
5202             int indx = 0;
5203
5204             BFD_ASSERT (sgot != NULL);
5205             if (h != NULL)
5206               {
5207                 bfd_boolean dyn;
5208
5209                 off = h->got.offset;
5210                 BFD_ASSERT (off != (bfd_vma) - 1);
5211                 dyn = htab->root.dynamic_sections_created;
5212                 tls_type = ((struct elf_nds32_link_hash_entry *) h)->tls_type;
5213                 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
5214                     && (!bfd_link_pic (info)
5215                         || !SYMBOL_REFERENCES_LOCAL (info, h)))
5216                   indx = h->dynindx;
5217               }
5218             else
5219               {
5220                 /* Never happen currently.  */
5221                 BFD_ASSERT (local_got_offsets != NULL
5222                             && local_got_offsets[r_symndx] != (bfd_vma) - 1);
5223
5224                 off = local_got_offsets[r_symndx];
5225
5226                 tls_type = elf32_nds32_local_got_tls_type (input_bfd)[r_symndx];
5227               }
5228             relocation = sgot->output_section->vma + sgot->output_offset + off;
5229
5230             if (r_type == R_NDS32_TLS_IE_LO12S2)
5231               break;
5232
5233             /* The offset must always be a multiple of 4.  We use
5234                the least significant bit to record whether we have
5235                already processed this entry.  */
5236             if ((off & 1) != 0)
5237               off &= ~1;
5238             else
5239               {
5240                 bfd_boolean need_relocs = FALSE;
5241                 srelgot = htab->root.srelgot;
5242                 if ((bfd_link_pic (info) || indx != 0)
5243                     && (h == NULL
5244                         || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5245                         || h->root.type != bfd_link_hash_undefweak))
5246                   {
5247                     need_relocs = TRUE;
5248                     BFD_ASSERT (srelgot != NULL);
5249                   }
5250                 if (tls_type & GOT_TLS_IE)
5251                   {
5252                     if (need_relocs)
5253                       {
5254                         if (h->dynindx == 0)
5255                           outrel.r_addend = relocation - dtpoff_base (info);
5256                         else
5257                           outrel.r_addend = 0;
5258                         outrel.r_offset = (sgot->output_section->vma
5259                                            + sgot->output_offset
5260                                            + off);
5261                         outrel.r_info =
5262                           ELF32_R_INFO (h->dynindx, R_NDS32_TLS_TPOFF);
5263
5264                         loc = srelgot->contents;
5265                         loc +=
5266                           srelgot->reloc_count * sizeof (Elf32_External_Rela);
5267                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5268                         ++srelgot->reloc_count;
5269                       }
5270                     else
5271                       bfd_put_32 (output_bfd, h->root.u.def.value - TP_OFFSET,
5272                                   sgot->contents + off);
5273                   }
5274               }
5275           }
5276         break;
5277
5278           /* DON'T   fall through.  */
5279
5280         default:
5281           /* OLD_NDS32_RELOC.  */
5282
5283           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5284                                         contents, offset, relocation, addend);
5285           goto check_reloc;
5286         }
5287
5288       switch ((int) r_type)
5289         {
5290         case R_NDS32_20_RELA:
5291         case R_NDS32_5_RELA:
5292         case R_NDS32_9_PCREL_RELA:
5293         case R_NDS32_WORD_9_PCREL_RELA:
5294         case R_NDS32_10_UPCREL_RELA:
5295         case R_NDS32_15_PCREL_RELA:
5296         case R_NDS32_17_PCREL_RELA:
5297         case R_NDS32_25_PCREL_RELA:
5298         case R_NDS32_25_ABS_RELA:
5299         case R_NDS32_HI20_RELA:
5300         case R_NDS32_LO12S3_RELA:
5301         case R_NDS32_LO12S2_RELA:
5302         case R_NDS32_LO12S2_DP_RELA:
5303         case R_NDS32_LO12S2_SP_RELA:
5304         case R_NDS32_LO12S1_RELA:
5305         case R_NDS32_LO12S0_RELA:
5306         case R_NDS32_LO12S0_ORI_RELA:
5307         case R_NDS32_SDA16S3_RELA:
5308         case R_NDS32_SDA17S2_RELA:
5309         case R_NDS32_SDA18S1_RELA:
5310         case R_NDS32_SDA19S0_RELA:
5311         case R_NDS32_SDA15S3_RELA:
5312         case R_NDS32_SDA15S2_RELA:
5313         case R_NDS32_SDA12S2_DP_RELA:
5314         case R_NDS32_SDA12S2_SP_RELA:
5315         case R_NDS32_SDA15S1_RELA:
5316         case R_NDS32_SDA15S0_RELA:
5317         case R_NDS32_SDA_FP7U2_RELA:
5318         case R_NDS32_9_PLTREL:
5319         case R_NDS32_25_PLTREL:
5320         case R_NDS32_GOT20:
5321         case R_NDS32_GOT_HI20:
5322         case R_NDS32_GOT_LO12:
5323         case R_NDS32_GOT_LO15:
5324         case R_NDS32_GOT_LO19:
5325         case R_NDS32_GOT15S2_RELA:
5326         case R_NDS32_GOT17S2_RELA:
5327         case R_NDS32_GOTPC20:
5328         case R_NDS32_GOTPC_HI20:
5329         case R_NDS32_GOTPC_LO12:
5330         case R_NDS32_GOTOFF:
5331         case R_NDS32_GOTOFF_HI20:
5332         case R_NDS32_GOTOFF_LO12:
5333         case R_NDS32_GOTOFF_LO15:
5334         case R_NDS32_GOTOFF_LO19:
5335         case R_NDS32_PLTREL_HI20:
5336         case R_NDS32_PLTREL_LO12:
5337         case R_NDS32_PLT_GOTREL_HI20:
5338         case R_NDS32_PLT_GOTREL_LO12:
5339         case R_NDS32_PLT_GOTREL_LO15:
5340         case R_NDS32_PLT_GOTREL_LO19:
5341         case R_NDS32_PLT_GOTREL_LO20:
5342         case R_NDS32_17IFC_PCREL_RELA:
5343         case R_NDS32_10IFCU_PCREL_RELA:
5344         case R_NDS32_TLS_LE_HI20:
5345         case R_NDS32_TLS_LE_LO12:
5346         case R_NDS32_TLS_IE_HI20:
5347         case R_NDS32_TLS_IE_LO12S2:
5348         case R_NDS32_TLS_LE_20:
5349         case R_NDS32_TLS_LE_15S0:
5350         case R_NDS32_TLS_LE_15S1:
5351         case R_NDS32_TLS_LE_15S2:
5352           /* Instruction related relocs must handle endian properly.  */
5353           /* NOTE: PIC IS NOT HANDLE YET; DO IT LATER.  */
5354           r = nds32_elf_final_link_relocate (howto, input_bfd,
5355                                              input_section, contents,
5356                                              rel->r_offset, relocation,
5357                                              rel->r_addend);
5358           break;
5359
5360         default:
5361           /* All other relocs can use default handler.  */
5362           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5363                                         contents, rel->r_offset,
5364                                         relocation, rel->r_addend);
5365           break;
5366         }
5367
5368 check_reloc:
5369
5370       if (r != bfd_reloc_ok)
5371         {
5372           /* FIXME: This should be generic enough to go in a utility.  */
5373           const char *name;
5374
5375           if (h != NULL)
5376             name = h->root.root.string;
5377           else
5378             {
5379               name = bfd_elf_string_from_elf_section
5380                       (input_bfd, symtab_hdr->sh_link, sym->st_name);
5381               if (name == NULL || *name == '\0')
5382                 name = bfd_section_name (input_bfd, sec);
5383             }
5384
5385           if (errmsg != NULL)
5386             goto common_error;
5387
5388           switch (r)
5389             {
5390             case bfd_reloc_overflow:
5391               (*info->callbacks->reloc_overflow)
5392                 (info, (h ? &h->root : NULL), name, howto->name,
5393                  (bfd_vma) 0, input_bfd, input_section, offset);
5394               break;
5395
5396             case bfd_reloc_undefined:
5397               (*info->callbacks->undefined_symbol)
5398                 (info, name, input_bfd, input_section, offset, TRUE);
5399               break;
5400
5401             case bfd_reloc_outofrange:
5402               errmsg = _("internal error: out of range error");
5403               goto common_error;
5404
5405             case bfd_reloc_notsupported:
5406               errmsg = _("internal error: unsupported relocation error");
5407               goto common_error;
5408
5409             case bfd_reloc_dangerous:
5410               errmsg = _("internal error: dangerous error");
5411               goto common_error;
5412
5413             default:
5414               errmsg = _("internal error: unknown error");
5415               /* Fall through.  */
5416
5417             common_error:
5418               (*info->callbacks->warning) (info, errmsg, name, input_bfd,
5419                                            input_section, offset);
5420               break;
5421             }
5422         }
5423     }
5424
5425   return ret;
5426 }
5427
5428 /* Finish up dynamic symbol handling.  We set the contents of various
5429    dynamic sections here.  */
5430
5431 static bfd_boolean
5432 nds32_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
5433                                  struct elf_link_hash_entry *h, Elf_Internal_Sym *sym)
5434 {
5435   struct elf_nds32_link_hash_table *htab;
5436   bfd_byte *loc;
5437
5438   htab = nds32_elf_hash_table (info);
5439
5440   if (h->plt.offset != (bfd_vma) - 1)
5441     {
5442       asection *splt;
5443       asection *sgot;
5444       asection *srela;
5445
5446       bfd_vma plt_index;
5447       bfd_vma got_offset;
5448       bfd_vma local_plt_offset;
5449       Elf_Internal_Rela rela;
5450
5451       /* This symbol has an entry in the procedure linkage table.  Set
5452          it up.  */
5453
5454       BFD_ASSERT (h->dynindx != -1);
5455
5456       splt = htab->root.splt;
5457       sgot = htab->root.sgotplt;
5458       srela = htab->root.srelplt;
5459       BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
5460
5461       /* Get the index in the procedure linkage table which
5462          corresponds to this symbol.  This is the index of this symbol
5463          in all the symbols for which we are making plt entries.  The
5464          first entry in the procedure linkage table is reserved.  */
5465       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
5466
5467       /* Get the offset into the .got table of the entry that
5468          corresponds to this function.  Each .got entry is 4 bytes.
5469          The first three are reserved.  */
5470       got_offset = (plt_index + 3) * 4;
5471
5472       /* Fill in the entry in the procedure linkage table.  */
5473       if (!bfd_link_pic (info))
5474         {
5475           unsigned long insn;
5476
5477           insn = PLT_ENTRY_WORD0 + (((sgot->output_section->vma
5478                                       + sgot->output_offset + got_offset) >> 12)
5479                                     & 0xfffff);
5480           bfd_putb32 (insn, splt->contents + h->plt.offset);
5481
5482           insn = PLT_ENTRY_WORD1 + (((sgot->output_section->vma
5483                                       + sgot->output_offset + got_offset) & 0x0fff)
5484                                     >> 2);
5485           bfd_putb32 (insn, splt->contents + h->plt.offset + 4);
5486
5487           insn = PLT_ENTRY_WORD2;
5488           bfd_putb32 (insn, splt->contents + h->plt.offset + 8);
5489
5490           insn = PLT_ENTRY_WORD3 + (plt_index & 0x7ffff);
5491           bfd_putb32 (insn, splt->contents + h->plt.offset + 12);
5492
5493           insn = PLT_ENTRY_WORD4
5494                  + (((unsigned int) ((-(h->plt.offset + 16)) >> 1)) & 0xffffff);
5495           bfd_putb32 (insn, splt->contents + h->plt.offset + 16);
5496           local_plt_offset = 12;
5497         }
5498       else
5499         {
5500           /* sda_base must be set at this time.  */
5501           unsigned long insn;
5502           long offset;
5503
5504           /* FIXME, sda_base is 65536, it will damage opcode.  */
5505           /* insn = PLT_PIC_ENTRY_WORD0 + (((got_offset - sda_base) >> 2) & 0x7fff); */
5506           offset = sgot->output_section->vma + sgot->output_offset + got_offset
5507                    - elf_gp (output_bfd);
5508           insn = PLT_PIC_ENTRY_WORD0 + ((offset >> 12) & 0xfffff);
5509           bfd_putb32 (insn, splt->contents + h->plt.offset);
5510
5511           insn = PLT_PIC_ENTRY_WORD1 + (offset & 0xfff);
5512           bfd_putb32 (insn, splt->contents + h->plt.offset + 4);
5513
5514           insn = PLT_PIC_ENTRY_WORD2;
5515           bfd_putb32 (insn, splt->contents + h->plt.offset + 8);
5516
5517           insn = PLT_PIC_ENTRY_WORD3;
5518           bfd_putb32 (insn, splt->contents + h->plt.offset + 12);
5519
5520           insn = PLT_PIC_ENTRY_WORD4 + (plt_index & 0x7fffff);
5521           bfd_putb32 (insn, splt->contents + h->plt.offset + 16);
5522
5523           insn = PLT_PIC_ENTRY_WORD5
5524             + (((unsigned int) ((-(h->plt.offset + 20)) >> 1)) & 0xffffff);
5525           bfd_putb32 (insn, splt->contents + h->plt.offset + 20);
5526
5527           local_plt_offset = 16;
5528         }
5529
5530       /* Fill in the entry in the global offset table,
5531          so it will fall through to the next instruction for the first time.  */
5532       bfd_put_32 (output_bfd,
5533                   (splt->output_section->vma + splt->output_offset
5534                    + h->plt.offset + local_plt_offset),
5535                   sgot->contents + got_offset);
5536
5537       /* Fill in the entry in the .rela.plt section.  */
5538       rela.r_offset = (sgot->output_section->vma
5539                        + sgot->output_offset + got_offset);
5540       rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_JMP_SLOT);
5541       rela.r_addend = 0;
5542       loc = srela->contents;
5543       loc += plt_index * sizeof (Elf32_External_Rela);
5544       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5545
5546       if (!h->def_regular)
5547         {
5548           /* Mark the symbol as undefined, rather than as defined in
5549              the .plt section.  Leave the value alone.  */
5550           sym->st_shndx = SHN_UNDEF;
5551           if (!h->ref_regular_nonweak)
5552             sym->st_value = 0;
5553         }
5554     }
5555
5556   if (h->got.offset != (bfd_vma) - 1)
5557     {
5558       asection *sgot;
5559       asection *srela;
5560       Elf_Internal_Rela rela;
5561
5562       /* This symbol has an entry in the global offset table.
5563          Set it up.  */
5564
5565       sgot = htab->root.sgot;
5566       srela = htab->root.srelgot;
5567       BFD_ASSERT (sgot != NULL && srela != NULL);
5568
5569       rela.r_offset = (sgot->output_section->vma
5570                        + sgot->output_offset + (h->got.offset & ~1));
5571
5572       /* If this is a -Bsymbolic link, and the symbol is defined
5573          locally, we just want to emit a RELATIVE reloc.  Likewise if
5574          the symbol was forced to be local because of a version file.
5575          The entry in the global offset table will already have been
5576          initialized in the relocate_section function.  */
5577       if (bfd_link_pic (info)
5578           && (info->symbolic
5579               || h->dynindx == -1 || h->forced_local) && h->def_regular)
5580         {
5581           rela.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
5582           rela.r_addend = (h->root.u.def.value
5583                            + h->root.u.def.section->output_section->vma
5584                            + h->root.u.def.section->output_offset);
5585         }
5586       else
5587         {
5588           BFD_ASSERT ((h->got.offset & 1) == 0);
5589           bfd_put_32 (output_bfd, (bfd_vma) 0,
5590                       sgot->contents + h->got.offset);
5591           rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_GLOB_DAT);
5592           rela.r_addend = 0;
5593         }
5594
5595       loc = srela->contents;
5596       loc += srela->reloc_count * sizeof (Elf32_External_Rela);
5597       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5598       ++srela->reloc_count;
5599     }
5600
5601   if (h->needs_copy)
5602     {
5603       asection *s;
5604       Elf_Internal_Rela rela;
5605
5606       /* This symbols needs a copy reloc.  Set it up.  */
5607
5608       BFD_ASSERT (h->dynindx != -1
5609                   && (h->root.type == bfd_link_hash_defined
5610                       || h->root.type == bfd_link_hash_defweak));
5611
5612       s = bfd_get_section_by_name (h->root.u.def.section->owner, ".rela.bss");
5613       BFD_ASSERT (s != NULL);
5614
5615       rela.r_offset = (h->root.u.def.value
5616                        + h->root.u.def.section->output_section->vma
5617                        + h->root.u.def.section->output_offset);
5618       rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_COPY);
5619       rela.r_addend = 0;
5620       loc = s->contents;
5621       loc += s->reloc_count * sizeof (Elf32_External_Rela);
5622       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5623       ++s->reloc_count;
5624     }
5625
5626   /* Mark some specially defined symbols as absolute.  */
5627   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
5628       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
5629     sym->st_shndx = SHN_ABS;
5630
5631   return TRUE;
5632 }
5633
5634
5635 /* Finish up the dynamic sections.  */
5636
5637 static bfd_boolean
5638 nds32_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
5639 {
5640   struct elf_nds32_link_hash_table *htab;
5641   bfd *dynobj;
5642   asection *sdyn;
5643   asection *sgot;
5644
5645   htab = nds32_elf_hash_table (info);
5646   dynobj = htab->root.dynobj;
5647
5648   sgot = htab->root.sgotplt;
5649   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
5650
5651   if (htab->root.dynamic_sections_created)
5652     {
5653       asection *splt;
5654       Elf32_External_Dyn *dyncon, *dynconend;
5655
5656       BFD_ASSERT (sgot != NULL && sdyn != NULL);
5657
5658       dyncon = (Elf32_External_Dyn *) sdyn->contents;
5659       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5660
5661       for (; dyncon < dynconend; dyncon++)
5662         {
5663           Elf_Internal_Dyn dyn;
5664           asection *s;
5665
5666           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5667
5668           switch (dyn.d_tag)
5669             {
5670             default:
5671               break;
5672
5673             case DT_PLTGOT:
5674               s = htab->root.sgotplt;
5675               goto get_vma;
5676             case DT_JMPREL:
5677               s = htab->root.srelplt;
5678             get_vma:
5679               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5680               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5681               break;
5682
5683             case DT_PLTRELSZ:
5684               s = htab->root.srelplt;
5685               dyn.d_un.d_val = s->size;
5686               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5687               break;
5688
5689             case DT_RELASZ:
5690               /* My reading of the SVR4 ABI indicates that the
5691                  procedure linkage table relocs (DT_JMPREL) should be
5692                  included in the overall relocs (DT_RELA).  This is
5693                  what Solaris does.  However, UnixWare can not handle
5694                  that case.  Therefore, we override the DT_RELASZ entry
5695                  here to make it not include the JMPREL relocs.  Since
5696                  the linker script arranges for .rela.plt to follow all
5697                  other relocation sections, we don't have to worry
5698                  about changing the DT_RELA entry.  */
5699               if (htab->root.srelplt != NULL)
5700                 {
5701                   s = htab->root.srelplt;
5702                   dyn.d_un.d_val -= s->size;
5703                 }
5704               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5705               break;
5706             }
5707         }
5708
5709       /* Fill in the first entry in the procedure linkage table.  */
5710       splt = htab->root.splt;
5711       if (splt && splt->size > 0)
5712         {
5713           if (bfd_link_pic (info))
5714             {
5715               unsigned long insn;
5716               long offset;
5717
5718               /* FIXME, sda_base is 65536, it will damage opcode.  */
5719               /* insn = PLT_PIC_ENTRY_WORD0 + (((got_offset - sda_base) >> 2) & 0x7fff); */
5720               offset = sgot->output_section->vma + sgot->output_offset + 4
5721                        - elf_gp (output_bfd);
5722               insn = PLT0_PIC_ENTRY_WORD0 | ((offset >> 12) & 0xfffff);
5723               bfd_putb32 (insn, splt->contents);
5724
5725               /* insn = PLT0_PIC_ENTRY_WORD0 | (((8 - sda_base) >> 2) & 0x7fff) ; */
5726               /* here has a typo?  */
5727               insn = PLT0_PIC_ENTRY_WORD1 | (offset & 0xfff);
5728               bfd_putb32 (insn, splt->contents + 4);
5729
5730               insn = PLT0_PIC_ENTRY_WORD2;
5731               bfd_putb32 (insn, splt->contents + 8);
5732
5733               insn = PLT0_PIC_ENTRY_WORD3;
5734               bfd_putb32 (insn, splt->contents + 12);
5735
5736               insn = PLT0_PIC_ENTRY_WORD4;
5737               bfd_putb32 (insn, splt->contents + 16);
5738
5739               insn = PLT0_PIC_ENTRY_WORD5;
5740               bfd_putb32 (insn, splt->contents + 20);
5741             }
5742           else
5743             {
5744               unsigned long insn;
5745               unsigned long addr;
5746
5747               /* addr = .got + 4 */
5748               addr = sgot->output_section->vma + sgot->output_offset + 4;
5749               insn = PLT0_ENTRY_WORD0 | ((addr >> 12) & 0xfffff);
5750               bfd_putb32 (insn, splt->contents);
5751
5752               insn = PLT0_ENTRY_WORD1 | (addr & 0x0fff);
5753               bfd_putb32 (insn, splt->contents + 4);
5754
5755               insn = PLT0_ENTRY_WORD2;
5756               bfd_putb32 (insn, splt->contents + 8);
5757
5758               insn = PLT0_ENTRY_WORD3;
5759               bfd_putb32 (insn, splt->contents + 12);
5760
5761               insn = PLT0_ENTRY_WORD4;
5762               bfd_putb32 (insn, splt->contents + 16);
5763             }
5764
5765           elf_section_data (splt->output_section)->this_hdr.sh_entsize =
5766             PLT_ENTRY_SIZE;
5767         }
5768     }
5769
5770   /* Fill in the first three entries in the global offset table.  */
5771   if (sgot && sgot->size > 0)
5772     {
5773       if (sdyn == NULL)
5774         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
5775       else
5776         bfd_put_32 (output_bfd,
5777                     sdyn->output_section->vma + sdyn->output_offset,
5778                     sgot->contents);
5779       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
5780       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
5781
5782       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
5783     }
5784
5785   return TRUE;
5786 }
5787 \f
5788
5789 /* Set the right machine number.  */
5790
5791 static bfd_boolean
5792 nds32_elf_object_p (bfd *abfd)
5793 {
5794   static unsigned int cur_arch = 0;
5795
5796   if (E_N1_ARCH != (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH))
5797     {
5798       /* E_N1_ARCH is a wild card, so it is set only when no others exist.  */
5799       cur_arch = (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH);
5800     }
5801
5802   switch (cur_arch)
5803     {
5804     default:
5805     case E_N1_ARCH:
5806       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1);
5807       break;
5808     case E_N1H_ARCH:
5809       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h);
5810       break;
5811     case E_NDS_ARCH_STAR_V2_0:
5812       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v2);
5813       break;
5814     case E_NDS_ARCH_STAR_V3_0:
5815       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3);
5816       break;
5817     case E_NDS_ARCH_STAR_V3_M:
5818       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3m);
5819       break;
5820     }
5821
5822   return TRUE;
5823 }
5824
5825 /* Store the machine number in the flags field.  */
5826
5827 static void
5828 nds32_elf_final_write_processing (bfd *abfd,
5829                                   bfd_boolean linker ATTRIBUTE_UNUSED)
5830 {
5831   unsigned long val;
5832   static unsigned int cur_mach = 0;
5833
5834   if (bfd_mach_n1 != bfd_get_mach (abfd))
5835     {
5836       cur_mach = bfd_get_mach (abfd);
5837     }
5838
5839   switch (cur_mach)
5840     {
5841     case bfd_mach_n1:
5842       /* Only happen when object is empty, since the case is abandon.  */
5843       val = E_N1_ARCH;
5844       val |= E_NDS_ABI_AABI;
5845       val |= E_NDS32_ELF_VER_1_4;
5846       break;
5847     case bfd_mach_n1h:
5848       val = E_N1H_ARCH;
5849       break;
5850     case bfd_mach_n1h_v2:
5851       val = E_NDS_ARCH_STAR_V2_0;
5852       break;
5853     case bfd_mach_n1h_v3:
5854       val = E_NDS_ARCH_STAR_V3_0;
5855       break;
5856     case bfd_mach_n1h_v3m:
5857       val = E_NDS_ARCH_STAR_V3_M;
5858       break;
5859     default:
5860       val = 0;
5861       break;
5862     }
5863
5864   elf_elfheader (abfd)->e_flags &= ~EF_NDS_ARCH;
5865   elf_elfheader (abfd)->e_flags |= val;
5866 }
5867
5868 /* Function to keep NDS32 specific file flags.  */
5869
5870 static bfd_boolean
5871 nds32_elf_set_private_flags (bfd *abfd, flagword flags)
5872 {
5873   BFD_ASSERT (!elf_flags_init (abfd)
5874               || elf_elfheader (abfd)->e_flags == flags);
5875
5876   elf_elfheader (abfd)->e_flags = flags;
5877   elf_flags_init (abfd) = TRUE;
5878   return TRUE;
5879 }
5880
5881 static unsigned int
5882 convert_e_flags (unsigned int e_flags, unsigned int arch)
5883 {
5884   if ((e_flags & EF_NDS_ARCH) == E_NDS_ARCH_STAR_V0_9)
5885     {
5886       /* From 0.9 to 1.0.  */
5887       e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V1_0;
5888
5889       /* Invert E_NDS32_HAS_NO_MAC_INST.  */
5890       e_flags ^= E_NDS32_HAS_NO_MAC_INST;
5891       if (arch == E_NDS_ARCH_STAR_V1_0)
5892         {
5893           /* Done.  */
5894           return e_flags;
5895         }
5896     }
5897
5898   /* From 1.0 to 2.0.  */
5899   e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V2_0;
5900
5901   /* Clear E_NDS32_HAS_MFUSR_PC_INST.  */
5902   e_flags &= ~E_NDS32_HAS_MFUSR_PC_INST;
5903
5904   /* Invert E_NDS32_HAS_NO_MAC_INST.  */
5905   e_flags ^= E_NDS32_HAS_NO_MAC_INST;
5906   return e_flags;
5907 }
5908
5909 static bfd_boolean
5910 nds32_check_vec_size (bfd *ibfd)
5911 {
5912   static unsigned int nds32_vec_size = 0;
5913
5914   asection *sec_t = NULL;
5915   bfd_byte *contents = NULL;
5916
5917   sec_t = bfd_get_section_by_name (ibfd, ".nds32_e_flags");
5918
5919   if (sec_t && sec_t->size >= 4)
5920     {
5921       /* Get vec_size in file.  */
5922       unsigned int flag_t;
5923
5924       nds32_get_section_contents (ibfd, sec_t, &contents, TRUE);
5925       flag_t = bfd_get_32 (ibfd, contents);
5926
5927       /* The value could only be 4 or 16.  */
5928
5929       if (!nds32_vec_size)
5930         /* Set if not set yet.  */
5931         nds32_vec_size = (flag_t & 0x3);
5932       else if (nds32_vec_size != (flag_t & 0x3))
5933         {
5934           _bfd_error_handler
5935             /* xgettext:c-format */
5936             (_("%B: ISR vector size mismatch"
5937                " with previous modules, previous %u-byte, current %u-byte"),
5938              ibfd,
5939              nds32_vec_size == 1 ? 4 : nds32_vec_size == 2 ? 16 : 0xffffffff,
5940              (flag_t & 0x3) == 1 ? 4 : (flag_t & 0x3) == 2 ? 16 : 0xffffffff);
5941           return FALSE;
5942         }
5943       else
5944         /* Only keep the first vec_size section.  */
5945         sec_t->flags |= SEC_EXCLUDE;
5946     }
5947
5948   return TRUE;
5949 }
5950
5951 /* Merge backend specific data from an object file to the output
5952    object file when linking.  */
5953
5954 static bfd_boolean
5955 nds32_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
5956 {
5957   bfd *obfd = info->output_bfd;
5958   flagword out_flags;
5959   flagword in_flags;
5960   flagword out_16regs;
5961   flagword in_no_mac;
5962   flagword out_no_mac;
5963   flagword in_16regs;
5964   flagword out_version;
5965   flagword in_version;
5966   flagword out_fpu_config;
5967   flagword in_fpu_config;
5968
5969   /* TODO: Revise to use object-attributes instead.  */
5970   if (!nds32_check_vec_size (ibfd))
5971     return FALSE;
5972
5973   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
5974       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
5975     return TRUE;
5976
5977   if (bfd_little_endian (ibfd) != bfd_little_endian (obfd))
5978     {
5979       _bfd_error_handler
5980         (_("%B: warning: Endian mismatch with previous modules."), ibfd);
5981
5982       bfd_set_error (bfd_error_bad_value);
5983       return FALSE;
5984     }
5985
5986   in_version = elf_elfheader (ibfd)->e_flags & EF_NDS32_ELF_VERSION;
5987   if (in_version == E_NDS32_ELF_VER_1_2)
5988     {
5989       _bfd_error_handler
5990         (_("%B: warning: Older version of object file encountered, "
5991            "Please recompile with current tool chain."), ibfd);
5992     }
5993
5994   /* We may need to merge V1 and V2 arch object files to V2.  */
5995   if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
5996       != (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
5997     {
5998       /* Need to convert version.  */
5999       if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
6000           == E_NDS_ARCH_STAR_RESERVED)
6001         {
6002           elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
6003         }
6004       else if ((elf_elfheader (obfd)->e_flags & EF_NDS_ARCH) == E_NDS_ARCH_STAR_V0_9
6005                || (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
6006                   > (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
6007         {
6008           elf_elfheader (obfd)->e_flags =
6009             convert_e_flags (elf_elfheader (obfd)->e_flags,
6010                              (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH));
6011         }
6012       else
6013         {
6014           elf_elfheader (ibfd)->e_flags =
6015             convert_e_flags (elf_elfheader (ibfd)->e_flags,
6016                              (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH));
6017         }
6018     }
6019
6020   /* Extract some flags.  */
6021   in_flags = elf_elfheader (ibfd)->e_flags
6022              & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
6023                   | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
6024
6025   /* The following flags need special treatment.  */
6026   in_16regs = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
6027   in_no_mac = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
6028   in_fpu_config = elf_elfheader (ibfd)->e_flags & E_NDS32_FPU_REG_CONF;
6029
6030   /* Extract some flags.  */
6031   out_flags = elf_elfheader (obfd)->e_flags
6032               & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
6033                    | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
6034
6035   /* The following flags need special treatment.  */
6036   out_16regs = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
6037   out_no_mac = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
6038   out_fpu_config = elf_elfheader (obfd)->e_flags & E_NDS32_FPU_REG_CONF;
6039   out_version = elf_elfheader (obfd)->e_flags & EF_NDS32_ELF_VERSION;
6040   if (!elf_flags_init (obfd))
6041     {
6042       /* If the input is the default architecture then do not
6043          bother setting the flags for the output architecture,
6044          instead allow future merges to do this.  If no future
6045          merges ever set these flags then they will retain their
6046          unitialised values, which surprise surprise, correspond
6047          to the default values.  */
6048       if (bfd_get_arch_info (ibfd)->the_default)
6049         return TRUE;
6050
6051       elf_flags_init (obfd) = TRUE;
6052       elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
6053
6054       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
6055           && bfd_get_arch_info (obfd)->the_default)
6056         {
6057           return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
6058                                     bfd_get_mach (ibfd));
6059         }
6060
6061       return TRUE;
6062     }
6063
6064   /* Check flag compatibility.  */
6065   if ((in_flags & EF_NDS_ABI) != (out_flags & EF_NDS_ABI))
6066     {
6067       _bfd_error_handler
6068         (_("%B: error: ABI mismatch with previous modules."), ibfd);
6069
6070       bfd_set_error (bfd_error_bad_value);
6071       return FALSE;
6072     }
6073
6074   if ((in_flags & EF_NDS_ARCH) != (out_flags & EF_NDS_ARCH))
6075     {
6076       if (((in_flags & EF_NDS_ARCH) != E_N1_ARCH))
6077         {
6078           _bfd_error_handler
6079             (_("%B: error: Instruction set mismatch with previous modules."), ibfd);
6080
6081           bfd_set_error (bfd_error_bad_value);
6082           return FALSE;
6083         }
6084     }
6085
6086   /* When linking with V1.2 and V1.3 objects together the output is V1.2.
6087      and perf ext1 and DIV are mergerd to perf ext1.  */
6088   if (in_version == E_NDS32_ELF_VER_1_2 || out_version == E_NDS32_ELF_VER_1_2)
6089     {
6090       elf_elfheader (obfd)->e_flags =
6091         (in_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6092         | (out_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6093         | (((in_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6094            ?  E_NDS32_HAS_EXT_INST : 0)
6095         | (((out_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6096            ?  E_NDS32_HAS_EXT_INST : 0)
6097         | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
6098         | ((in_version > out_version) ? out_version : in_version);
6099     }
6100   else
6101     {
6102       if (in_version != out_version)
6103         _bfd_error_handler
6104           /* xgettext:c-format */
6105           (_("%B: warning: Incompatible elf-versions %s and  %s."),
6106            ibfd, nds32_elfver_strtab[out_version],
6107            nds32_elfver_strtab[in_version]);
6108
6109       elf_elfheader (obfd)->e_flags = in_flags | out_flags
6110         | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
6111         | (in_fpu_config > out_fpu_config ? in_fpu_config : out_fpu_config)
6112         | (in_version > out_version ?  out_version : in_version);
6113     }
6114
6115   return TRUE;
6116 }
6117
6118 /* Display the flags field.  */
6119
6120 static bfd_boolean
6121 nds32_elf_print_private_bfd_data (bfd *abfd, void *ptr)
6122 {
6123   FILE *file = (FILE *) ptr;
6124
6125   BFD_ASSERT (abfd != NULL && ptr != NULL);
6126
6127   _bfd_elf_print_private_bfd_data (abfd, ptr);
6128
6129   fprintf (file, _("private flags = %lx"), elf_elfheader (abfd)->e_flags);
6130
6131   switch (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH)
6132     {
6133     default:
6134     case E_N1_ARCH:
6135       fprintf (file, _(": n1 instructions"));
6136       break;
6137     case E_N1H_ARCH:
6138       fprintf (file, _(": n1h instructions"));
6139       break;
6140     }
6141
6142   fputc ('\n', file);
6143
6144   return TRUE;
6145 }
6146
6147 static unsigned int
6148 nds32_elf_action_discarded (asection *sec)
6149 {
6150
6151   if (strncmp
6152       (".gcc_except_table", sec->name, sizeof (".gcc_except_table") - 1) == 0)
6153     return 0;
6154
6155   return _bfd_elf_default_action_discarded (sec);
6156 }
6157
6158 static asection *
6159 nds32_elf_gc_mark_hook (asection *sec, struct bfd_link_info *info,
6160                         Elf_Internal_Rela *rel, struct elf_link_hash_entry *h,
6161                         Elf_Internal_Sym *sym)
6162 {
6163   if (h != NULL)
6164     switch (ELF32_R_TYPE (rel->r_info))
6165       {
6166       case R_NDS32_GNU_VTINHERIT:
6167       case R_NDS32_GNU_VTENTRY:
6168       case R_NDS32_RELA_GNU_VTINHERIT:
6169       case R_NDS32_RELA_GNU_VTENTRY:
6170         return NULL;
6171       }
6172
6173   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6174 }
6175
6176 static bfd_boolean
6177 nds32_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, asection *sec,
6178                          const Elf_Internal_Rela *relocs)
6179 {
6180   /* Update the got entry reference counts for the section being removed.  */
6181   Elf_Internal_Shdr *symtab_hdr;
6182   struct elf_link_hash_entry **sym_hashes;
6183   bfd_signed_vma *local_got_refcounts;
6184   const Elf_Internal_Rela *rel, *relend;
6185
6186   elf_section_data (sec)->local_dynrel = NULL;
6187
6188   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6189   sym_hashes = elf_sym_hashes (abfd);
6190   local_got_refcounts = elf_local_got_refcounts (abfd);
6191
6192   relend = relocs + sec->reloc_count;
6193   for (rel = relocs; rel < relend; rel++)
6194     {
6195       unsigned long r_symndx;
6196       struct elf_link_hash_entry *h = NULL;
6197
6198       r_symndx = ELF32_R_SYM (rel->r_info);
6199       if (r_symndx >= symtab_hdr->sh_info)
6200         {
6201           /* External symbol.  */
6202           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6203           while (h->root.type == bfd_link_hash_indirect
6204                  || h->root.type == bfd_link_hash_warning)
6205             h = (struct elf_link_hash_entry *) h->root.u.i.link;
6206         }
6207
6208       switch (ELF32_R_TYPE (rel->r_info))
6209         {
6210         case R_NDS32_GOT_HI20:
6211         case R_NDS32_GOT_LO12:
6212         case R_NDS32_GOT_LO15:
6213         case R_NDS32_GOT_LO19:
6214         case R_NDS32_GOT17S2_RELA:
6215         case R_NDS32_GOT15S2_RELA:
6216         case R_NDS32_GOTOFF:
6217         case R_NDS32_GOTOFF_HI20:
6218         case R_NDS32_GOTOFF_LO12:
6219         case R_NDS32_GOTOFF_LO15:
6220         case R_NDS32_GOTOFF_LO19:
6221         case R_NDS32_GOT20:
6222         case R_NDS32_GOTPC_HI20:
6223         case R_NDS32_GOTPC_LO12:
6224         case R_NDS32_GOTPC20:
6225           if (h != NULL)
6226             {
6227               if (h->got.refcount > 0)
6228                 h->got.refcount--;
6229             }
6230           else
6231             {
6232               if (local_got_refcounts && local_got_refcounts[r_symndx] > 0)
6233                 local_got_refcounts[r_symndx]--;
6234             }
6235           break;
6236
6237         case R_NDS32_16_RELA:
6238         case R_NDS32_20_RELA:
6239         case R_NDS32_5_RELA:
6240         case R_NDS32_32_RELA:
6241         case R_NDS32_HI20_RELA:
6242         case R_NDS32_LO12S3_RELA:
6243         case R_NDS32_LO12S2_RELA:
6244         case R_NDS32_LO12S2_DP_RELA:
6245         case R_NDS32_LO12S2_SP_RELA:
6246         case R_NDS32_LO12S1_RELA:
6247         case R_NDS32_LO12S0_RELA:
6248         case R_NDS32_LO12S0_ORI_RELA:
6249         case R_NDS32_SDA16S3_RELA:
6250         case R_NDS32_SDA17S2_RELA:
6251         case R_NDS32_SDA18S1_RELA:
6252         case R_NDS32_SDA19S0_RELA:
6253         case R_NDS32_SDA15S3_RELA:
6254         case R_NDS32_SDA15S2_RELA:
6255         case R_NDS32_SDA12S2_DP_RELA:
6256         case R_NDS32_SDA12S2_SP_RELA:
6257         case R_NDS32_SDA15S1_RELA:
6258         case R_NDS32_SDA15S0_RELA:
6259         case R_NDS32_SDA_FP7U2_RELA:
6260         case R_NDS32_15_PCREL_RELA:
6261         case R_NDS32_17_PCREL_RELA:
6262         case R_NDS32_25_PCREL_RELA:
6263           if (h != NULL)
6264             {
6265               struct elf_nds32_link_hash_entry *eh;
6266               struct elf_nds32_dyn_relocs **pp;
6267               struct elf_nds32_dyn_relocs *p;
6268
6269               if (!bfd_link_pic (info) && h->plt.refcount > 0)
6270                 h->plt.refcount -= 1;
6271
6272               eh = (struct elf_nds32_link_hash_entry *) h;
6273
6274               for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
6275                 if (p->sec == sec)
6276                   {
6277                     if (ELF32_R_TYPE (rel->r_info) == R_NDS32_15_PCREL_RELA
6278                         || ELF32_R_TYPE (rel->r_info) == R_NDS32_17_PCREL_RELA
6279                         || ELF32_R_TYPE (rel->r_info) == R_NDS32_25_PCREL_RELA)
6280                       p->pc_count -= 1;
6281                     p->count -= 1;
6282                     if (p->count == 0)
6283                       *pp = p->next;
6284                     break;
6285                   }
6286             }
6287           break;
6288
6289         case R_NDS32_9_PLTREL:
6290         case R_NDS32_25_PLTREL:
6291           if (h != NULL)
6292             {
6293               if (h->plt.refcount > 0)
6294                 h->plt.refcount--;
6295             }
6296           break;
6297
6298         default:
6299           break;
6300         }
6301     }
6302
6303   return TRUE;
6304 }
6305
6306 /* Look through the relocs for a section during the first phase.
6307    Since we don't do .gots or .plts, we just need to consider the
6308    virtual table relocs for gc.  */
6309
6310 static bfd_boolean
6311 nds32_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
6312                         asection *sec, const Elf_Internal_Rela *relocs)
6313 {
6314   Elf_Internal_Shdr *symtab_hdr;
6315   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
6316   const Elf_Internal_Rela *rel;
6317   const Elf_Internal_Rela *rel_end;
6318   struct elf_nds32_link_hash_table *htab;
6319   bfd *dynobj;
6320   asection *sreloc = NULL;
6321
6322   if (bfd_link_relocatable (info))
6323     return TRUE;
6324
6325   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6326   sym_hashes = elf_sym_hashes (abfd);
6327   sym_hashes_end =
6328     sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
6329   if (!elf_bad_symtab (abfd))
6330     sym_hashes_end -= symtab_hdr->sh_info;
6331
6332   htab = nds32_elf_hash_table (info);
6333   dynobj = htab->root.dynobj;
6334
6335   rel_end = relocs + sec->reloc_count;
6336   for (rel = relocs; rel < rel_end; rel++)
6337     {
6338       enum elf_nds32_reloc_type r_type;
6339       struct elf_link_hash_entry *h;
6340       unsigned long r_symndx;
6341       int tls_type, old_tls_type;
6342
6343       r_symndx = ELF32_R_SYM (rel->r_info);
6344       r_type = ELF32_R_TYPE (rel->r_info);
6345       if (r_symndx < symtab_hdr->sh_info)
6346         h = NULL;
6347       else
6348         {
6349           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6350           while (h->root.type == bfd_link_hash_indirect
6351                  || h->root.type == bfd_link_hash_warning)
6352             h = (struct elf_link_hash_entry *) h->root.u.i.link;
6353         }
6354
6355       /* Some relocs require a global offset table.  We create
6356          got section here, since these relocation need got section
6357          and it is not created yet.  */
6358       if (htab->root.sgot == NULL)
6359         {
6360           switch (r_type)
6361             {
6362             case R_NDS32_GOT_HI20:
6363             case R_NDS32_GOT_LO12:
6364             case R_NDS32_GOT_LO15:
6365             case R_NDS32_GOT_LO19:
6366             case R_NDS32_GOT17S2_RELA:
6367             case R_NDS32_GOT15S2_RELA:
6368             case R_NDS32_GOTOFF:
6369             case R_NDS32_GOTOFF_HI20:
6370             case R_NDS32_GOTOFF_LO12:
6371             case R_NDS32_GOTOFF_LO15:
6372             case R_NDS32_GOTOFF_LO19:
6373             case R_NDS32_GOTPC20:
6374             case R_NDS32_GOTPC_HI20:
6375             case R_NDS32_GOTPC_LO12:
6376             case R_NDS32_GOT20:
6377             case R_NDS32_TLS_IE_HI20:
6378             case R_NDS32_TLS_IE_LO12S2:
6379               if (dynobj == NULL)
6380                 htab->root.dynobj = dynobj = abfd;
6381               if (!_bfd_elf_create_got_section (dynobj, info))
6382                 return FALSE;
6383               break;
6384
6385             default:
6386               break;
6387             }
6388         }
6389
6390       switch ((int) r_type)
6391         {
6392         case R_NDS32_GOT_HI20:
6393         case R_NDS32_GOT_LO12:
6394         case R_NDS32_GOT_LO15:
6395         case R_NDS32_GOT_LO19:
6396         case R_NDS32_GOT20:
6397         case R_NDS32_TLS_IE_HI20:
6398         case R_NDS32_TLS_IE_LO12S2:
6399           switch (r_type)
6400             {
6401             case R_NDS32_TLS_IE_HI20:
6402             case R_NDS32_TLS_IE_LO12S2:
6403               tls_type = GOT_TLS_IE;
6404               break;
6405             default:
6406               tls_type = GOT_NORMAL;
6407               break;
6408             }
6409           if (h != NULL)
6410             {
6411               old_tls_type = elf32_nds32_hash_entry (h)->tls_type;
6412               h->got.refcount += 1;
6413             }
6414           else
6415             {
6416               bfd_signed_vma *local_got_refcounts;
6417
6418               /* This is a global offset table entry for a local
6419                  symbol.  */
6420               local_got_refcounts = elf_local_got_refcounts (abfd);
6421               if (local_got_refcounts == NULL)
6422                 {
6423                   bfd_size_type size;
6424
6425                   size = symtab_hdr->sh_info;
6426                   size *= sizeof (bfd_signed_vma);
6427                   local_got_refcounts = (bfd_signed_vma *) bfd_zalloc (abfd, size);
6428                   if (local_got_refcounts == NULL)
6429                     return FALSE;
6430                   elf_local_got_refcounts (abfd) = local_got_refcounts;
6431                 }
6432               local_got_refcounts[r_symndx] += 1;
6433               old_tls_type = elf32_nds32_local_got_tls_type (abfd)[r_symndx];
6434             }
6435
6436           /* We will already have issued an error message if there
6437              is a TLS/non-TLS mismatch, based on the symbol
6438              type.  So just combine any TLS types needed.  */
6439           if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
6440               && tls_type != GOT_NORMAL)
6441             tls_type |= old_tls_type;
6442
6443           if (old_tls_type != tls_type)
6444             {
6445               if (h != NULL)
6446                 elf32_nds32_hash_entry (h)->tls_type = tls_type;
6447               else
6448                 elf32_nds32_local_got_tls_type (abfd)[r_symndx] = tls_type;
6449             }
6450           break;
6451         case R_NDS32_9_PLTREL:
6452         case R_NDS32_25_PLTREL:
6453         case R_NDS32_PLTREL_HI20:
6454         case R_NDS32_PLTREL_LO12:
6455         case R_NDS32_PLT_GOTREL_HI20:
6456         case R_NDS32_PLT_GOTREL_LO12:
6457         case R_NDS32_PLT_GOTREL_LO15:
6458         case R_NDS32_PLT_GOTREL_LO19:
6459         case R_NDS32_PLT_GOTREL_LO20:
6460
6461           /* This symbol requires a procedure linkage table entry.  We
6462              actually build the entry in adjust_dynamic_symbol,
6463              because this might be a case of linking PIC code without
6464              linking in any dynamic objects, in which case we don't
6465              need to generate a procedure linkage table after all.  */
6466
6467           /* If this is a local symbol, we resolve it directly without
6468              creating a procedure linkage table entry.  */
6469           if (h == NULL)
6470             continue;
6471
6472           if (h->forced_local)
6473             break;
6474
6475           elf32_nds32_hash_entry (h)->tls_type = GOT_NORMAL;
6476           h->needs_plt = 1;
6477           h->plt.refcount += 1;
6478           break;
6479
6480         case R_NDS32_16_RELA:
6481         case R_NDS32_20_RELA:
6482         case R_NDS32_5_RELA:
6483         case R_NDS32_32_RELA:
6484         case R_NDS32_HI20_RELA:
6485         case R_NDS32_LO12S3_RELA:
6486         case R_NDS32_LO12S2_RELA:
6487         case R_NDS32_LO12S2_DP_RELA:
6488         case R_NDS32_LO12S2_SP_RELA:
6489         case R_NDS32_LO12S1_RELA:
6490         case R_NDS32_LO12S0_RELA:
6491         case R_NDS32_LO12S0_ORI_RELA:
6492         case R_NDS32_SDA16S3_RELA:
6493         case R_NDS32_SDA17S2_RELA:
6494         case R_NDS32_SDA18S1_RELA:
6495         case R_NDS32_SDA19S0_RELA:
6496         case R_NDS32_SDA15S3_RELA:
6497         case R_NDS32_SDA15S2_RELA:
6498         case R_NDS32_SDA12S2_DP_RELA:
6499         case R_NDS32_SDA12S2_SP_RELA:
6500         case R_NDS32_SDA15S1_RELA:
6501         case R_NDS32_SDA15S0_RELA:
6502         case R_NDS32_SDA_FP7U2_RELA:
6503         case R_NDS32_15_PCREL_RELA:
6504         case R_NDS32_17_PCREL_RELA:
6505         case R_NDS32_25_PCREL_RELA:
6506
6507           if (h != NULL && !bfd_link_pic (info))
6508             {
6509               h->non_got_ref = 1;
6510               h->plt.refcount += 1;
6511             }
6512
6513           /* If we are creating a shared library, and this is a reloc against
6514              a global symbol, or a non PC relative reloc against a local
6515              symbol, then we need to copy the reloc into the shared library.
6516              However, if we are linking with -Bsymbolic, we do not need to
6517              copy a reloc against a global symbol which is defined in an
6518              object we are including in the link (i.e., DEF_REGULAR is set).
6519              At this point we have not seen all the input files, so it is
6520              possible that DEF_REGULAR is not set now but will be set later
6521              (it is never cleared).  We account for that possibility below by
6522              storing information in the dyn_relocs field of the hash table
6523              entry.  A similar situation occurs when creating shared libraries
6524              and symbol visibility changes render the symbol local.
6525
6526              If on the other hand, we are creating an executable, we may need
6527              to keep relocations for symbols satisfied by a dynamic library
6528              if we manage to avoid copy relocs for the symbol.  */
6529           if ((bfd_link_pic (info)
6530                && (sec->flags & SEC_ALLOC) != 0
6531                && ((r_type != R_NDS32_25_PCREL_RELA
6532                     && r_type != R_NDS32_15_PCREL_RELA
6533                     && r_type != R_NDS32_17_PCREL_RELA
6534                     && !(r_type == R_NDS32_32_RELA
6535                          && strcmp (sec->name, ".eh_frame") == 0))
6536                    || (h != NULL
6537                        && (!info->symbolic
6538                            || h->root.type == bfd_link_hash_defweak
6539                            || !h->def_regular))))
6540               || (!bfd_link_pic (info)
6541                   && (sec->flags & SEC_ALLOC) != 0
6542                   && h != NULL
6543                   && (h->root.type == bfd_link_hash_defweak
6544                       || !h->def_regular)))
6545             {
6546               struct elf_nds32_dyn_relocs *p;
6547               struct elf_nds32_dyn_relocs **head;
6548
6549               if (dynobj == NULL)
6550                 htab->root.dynobj = dynobj = abfd;
6551
6552               /* When creating a shared object, we must copy these
6553                  relocs into the output file.  We create a reloc
6554                  section in dynobj and make room for the reloc.  */
6555               if (sreloc == NULL)
6556                 {
6557                   const char *name;
6558
6559                   name = bfd_elf_string_from_elf_section
6560                     (abfd, elf_elfheader (abfd)->e_shstrndx,
6561                      elf_section_data (sec)->rela.hdr->sh_name);
6562                   if (name == NULL)
6563                     return FALSE;
6564
6565                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
6566                               && strcmp (bfd_get_section_name (abfd, sec),
6567                                          name + 5) == 0);
6568
6569                   sreloc = bfd_get_section_by_name (dynobj, name);
6570                   if (sreloc == NULL)
6571                     {
6572                       flagword flags;
6573
6574                       sreloc = bfd_make_section (dynobj, name);
6575                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
6576                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
6577                       if ((sec->flags & SEC_ALLOC) != 0)
6578                         flags |= SEC_ALLOC | SEC_LOAD;
6579                       if (sreloc == NULL
6580                           || !bfd_set_section_flags (dynobj, sreloc, flags)
6581                           || !bfd_set_section_alignment (dynobj, sreloc, 2))
6582                         return FALSE;
6583
6584                       elf_section_type (sreloc) = SHT_RELA;
6585                     }
6586                   elf_section_data (sec)->sreloc = sreloc;
6587                 }
6588
6589               /* If this is a global symbol, we count the number of
6590                  relocations we need for this symbol.  */
6591               if (h != NULL)
6592                 head = &((struct elf_nds32_link_hash_entry *) h)->dyn_relocs;
6593               else
6594                 {
6595                   asection *s;
6596                   void *vpp;
6597
6598                   Elf_Internal_Sym *isym;
6599                   isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx);
6600                   if (isym == NULL)
6601                     return FALSE;
6602
6603                   /* Track dynamic relocs needed for local syms too.  */
6604                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
6605                   if (s == NULL)
6606                     return FALSE;
6607
6608                   vpp = &elf_section_data (s)->local_dynrel;
6609                   head = (struct elf_nds32_dyn_relocs **) vpp;
6610                 }
6611
6612               p = *head;
6613               if (p == NULL || p->sec != sec)
6614                 {
6615                   bfd_size_type amt = sizeof (*p);
6616                   p = (struct elf_nds32_dyn_relocs *) bfd_alloc (dynobj, amt);
6617                   if (p == NULL)
6618                     return FALSE;
6619                   p->next = *head;
6620                   *head = p;
6621                   p->sec = sec;
6622                   p->count = 0;
6623                   p->pc_count = 0;
6624                 }
6625
6626               p->count += 1;
6627               if (ELF32_R_TYPE (rel->r_info) == R_NDS32_25_PCREL_RELA
6628                   || ELF32_R_TYPE (rel->r_info) == R_NDS32_15_PCREL_RELA
6629                   || ELF32_R_TYPE (rel->r_info) == R_NDS32_17_PCREL_RELA)
6630                 p->pc_count += 1;
6631             }
6632           break;
6633
6634           /* This relocation describes the C++ object vtable hierarchy.
6635              Reconstruct it for later use during GC.  */
6636         case R_NDS32_RELA_GNU_VTINHERIT:
6637         case R_NDS32_GNU_VTINHERIT:
6638           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
6639             return FALSE;
6640           break;
6641
6642           /* This relocation describes which C++ vtable entries are actually
6643              used.  Record for later use during GC.  */
6644         case R_NDS32_GNU_VTENTRY:
6645           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
6646             return FALSE;
6647           break;
6648         case R_NDS32_RELA_GNU_VTENTRY:
6649           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
6650             return FALSE;
6651           break;
6652         }
6653     }
6654
6655   return TRUE;
6656 }
6657
6658 /* Write VAL in uleb128 format to P, returning a pointer to the
6659    following byte.
6660    This code is copied from elf-attr.c.  */
6661
6662 static bfd_byte *
6663 write_uleb128 (bfd_byte *p, unsigned int val)
6664 {
6665   bfd_byte c;
6666   do
6667     {
6668       c = val & 0x7f;
6669       val >>= 7;
6670       if (val)
6671         c |= 0x80;
6672       *(p++) = c;
6673     }
6674   while (val);
6675   return p;
6676 }
6677
6678 static bfd_signed_vma
6679 calculate_offset (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
6680                   Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr,
6681                   int *pic_ext_target)
6682 {
6683   bfd_signed_vma foff;
6684   bfd_vma symval, addend;
6685   asection *sym_sec;
6686
6687   /* Get the value of the symbol referred to by the reloc.  */
6688   if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
6689     {
6690       Elf_Internal_Sym *isym;
6691
6692       /* A local symbol.  */
6693       isym = isymbuf + ELF32_R_SYM (irel->r_info);
6694
6695       if (isym->st_shndx == SHN_UNDEF)
6696         sym_sec = bfd_und_section_ptr;
6697       else if (isym->st_shndx == SHN_ABS)
6698         sym_sec = bfd_abs_section_ptr;
6699       else if (isym->st_shndx == SHN_COMMON)
6700         sym_sec = bfd_com_section_ptr;
6701       else
6702         sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
6703       symval = isym->st_value + sym_sec->output_section->vma
6704                + sym_sec->output_offset;
6705     }
6706   else
6707     {
6708       unsigned long indx;
6709       struct elf_link_hash_entry *h;
6710       bfd *owner;
6711
6712       /* An external symbol.  */
6713       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
6714       h = elf_sym_hashes (abfd)[indx];
6715       BFD_ASSERT (h != NULL);
6716
6717       if (h->root.type != bfd_link_hash_defined
6718           && h->root.type != bfd_link_hash_defweak)
6719         /* This appears to be a reference to an undefined
6720            symbol.  Just ignore it--it will be caught by the
6721            regular reloc processing.  */
6722         return 0;
6723       owner = h->root.u.def.section->owner;
6724       if (owner && (elf_elfheader (owner)->e_flags & E_NDS32_HAS_PIC))
6725         *pic_ext_target = 1;
6726
6727       if (h->root.u.def.section->flags & SEC_MERGE)
6728         {
6729           sym_sec = h->root.u.def.section;
6730           symval = _bfd_merged_section_offset (abfd, &sym_sec,
6731                                                elf_section_data (sym_sec)->sec_info,
6732                                                h->root.u.def.value);
6733           symval = symval + sym_sec->output_section->vma
6734                    + sym_sec->output_offset;
6735         }
6736       else
6737         symval = (h->root.u.def.value
6738                   + h->root.u.def.section->output_section->vma
6739                   + h->root.u.def.section->output_offset);
6740     }
6741
6742   addend = irel->r_addend;
6743
6744   foff = (symval + addend
6745           - (irel->r_offset + sec->output_section->vma + sec->output_offset));
6746   return foff;
6747 }
6748
6749 static bfd_vma
6750 calculate_plt_memory_address (bfd *abfd, struct bfd_link_info *link_info,
6751                               Elf_Internal_Sym *isymbuf,
6752                               Elf_Internal_Rela *irel,
6753                               Elf_Internal_Shdr *symtab_hdr)
6754 {
6755   bfd_vma symval;
6756
6757   if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
6758     {
6759       Elf_Internal_Sym *isym;
6760       asection *sym_sec;
6761       /* A local symbol.  */
6762       isym = isymbuf + ELF32_R_SYM (irel->r_info);
6763
6764       if (isym->st_shndx == SHN_UNDEF)
6765         sym_sec = bfd_und_section_ptr;
6766       else if (isym->st_shndx == SHN_ABS)
6767         sym_sec = bfd_abs_section_ptr;
6768       else if (isym->st_shndx == SHN_COMMON)
6769         sym_sec = bfd_com_section_ptr;
6770       else
6771         sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
6772       symval = isym->st_value + sym_sec->output_section->vma
6773                + sym_sec->output_offset;
6774     }
6775   else
6776     {
6777       unsigned long indx;
6778       struct elf_link_hash_entry *h;
6779       struct elf_nds32_link_hash_table *htab;
6780       asection *splt;
6781
6782       /* An external symbol.  */
6783       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
6784       h = elf_sym_hashes (abfd)[indx];
6785       BFD_ASSERT (h != NULL);
6786       htab = nds32_elf_hash_table (link_info);
6787       splt = htab->root.splt;
6788
6789       while (h->root.type == bfd_link_hash_indirect
6790              || h->root.type == bfd_link_hash_warning)
6791         h = (struct elf_link_hash_entry *) h->root.u.i.link;
6792
6793       if (h->plt.offset == (bfd_vma) - 1)
6794         {
6795           if (h->root.type != bfd_link_hash_defined
6796               && h->root.type != bfd_link_hash_defweak)
6797             /* This appears to be a reference to an undefined
6798              * symbol.  Just ignore it--it will be caught by the
6799              * regular reloc processing.  */
6800             return 0;
6801           symval = (h->root.u.def.value
6802                     + h->root.u.def.section->output_section->vma
6803                     + h->root.u.def.section->output_offset);
6804         }
6805       else
6806         symval = splt->output_section->vma + h->plt.offset;
6807     }
6808
6809   return symval;
6810 }
6811
6812 static bfd_signed_vma
6813 calculate_plt_offset (bfd *abfd, asection *sec, struct bfd_link_info *link_info,
6814                       Elf_Internal_Sym *isymbuf, Elf_Internal_Rela *irel,
6815                       Elf_Internal_Shdr *symtab_hdr)
6816 {
6817   bfd_vma foff;
6818   if ((foff = calculate_plt_memory_address (abfd, link_info, isymbuf, irel,
6819                                             symtab_hdr)) == 0)
6820     return 0;
6821   else
6822     return foff - (irel->r_offset
6823                    + sec->output_section->vma + sec->output_offset);
6824 }
6825 \f
6826 /* Convert a 32-bit instruction to 16-bit one.
6827    INSN is the input 32-bit instruction, INSN16 is the output 16-bit
6828    instruction.  If INSN_TYPE is not NULL, it the CGEN instruction
6829    type of INSN16.  Return 1 if successful.  */
6830
6831 static int
6832 nds32_convert_32_to_16_alu1 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
6833                              int *pinsn_type)
6834 {
6835   uint16_t insn16 = 0;
6836   int insn_type = 0;
6837   unsigned long mach = bfd_get_mach (abfd);
6838
6839   if (N32_SH5 (insn) != 0)
6840     return 0;
6841
6842   switch (N32_SUB5 (insn))
6843     {
6844     case N32_ALU1_ADD_SLLI:
6845     case N32_ALU1_ADD_SRLI:
6846       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
6847         {
6848           insn16 = N16_TYPE333 (ADD333, N32_RT5 (insn), N32_RA5 (insn),
6849                                 N32_RB5 (insn));
6850           insn_type = NDS32_INSN_ADD333;
6851         }
6852       else if (N32_IS_RT4 (insn))
6853         {
6854           if (N32_RT5 (insn) == N32_RA5 (insn))
6855             insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RB5 (insn));
6856           else if (N32_RT5 (insn) == N32_RB5 (insn))
6857             insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RA5 (insn));
6858           insn_type = NDS32_INSN_ADD45;
6859         }
6860       break;
6861
6862     case N32_ALU1_SUB_SLLI:
6863     case N32_ALU1_SUB_SRLI:
6864       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
6865         {
6866           insn16 = N16_TYPE333 (SUB333, N32_RT5 (insn), N32_RA5 (insn),
6867                                 N32_RB5 (insn));
6868           insn_type = NDS32_INSN_SUB333;
6869         }
6870       else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
6871         {
6872           insn16 = N16_TYPE45 (SUB45, N32_RT54 (insn), N32_RB5 (insn));
6873           insn_type = NDS32_INSN_SUB45;
6874         }
6875       break;
6876
6877     case N32_ALU1_AND_SLLI:
6878     case N32_ALU1_AND_SRLI:
6879       /* and $rt, $rt, $rb -> and33 for v3, v3m.  */
6880       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
6881           && N32_IS_RB3 (insn))
6882         {
6883           if (N32_RT5 (insn) == N32_RA5 (insn))
6884             insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RB5 (insn));
6885           else if (N32_RT5 (insn) == N32_RB5 (insn))
6886             insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RA5 (insn));
6887           if (insn16)
6888             insn_type = NDS32_INSN_AND33;
6889         }
6890       break;
6891
6892     case N32_ALU1_XOR_SLLI:
6893     case N32_ALU1_XOR_SRLI:
6894       /* xor $rt, $rt, $rb -> xor33 for v3, v3m.  */
6895       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
6896           && N32_IS_RB3 (insn))
6897         {
6898           if (N32_RT5 (insn) == N32_RA5 (insn))
6899             insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RB5 (insn));
6900           else if (N32_RT5 (insn) == N32_RB5 (insn))
6901             insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RA5 (insn));
6902           if (insn16)
6903             insn_type = NDS32_INSN_XOR33;
6904         }
6905       break;
6906
6907     case N32_ALU1_OR_SLLI:
6908     case N32_ALU1_OR_SRLI:
6909       /* or $rt, $rt, $rb -> or33 for v3, v3m.  */
6910       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
6911           && N32_IS_RB3 (insn))
6912         {
6913           if (N32_RT5 (insn) == N32_RA5 (insn))
6914             insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RB5 (insn));
6915           else if (N32_RT5 (insn) == N32_RB5 (insn))
6916             insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RA5 (insn));
6917           if (insn16)
6918             insn_type = NDS32_INSN_OR33;
6919         }
6920       break;
6921     case N32_ALU1_NOR:
6922       /* nor $rt, $ra, $ra -> not33 for v3, v3m.  */
6923       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RB3 (insn)
6924           && N32_RA5 (insn) == N32_RB5 (insn))
6925         {
6926           insn16 = N16_MISC33 (NOT33, N32_RT5 (insn), N32_RA5 (insn));
6927           insn_type = NDS32_INSN_NOT33;
6928         }
6929       break;
6930     case N32_ALU1_SRAI:
6931       if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
6932         {
6933           insn16 = N16_TYPE45 (SRAI45, N32_RT54 (insn), N32_UB5 (insn));
6934           insn_type = NDS32_INSN_SRAI45;
6935         }
6936       break;
6937
6938     case N32_ALU1_SRLI:
6939       if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
6940         {
6941           insn16 = N16_TYPE45 (SRLI45, N32_RT54 (insn), N32_UB5 (insn));
6942           insn_type = NDS32_INSN_SRLI45;
6943         }
6944       break;
6945
6946     case N32_ALU1_SLLI:
6947       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_UB5 (insn) < 8)
6948         {
6949           insn16 = N16_TYPE333 (SLLI333, N32_RT5 (insn), N32_RA5 (insn),
6950                                 N32_UB5 (insn));
6951           insn_type = NDS32_INSN_SLLI333;
6952         }
6953       break;
6954
6955     case N32_ALU1_ZEH:
6956       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
6957         {
6958           insn16 = N16_BFMI333 (ZEH33, N32_RT5 (insn), N32_RA5 (insn));
6959           insn_type = NDS32_INSN_ZEH33;
6960         }
6961       break;
6962
6963     case N32_ALU1_SEB:
6964       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
6965         {
6966           insn16 = N16_BFMI333 (SEB33, N32_RT5 (insn), N32_RA5 (insn));
6967           insn_type = NDS32_INSN_SEB33;
6968         }
6969       break;
6970
6971     case N32_ALU1_SEH:
6972       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
6973         {
6974           insn16 = N16_BFMI333 (SEH33, N32_RT5 (insn), N32_RA5 (insn));
6975           insn_type = NDS32_INSN_SEH33;
6976         }
6977       break;
6978
6979     case N32_ALU1_SLT:
6980       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
6981         {
6982           /* Implicit r15.  */
6983           insn16 = N16_TYPE45 (SLT45, N32_RA54 (insn), N32_RB5 (insn));
6984           insn_type = NDS32_INSN_SLT45;
6985         }
6986       break;
6987
6988     case N32_ALU1_SLTS:
6989       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
6990         {
6991           /* Implicit r15.  */
6992           insn16 = N16_TYPE45 (SLTS45, N32_RA54 (insn), N32_RB5 (insn));
6993           insn_type = NDS32_INSN_SLTS45;
6994         }
6995       break;
6996     }
6997
6998   if ((insn16 & 0x8000) == 0)
6999     return 0;
7000
7001   if (pinsn16)
7002     *pinsn16 = insn16;
7003   if (pinsn_type)
7004     *pinsn_type = insn_type;
7005   return 1;
7006 }
7007
7008 static int
7009 nds32_convert_32_to_16_alu2 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
7010                              int *pinsn_type)
7011 {
7012   uint16_t insn16 = 0;
7013   int insn_type;
7014   unsigned long mach = bfd_get_mach (abfd);
7015
7016   /* TODO: bset, bclr, btgl, btst.  */
7017   if (__GF (insn, 6, 4) != 0)
7018     return 0;
7019
7020   switch (N32_IMMU (insn, 6))
7021     {
7022     case N32_ALU2_MUL:
7023       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7024           && N32_IS_RB3 (insn))
7025         {
7026           if (N32_RT5 (insn) == N32_RA5 (insn))
7027             insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RB5 (insn));
7028           else if (N32_RT5 (insn) == N32_RB5 (insn))
7029             insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RA5 (insn));
7030           if (insn16)
7031             insn_type = NDS32_INSN_MUL33;
7032         }
7033     }
7034
7035   if ((insn16 & 0x8000) == 0)
7036     return 0;
7037
7038   if (pinsn16)
7039     *pinsn16 = insn16;
7040   if (pinsn_type)
7041     *pinsn_type = insn_type;
7042   return 1;
7043 }
7044
7045 int
7046 nds32_convert_32_to_16 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
7047                         int *pinsn_type)
7048 {
7049   int op6;
7050   uint16_t insn16 = 0;
7051   int insn_type;
7052   unsigned long mach = bfd_get_mach (abfd);
7053
7054   /* Decode 32-bit instruction.  */
7055   if (insn & 0x80000000)
7056     {
7057       /* Not 32-bit insn.  */
7058       return 0;
7059     }
7060
7061   op6 = N32_OP6 (insn);
7062
7063   /* Convert it to 16-bit instruction.  */
7064   switch (op6)
7065     {
7066     case N32_OP6_MOVI:
7067       if (IS_WITHIN_S (N32_IMM20S (insn), 5))
7068         {
7069           insn16 = N16_TYPE55 (MOVI55, N32_RT5 (insn), N32_IMM20S (insn));
7070           insn_type = NDS32_INSN_MOVI55;
7071         }
7072       else if (mach >= MACH_V3 && N32_IMM20S (insn) >= 16
7073                && N32_IMM20S (insn) < 48 && N32_IS_RT4 (insn))
7074         {
7075           insn16 = N16_TYPE45 (MOVPI45, N32_RT54 (insn),
7076                                N32_IMM20S (insn) - 16);
7077           insn_type = NDS32_INSN_MOVPI45;
7078         }
7079       break;
7080
7081     case N32_OP6_ADDI:
7082       if (N32_IMM15S (insn) == 0)
7083         {
7084           /* Do not convert `addi $sp, $sp, 0' to `mov55 $sp, $sp',
7085              because `mov55 $sp, $sp' is ifret16 in V3 ISA.  */
7086           if (mach <= MACH_V2
7087               || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
7088             {
7089               insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
7090               insn_type = NDS32_INSN_MOV55;
7091             }
7092         }
7093       else if (N32_IMM15S (insn) > 0)
7094         {
7095           if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) < 8)
7096             {
7097               insn16 = N16_TYPE333 (ADDI333, N32_RT5 (insn), N32_RA5 (insn),
7098                                     N32_IMM15S (insn));
7099               insn_type = NDS32_INSN_ADDI333;
7100             }
7101           else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
7102                    && N32_IMM15S (insn) < 32)
7103             {
7104               insn16 = N16_TYPE45 (ADDI45, N32_RT54 (insn), N32_IMM15S (insn));
7105               insn_type = NDS32_INSN_ADDI45;
7106             }
7107           else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
7108                    && N32_RT5 (insn) == N32_RA5 (insn)
7109                    && N32_IMM15S (insn) < 512)
7110             {
7111               insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
7112               insn_type = NDS32_INSN_ADDI10_SP;
7113             }
7114           else if (mach >= MACH_V3 && N32_IS_RT3 (insn)
7115                    && N32_RA5 (insn) == REG_SP && N32_IMM15S (insn) < 256
7116                    && (N32_IMM15S (insn) % 4 == 0))
7117             {
7118               insn16 = N16_TYPE36 (ADDRI36_SP, N32_RT5 (insn),
7119                                    N32_IMM15S (insn) >> 2);
7120               insn_type = NDS32_INSN_ADDRI36_SP;
7121             }
7122         }
7123       else
7124         {
7125           /* Less than 0.  */
7126           if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) > -8)
7127             {
7128               insn16 = N16_TYPE333 (SUBI333, N32_RT5 (insn), N32_RA5 (insn),
7129                                     0 - N32_IMM15S (insn));
7130               insn_type = NDS32_INSN_SUBI333;
7131             }
7132           else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
7133                    && N32_IMM15S (insn) > -32)
7134             {
7135               insn16 = N16_TYPE45 (SUBI45, N32_RT54 (insn),
7136                                    0 - N32_IMM15S (insn));
7137               insn_type = NDS32_INSN_SUBI45;
7138             }
7139           else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
7140                    && N32_RT5 (insn) == N32_RA5 (insn)
7141                    && N32_IMM15S (insn) >= -512)
7142             {
7143               insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
7144               insn_type = NDS32_INSN_ADDI10_SP;
7145             }
7146         }
7147       break;
7148
7149     case N32_OP6_ORI:
7150       if (N32_IMM15S (insn) == 0)
7151         {
7152           /* Do not convert `ori $sp, $sp, 0' to `mov55 $sp, $sp',
7153              because `mov55 $sp, $sp' is ifret16 in V3 ISA.  */
7154           if (mach <= MACH_V2
7155               || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
7156             {
7157               insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
7158               insn_type = NDS32_INSN_MOV55;
7159             }
7160         }
7161       break;
7162
7163     case N32_OP6_SUBRI:
7164       if (mach >= MACH_V3 && N32_IS_RT3 (insn)
7165           && N32_IS_RA3 (insn) && N32_IMM15S (insn) == 0)
7166         {
7167           insn16 = N16_MISC33 (NEG33, N32_RT5 (insn), N32_RA5 (insn));
7168           insn_type = NDS32_INSN_NEG33;
7169         }
7170       break;
7171
7172     case N32_OP6_ANDI:
7173       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
7174         {
7175           if (N32_IMM15U (insn) == 1)
7176             {
7177               insn16 = N16_BFMI333 (XLSB33, N32_RT5 (insn), N32_RA5 (insn));
7178               insn_type = NDS32_INSN_XLSB33;
7179             }
7180           else if (N32_IMM15U (insn) == 0x7ff)
7181             {
7182               insn16 = N16_BFMI333 (X11B33, N32_RT5 (insn), N32_RA5 (insn));
7183               insn_type = NDS32_INSN_X11B33;
7184             }
7185           else if (N32_IMM15U (insn) == 0xff)
7186             {
7187               insn16 = N16_BFMI333 (ZEB33, N32_RT5 (insn), N32_RA5 (insn));
7188               insn_type = NDS32_INSN_ZEB33;
7189             }
7190           else if (mach >= MACH_V3 && N32_RT5 (insn) == N32_RA5 (insn)
7191                    && N32_IMM15U (insn) < 256)
7192             {
7193               int imm15u = N32_IMM15U (insn);
7194
7195               if (__builtin_popcount (imm15u) == 1)
7196                 {
7197                   /* BMSKI33 */
7198                   int imm3u = __builtin_ctz (imm15u);
7199
7200                   insn16 = N16_BFMI333 (BMSKI33, N32_RT5 (insn), imm3u);
7201                   insn_type = NDS32_INSN_BMSKI33;
7202                 }
7203               else if (imm15u != 0 && __builtin_popcount (imm15u + 1) == 1)
7204                 {
7205                   /* FEXTI33 */
7206                   int imm3u = __builtin_ctz (imm15u + 1) - 1;
7207
7208                   insn16 = N16_BFMI333 (FEXTI33, N32_RT5 (insn), imm3u);
7209                   insn_type = NDS32_INSN_FEXTI33;
7210                 }
7211             }
7212         }
7213       break;
7214
7215     case N32_OP6_SLTI:
7216       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
7217           && IS_WITHIN_U (N32_IMM15S (insn), 5))
7218         {
7219           insn16 = N16_TYPE45 (SLTI45, N32_RA54 (insn), N32_IMM15S (insn));
7220           insn_type = NDS32_INSN_SLTI45;
7221         }
7222       break;
7223
7224     case N32_OP6_SLTSI:
7225       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
7226           && IS_WITHIN_U (N32_IMM15S (insn), 5))
7227         {
7228           insn16 = N16_TYPE45 (SLTSI45, N32_RA54 (insn), N32_IMM15S (insn));
7229           insn_type = NDS32_INSN_SLTSI45;
7230         }
7231       break;
7232
7233     case N32_OP6_LWI:
7234       if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
7235         {
7236           insn16 = N16_TYPE45 (LWI450, N32_RT54 (insn), N32_RA5 (insn));
7237           insn_type = NDS32_INSN_LWI450;
7238         }
7239       else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7240                && IS_WITHIN_U (N32_IMM15S (insn), 3))
7241         {
7242           insn16 = N16_TYPE333 (LWI333, N32_RT5 (insn), N32_RA5 (insn),
7243                                 N32_IMM15S (insn));
7244           insn_type = NDS32_INSN_LWI333;
7245         }
7246       else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
7247                && IS_WITHIN_U (N32_IMM15S (insn), 7))
7248         {
7249           insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
7250           insn_type = NDS32_INSN_LWI37;
7251         }
7252       else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
7253                && IS_WITHIN_U (N32_IMM15S (insn), 7))
7254         {
7255           insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 0, N32_IMM15S (insn));
7256           insn_type = NDS32_INSN_LWI37_SP;
7257         }
7258       else if (mach >= MACH_V2 && N32_IS_RT4 (insn) && N32_RA5 (insn) == REG_R8
7259                && -32 <= N32_IMM15S (insn) && N32_IMM15S (insn) < 0)
7260         {
7261           insn16 = N16_TYPE45 (LWI45_FE, N32_RT54 (insn),
7262                                N32_IMM15S (insn) + 32);
7263           insn_type = NDS32_INSN_LWI45_FE;
7264         }
7265       break;
7266
7267     case N32_OP6_SWI:
7268       if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
7269         {
7270           insn16 = N16_TYPE45 (SWI450, N32_RT54 (insn), N32_RA5 (insn));
7271           insn_type = NDS32_INSN_SWI450;
7272         }
7273       else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7274                && IS_WITHIN_U (N32_IMM15S (insn), 3))
7275         {
7276           insn16 = N16_TYPE333 (SWI333, N32_RT5 (insn), N32_RA5 (insn),
7277                                 N32_IMM15S (insn));
7278           insn_type = NDS32_INSN_SWI333;
7279         }
7280       else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
7281                && IS_WITHIN_U (N32_IMM15S (insn), 7))
7282         {
7283           insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
7284           insn_type = NDS32_INSN_SWI37;
7285         }
7286       else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
7287                && IS_WITHIN_U (N32_IMM15S (insn), 7))
7288         {
7289           insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 1, N32_IMM15S (insn));
7290           insn_type = NDS32_INSN_SWI37_SP;
7291         }
7292       break;
7293
7294     case N32_OP6_LWI_BI:
7295       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7296           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7297         {
7298           insn16 = N16_TYPE333 (LWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
7299                                 N32_IMM15S (insn));
7300           insn_type = NDS32_INSN_LWI333_BI;
7301         }
7302       break;
7303
7304     case N32_OP6_SWI_BI:
7305       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7306           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7307         {
7308           insn16 = N16_TYPE333 (SWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
7309                                 N32_IMM15S (insn));
7310           insn_type = NDS32_INSN_SWI333_BI;
7311         }
7312       break;
7313
7314     case N32_OP6_LHI:
7315       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7316           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7317         {
7318           insn16 = N16_TYPE333 (LHI333, N32_RT5 (insn), N32_RA5 (insn),
7319                                 N32_IMM15S (insn));
7320           insn_type = NDS32_INSN_LHI333;
7321         }
7322       break;
7323
7324     case N32_OP6_SHI:
7325       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7326           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7327         {
7328           insn16 = N16_TYPE333 (SHI333, N32_RT5 (insn), N32_RA5 (insn),
7329                                 N32_IMM15S (insn));
7330           insn_type = NDS32_INSN_SHI333;
7331         }
7332       break;
7333
7334     case N32_OP6_LBI:
7335       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7336           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7337         {
7338           insn16 = N16_TYPE333 (LBI333, N32_RT5 (insn), N32_RA5 (insn),
7339                                 N32_IMM15S (insn));
7340           insn_type = NDS32_INSN_LBI333;
7341         }
7342       break;
7343
7344     case N32_OP6_SBI:
7345       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7346           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7347         {
7348           insn16 = N16_TYPE333 (SBI333, N32_RT5 (insn), N32_RA5 (insn),
7349                                 N32_IMM15S (insn));
7350           insn_type = NDS32_INSN_SBI333;
7351         }
7352       break;
7353
7354     case N32_OP6_ALU1:
7355       return nds32_convert_32_to_16_alu1 (abfd, insn, pinsn16, pinsn_type);
7356
7357     case N32_OP6_ALU2:
7358       return nds32_convert_32_to_16_alu2 (abfd, insn, pinsn16, pinsn_type);
7359
7360     case N32_OP6_BR1:
7361       if (!IS_WITHIN_S (N32_IMM14S (insn), 8))
7362         goto done;
7363
7364       if ((insn & __BIT (14)) == 0)
7365         {
7366           /* N32_BR1_BEQ */
7367           if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
7368               && N32_RT5 (insn) != REG_R5)
7369             insn16 = N16_TYPE38 (BEQS38, N32_RT5 (insn), N32_IMM14S (insn));
7370           else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
7371                    && N32_RA5 (insn) != REG_R5)
7372             insn16 = N16_TYPE38 (BEQS38, N32_RA5 (insn), N32_IMM14S (insn));
7373           insn_type = NDS32_INSN_BEQS38;
7374           break;
7375         }
7376       else
7377         {
7378           /* N32_BR1_BNE */
7379           if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
7380               && N32_RT5 (insn) != REG_R5)
7381             insn16 = N16_TYPE38 (BNES38, N32_RT5 (insn), N32_IMM14S (insn));
7382           else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
7383                    && N32_RA5 (insn) != REG_R5)
7384             insn16 = N16_TYPE38 (BNES38, N32_RA5 (insn), N32_IMM14S (insn));
7385           insn_type = NDS32_INSN_BNES38;
7386           break;
7387         }
7388       break;
7389
7390     case N32_OP6_BR2:
7391       switch (N32_BR2_SUB (insn))
7392         {
7393         case N32_BR2_BEQZ:
7394           if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
7395             {
7396               insn16 = N16_TYPE38 (BEQZ38, N32_RT5 (insn), N32_IMM16S (insn));
7397               insn_type = NDS32_INSN_BEQZ38;
7398             }
7399           else if (N32_RT5 (insn) == REG_R15
7400                    && IS_WITHIN_S (N32_IMM16S (insn), 8))
7401             {
7402               insn16 = N16_TYPE8 (BEQZS8, N32_IMM16S (insn));
7403               insn_type = NDS32_INSN_BEQZS8;
7404             }
7405           break;
7406
7407         case N32_BR2_BNEZ:
7408           if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
7409             {
7410               insn16 = N16_TYPE38 (BNEZ38, N32_RT5 (insn), N32_IMM16S (insn));
7411               insn_type = NDS32_INSN_BNEZ38;
7412             }
7413           else if (N32_RT5 (insn) == REG_R15
7414                    && IS_WITHIN_S (N32_IMM16S (insn), 8))
7415             {
7416               insn16 = N16_TYPE8 (BNEZS8, N32_IMM16S (insn));
7417               insn_type = NDS32_INSN_BNEZS8;
7418             }
7419           break;
7420
7421         case N32_BR2_IFCALL:
7422           if (IS_WITHIN_U (N32_IMM16S (insn), 9))
7423             {
7424               insn16 = N16_TYPE9 (IFCALL9, N32_IMM16S (insn));
7425               insn_type = NDS32_INSN_IFCALL9;
7426             }
7427           break;
7428         }
7429       break;
7430
7431     case N32_OP6_JI:
7432       if ((insn & __BIT (24)) == 0)
7433         {
7434           /* N32_JI_J */
7435           if (IS_WITHIN_S (N32_IMM24S (insn), 8))
7436             {
7437               insn16 = N16_TYPE8 (J8, N32_IMM24S (insn));
7438               insn_type = NDS32_INSN_J8;
7439             }
7440         }
7441       break;
7442
7443     case N32_OP6_JREG:
7444       if (__GF (insn, 8, 2) != 0)
7445         goto done;
7446
7447       switch (N32_IMMU (insn, 5))
7448         {
7449         case N32_JREG_JR:
7450           if (N32_JREG_HINT (insn) == 0)
7451             {
7452               /* jr */
7453               insn16 = N16_TYPE5 (JR5, N32_RB5 (insn));
7454               insn_type = NDS32_INSN_JR5;
7455             }
7456           else if (N32_JREG_HINT (insn) == 1)
7457             {
7458               /* ret */
7459               insn16 = N16_TYPE5 (RET5, N32_RB5 (insn));
7460               insn_type = NDS32_INSN_RET5;
7461             }
7462           else if (N32_JREG_HINT (insn) == 3)
7463             {
7464               /* ifret = mov55 $sp, $sp */
7465               insn16 = N16_TYPE55 (MOV55, REG_SP, REG_SP);
7466               insn_type = NDS32_INSN_IFRET;
7467             }
7468           break;
7469
7470         case N32_JREG_JRAL:
7471           /* It's convertible when return rt5 is $lp and address
7472              translation is kept.  */
7473           if (N32_RT5 (insn) == REG_LP && N32_JREG_HINT (insn) == 0)
7474             {
7475               insn16 = N16_TYPE5 (JRAL5, N32_RB5 (insn));
7476               insn_type = NDS32_INSN_JRAL5;
7477             }
7478           break;
7479         }
7480       break;
7481
7482     case N32_OP6_MISC:
7483       if (N32_SUB5 (insn) == N32_MISC_BREAK && N32_SWID (insn) < 32)
7484         {
7485           /* For v3, swid above 31 are used for ex9.it.  */
7486           insn16 = N16_TYPE5 (BREAK16, N32_SWID (insn));
7487           insn_type = NDS32_INSN_BREAK16;
7488         }
7489       break;
7490
7491     default:
7492       /* This instruction has no 16-bit variant.  */
7493       goto done;
7494     }
7495
7496 done:
7497   /* Bit-15 of insn16 should be set for a valid instruction.  */
7498   if ((insn16 & 0x8000) == 0)
7499     return 0;
7500
7501   if (pinsn16)
7502     *pinsn16 = insn16;
7503   if (pinsn_type)
7504     *pinsn_type = insn_type;
7505   return 1;
7506 }
7507
7508 static int
7509 special_convert_32_to_16 (unsigned long insn, uint16_t *pinsn16,
7510                           Elf_Internal_Rela *reloc)
7511 {
7512   uint16_t insn16 = 0;
7513
7514   if ((reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG) == 0
7515       || (ELF32_R_TYPE (reloc->r_info) != R_NDS32_INSN16))
7516     return 0;
7517
7518   if (!N32_IS_RT3 (insn))
7519     return 0;
7520
7521   switch (N32_OP6 (insn))
7522     {
7523     case N32_OP6_LWI:
7524       if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
7525         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
7526       break;
7527     case N32_OP6_SWI:
7528       if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
7529         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
7530       break;
7531     case N32_OP6_HWGP:
7532       if (!IS_WITHIN_U (N32_IMM17S (insn), 7))
7533         break;
7534
7535       if (__GF (insn, 17, 3) == 6)
7536         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM17S (insn));
7537       else if (__GF (insn, 17, 3) == 7)
7538         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM17S (insn));
7539       break;
7540     }
7541
7542   if ((insn16 & 0x8000) == 0)
7543     return 0;
7544
7545   *pinsn16 = insn16;
7546   return 1;
7547 }
7548
7549 /* Convert a 16-bit instruction to 32-bit one.
7550    INSN16 it the input and PINSN it the point to output.
7551    Return non-zero on successful.  Otherwise 0 is returned.  */
7552
7553 int
7554 nds32_convert_16_to_32 (bfd *abfd, uint16_t insn16, uint32_t *pinsn)
7555 {
7556   uint32_t insn = 0xffffffff;
7557   unsigned long mach = bfd_get_mach (abfd);
7558
7559   /* NOTE: push25, pop25 and movd44 do not have 32-bit variants.  */
7560
7561   switch (__GF (insn16, 9, 6))
7562     {
7563     case 0x4:                   /* add45 */
7564       insn = N32_ALU1 (ADD, N16_RT4 (insn16), N16_RT4 (insn16),
7565                        N16_RA5 (insn16));
7566       goto done;
7567     case 0x5:                   /* sub45 */
7568       insn = N32_ALU1 (SUB, N16_RT4 (insn16), N16_RT4 (insn16),
7569                        N16_RA5 (insn16));
7570       goto done;
7571     case 0x6:                   /* addi45 */
7572       insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16),
7573                         N16_IMM5U (insn16));
7574       goto done;
7575     case 0x7:                   /* subi45 */
7576       insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16),
7577                         -N16_IMM5U (insn16));
7578       goto done;
7579     case 0x8:                   /* srai45 */
7580       insn = N32_ALU1 (SRAI, N16_RT4 (insn16), N16_RT4 (insn16),
7581                        N16_IMM5U (insn16));
7582       goto done;
7583     case 0x9:                   /* srli45 */
7584       insn = N32_ALU1 (SRLI, N16_RT4 (insn16), N16_RT4 (insn16),
7585                        N16_IMM5U (insn16));
7586       goto done;
7587     case 0xa:                   /* slli333 */
7588       insn = N32_ALU1 (SLLI, N16_RT3 (insn16), N16_RA3 (insn16),
7589                        N16_IMM3U (insn16));
7590       goto done;
7591     case 0xc:                   /* add333 */
7592       insn = N32_ALU1 (ADD, N16_RT3 (insn16), N16_RA3 (insn16),
7593                        N16_RB3 (insn16));
7594       goto done;
7595     case 0xd:                   /* sub333 */
7596       insn = N32_ALU1 (SUB, N16_RT3 (insn16), N16_RA3 (insn16),
7597                        N16_RB3 (insn16));
7598       goto done;
7599     case 0xe:                   /* addi333 */
7600       insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16),
7601                         N16_IMM3U (insn16));
7602       goto done;
7603     case 0xf:                   /* subi333 */
7604       insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16),
7605                         -N16_IMM3U (insn16));
7606       goto done;
7607     case 0x10:                  /* lwi333 */
7608       insn = N32_TYPE2 (LWI, N16_RT3 (insn16), N16_RA3 (insn16),
7609                         N16_IMM3U (insn16));
7610       goto done;
7611     case 0x12:                  /* lhi333 */
7612       insn = N32_TYPE2 (LHI, N16_RT3 (insn16), N16_RA3 (insn16),
7613                         N16_IMM3U (insn16));
7614       goto done;
7615     case 0x13:                  /* lbi333 */
7616       insn = N32_TYPE2 (LBI, N16_RT3 (insn16), N16_RA3 (insn16),
7617                         N16_IMM3U (insn16));
7618       goto done;
7619     case 0x11:                  /* lwi333.bi */
7620       insn = N32_TYPE2 (LWI_BI, N16_RT3 (insn16), N16_RA3 (insn16),
7621                         N16_IMM3U (insn16));
7622       goto done;
7623     case 0x14:                  /* swi333 */
7624       insn = N32_TYPE2 (SWI, N16_RT3 (insn16), N16_RA3 (insn16),
7625                         N16_IMM3U (insn16));
7626       goto done;
7627     case 0x16:                  /* shi333 */
7628       insn = N32_TYPE2 (SHI, N16_RT3 (insn16), N16_RA3 (insn16),
7629                         N16_IMM3U (insn16));
7630       goto done;
7631     case 0x17:                  /* sbi333 */
7632       insn = N32_TYPE2 (SBI, N16_RT3 (insn16), N16_RA3 (insn16),
7633                         N16_IMM3U (insn16));
7634       goto done;
7635     case 0x15:                  /* swi333.bi */
7636       insn = N32_TYPE2 (SWI_BI, N16_RT3 (insn16), N16_RA3 (insn16),
7637                         N16_IMM3U (insn16));
7638       goto done;
7639     case 0x18:                  /* addri36.sp */
7640       insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), REG_SP,
7641                         N16_IMM6U (insn16) << 2);
7642       goto done;
7643     case 0x19:                  /* lwi45.fe */
7644       insn = N32_TYPE2 (LWI, N16_RT4 (insn16), REG_R8,
7645                         (N16_IMM5U (insn16) - 32));
7646       goto done;
7647     case 0x1a:                  /* lwi450 */
7648       insn = N32_TYPE2 (LWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
7649       goto done;
7650     case 0x1b:                  /* swi450 */
7651       insn = N32_TYPE2 (SWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
7652       goto done;
7653
7654       /* These are r15 implied instructions.  */
7655     case 0x30:                  /* slts45 */
7656       insn = N32_ALU1 (SLTS, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
7657       goto done;
7658     case 0x31:                  /* slt45 */
7659       insn = N32_ALU1 (SLT, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
7660       goto done;
7661     case 0x32:                  /* sltsi45 */
7662       insn = N32_TYPE2 (SLTSI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
7663       goto done;
7664     case 0x33:                  /* slti45 */
7665       insn = N32_TYPE2 (SLTI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
7666       goto done;
7667     case 0x34:                  /* beqzs8, bnezs8 */
7668       if (insn16 & __BIT (8))
7669         insn = N32_BR2 (BNEZ, REG_TA, N16_IMM8S (insn16));
7670       else
7671         insn = N32_BR2 (BEQZ, REG_TA, N16_IMM8S (insn16));
7672       goto done;
7673
7674     case 0x35:                  /* break16, ex9.it */
7675       /* Only consider range of v3 break16.  */
7676       insn = N32_TYPE0 (MISC, (N16_IMM5U (insn16) << 5) | N32_MISC_BREAK);
7677       goto done;
7678
7679     case 0x3c:                  /* ifcall9 */
7680       insn = N32_BR2 (IFCALL, 0, N16_IMM9U (insn16));
7681       goto done;
7682     case 0x3d:                  /* movpi45 */
7683       insn = N32_TYPE1 (MOVI, N16_RT4 (insn16), N16_IMM5U (insn16) + 16);
7684       goto done;
7685
7686     case 0x3f:                  /* MISC33 */
7687       switch (insn16 & 0x7)
7688         {
7689         case 2:                 /* neg33 */
7690           insn = N32_TYPE2 (SUBRI, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7691           break;
7692         case 3:                 /* not33 */
7693           insn = N32_ALU1 (NOR, N16_RT3 (insn16), N16_RA3 (insn16),
7694                            N16_RA3 (insn16));
7695           break;
7696         case 4:                 /* mul33 */
7697           insn = N32_ALU2 (MUL, N16_RT3 (insn16), N16_RT3 (insn16),
7698                            N16_RA3 (insn16));
7699           break;
7700         case 5:                 /* xor33 */
7701           insn = N32_ALU1 (XOR, N16_RT3 (insn16), N16_RT3 (insn16),
7702                            N16_RA3 (insn16));
7703           break;
7704         case 6:                 /* and33 */
7705           insn = N32_ALU1 (AND, N16_RT3 (insn16), N16_RT3 (insn16),
7706                            N16_RA3 (insn16));
7707           break;
7708         case 7:                 /* or33 */
7709           insn = N32_ALU1 (OR, N16_RT3 (insn16), N16_RT3 (insn16),
7710                            N16_RA3 (insn16));
7711           break;
7712         }
7713       goto done;
7714
7715     case 0xb:
7716       switch (insn16 & 0x7)
7717         {
7718         case 0:                 /* zeb33 */
7719           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0xff);
7720           break;
7721         case 1:                 /* zeh33 */
7722           insn = N32_ALU1 (ZEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7723           break;
7724         case 2:                 /* seb33 */
7725           insn = N32_ALU1 (SEB, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7726           break;
7727         case 3:                 /* seh33 */
7728           insn = N32_ALU1 (SEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7729           break;
7730         case 4:                 /* xlsb33 */
7731           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 1);
7732           break;
7733         case 5:                 /* x11b33 */
7734           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0x7ff);
7735           break;
7736         case 6:                 /* bmski33 */
7737           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
7738                             1 << __GF (insn16, 3, 3));
7739           break;
7740         case 7:                 /* fexti33 */
7741           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
7742                             (1 << (__GF (insn16, 3, 3) + 1)) - 1);
7743           break;
7744         }
7745       goto done;
7746     }
7747
7748   switch (__GF (insn16, 10, 5))
7749     {
7750     case 0x0:                   /* mov55 or ifret16 */
7751       if (mach >= MACH_V3 && N16_RT5 (insn16) == REG_SP
7752           && N16_RT5 (insn16) == N16_RA5 (insn16))
7753         insn = N32_JREG (JR, 0, 0, 0, 3);
7754       else
7755         insn = N32_TYPE2 (ADDI, N16_RT5 (insn16), N16_RA5 (insn16), 0);
7756       goto done;
7757     case 0x1:                   /* movi55 */
7758       insn = N32_TYPE1 (MOVI, N16_RT5 (insn16), N16_IMM5S (insn16));
7759       goto done;
7760     case 0x1b:                  /* addi10s (V2) */
7761       insn = N32_TYPE2 (ADDI, REG_SP, REG_SP, N16_IMM10S (insn16));
7762       goto done;
7763     }
7764
7765   switch (__GF (insn16, 11, 4))
7766     {
7767     case 0x7:                   /* lwi37.fp/swi37.fp */
7768       if (insn16 & __BIT (7))   /* swi37.fp */
7769         insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
7770       else                      /* lwi37.fp */
7771         insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
7772       goto done;
7773     case 0x8:                   /* beqz38 */
7774       insn = N32_BR2 (BEQZ, N16_RT38 (insn16), N16_IMM8S (insn16));
7775       goto done;
7776     case 0x9:                   /* bnez38 */
7777       insn = N32_BR2 (BNEZ, N16_RT38 (insn16), N16_IMM8S (insn16));
7778       goto done;
7779     case 0xa:                   /* beqs38/j8, implied r5 */
7780       if (N16_RT38 (insn16) == 5)
7781         insn = N32_JI (J, N16_IMM8S (insn16));
7782       else
7783         insn = N32_BR1 (BEQ, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
7784       goto done;
7785     case 0xb:                   /* bnes38 and others */
7786       if (N16_RT38 (insn16) == 5)
7787         {
7788           switch (__GF (insn16, 5, 3))
7789             {
7790             case 0:             /* jr5 */
7791               insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 0);
7792               break;
7793             case 4:             /* ret5 */
7794               insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 1);
7795               break;
7796             case 1:             /* jral5 */
7797               insn = N32_JREG (JRAL, REG_LP, N16_RA5 (insn16), 0, 0);
7798               break;
7799             case 2:             /* ex9.it imm5 */
7800               /* ex9.it had no 32-bit variantl.  */
7801               break;
7802             case 5:             /* add5.pc */
7803               /* add5.pc had no 32-bit variantl.  */
7804               break;
7805             }
7806         }
7807       else                      /* bnes38 */
7808         insn = N32_BR1 (BNE, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
7809       goto done;
7810     case 0xe:                   /* lwi37/swi37 */
7811       if (insn16 & (1 << 7))    /* swi37.sp */
7812         insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
7813       else                      /* lwi37.sp */
7814         insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
7815       goto done;
7816     }
7817
7818 done:
7819   if (insn & 0x80000000)
7820     return 0;
7821
7822   if (pinsn)
7823     *pinsn = insn;
7824   return 1;
7825 }
7826 \f
7827 static bfd_boolean
7828 is_sda_access_insn (unsigned long insn)
7829 {
7830   switch (N32_OP6 (insn))
7831     {
7832     case N32_OP6_LWI:
7833     case N32_OP6_LHI:
7834     case N32_OP6_LHSI:
7835     case N32_OP6_LBI:
7836     case N32_OP6_LBSI:
7837     case N32_OP6_SWI:
7838     case N32_OP6_SHI:
7839     case N32_OP6_SBI:
7840     case N32_OP6_LWC:
7841     case N32_OP6_LDC:
7842     case N32_OP6_SWC:
7843     case N32_OP6_SDC:
7844       return TRUE;
7845     default:
7846       ;
7847     }
7848   return FALSE;
7849 }
7850
7851 static unsigned long
7852 turn_insn_to_sda_access (uint32_t insn, bfd_signed_vma type, uint32_t *pinsn)
7853 {
7854   uint32_t oinsn = 0;
7855
7856   switch (type)
7857     {
7858     case R_NDS32_GOT_LO12:
7859     case R_NDS32_GOTOFF_LO12:
7860     case R_NDS32_PLTREL_LO12:
7861     case R_NDS32_PLT_GOTREL_LO12:
7862     case R_NDS32_LO12S0_RELA:
7863       switch (N32_OP6 (insn))
7864         {
7865         case N32_OP6_LBI:
7866           /* lbi.gp */
7867           oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0);
7868           break;
7869         case N32_OP6_LBSI:
7870           /* lbsi.gp */
7871           oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), __BIT (19));
7872           break;
7873         case N32_OP6_SBI:
7874           /* sbi.gp */
7875           oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0);
7876           break;
7877         case N32_OP6_ORI:
7878           /* addi.gp */
7879           oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19));
7880           break;
7881         }
7882       break;
7883
7884     case R_NDS32_LO12S1_RELA:
7885       switch (N32_OP6 (insn))
7886         {
7887         case N32_OP6_LHI:
7888           /* lhi.gp */
7889           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0);
7890           break;
7891         case N32_OP6_LHSI:
7892           /* lhsi.gp */
7893           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (18));
7894           break;
7895         case N32_OP6_SHI:
7896           /* shi.gp */
7897           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (19));
7898           break;
7899         }
7900       break;
7901
7902     case R_NDS32_LO12S2_RELA:
7903       switch (N32_OP6 (insn))
7904         {
7905         case N32_OP6_LWI:
7906           /* lwi.gp */
7907           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
7908           break;
7909         case N32_OP6_SWI:
7910           /* swi.gp */
7911           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3));
7912           break;
7913         }
7914       break;
7915
7916     case R_NDS32_LO12S2_DP_RELA:
7917     case R_NDS32_LO12S2_SP_RELA:
7918       oinsn = (insn & 0x7ff07000) | (REG_GP << 15);
7919       break;
7920     }
7921
7922   if (oinsn)
7923     *pinsn = oinsn;
7924
7925   return oinsn != 0;
7926 }
7927
7928 /* Linker hasn't found the correct merge section for non-section symbol
7929    in relax time, this work is left to the function elf_link_input_bfd().
7930    So for non-section symbol, _bfd_merged_section_offset is also needed
7931    to find the correct symbol address.  */
7932
7933 static bfd_vma
7934 nds32_elf_rela_local_sym (bfd *abfd, Elf_Internal_Sym *sym,
7935                           asection **psec, Elf_Internal_Rela *rel)
7936 {
7937   asection *sec = *psec;
7938   bfd_vma relocation;
7939
7940   relocation = (sec->output_section->vma
7941                 + sec->output_offset + sym->st_value);
7942   if ((sec->flags & SEC_MERGE) && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
7943     {
7944       if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
7945         rel->r_addend =
7946           _bfd_merged_section_offset (abfd, psec,
7947                                       elf_section_data (sec)->sec_info,
7948                                       sym->st_value + rel->r_addend);
7949       else
7950         rel->r_addend =
7951           _bfd_merged_section_offset (abfd, psec,
7952                                       elf_section_data (sec)->sec_info,
7953                                       sym->st_value) + rel->r_addend;
7954
7955       if (sec != *psec)
7956         {
7957           /* If we have changed the section, and our original section is
7958              marked with SEC_EXCLUDE, it means that the original
7959              SEC_MERGE section has been completely subsumed in some
7960              other SEC_MERGE section.  In this case, we need to leave
7961              some info around for --emit-relocs.  */
7962           if ((sec->flags & SEC_EXCLUDE) != 0)
7963             sec->kept_section = *psec;
7964           sec = *psec;
7965         }
7966       rel->r_addend -= relocation;
7967       rel->r_addend += sec->output_section->vma + sec->output_offset;
7968     }
7969   return relocation;
7970 }
7971
7972 static bfd_vma
7973 calculate_memory_address (bfd *abfd, Elf_Internal_Rela *irel,
7974                           Elf_Internal_Sym *isymbuf,
7975                           Elf_Internal_Shdr *symtab_hdr)
7976 {
7977   bfd_signed_vma foff;
7978   bfd_vma symval, addend;
7979   Elf_Internal_Rela irel_fn;
7980   Elf_Internal_Sym *isym;
7981   asection *sym_sec;
7982
7983   /* Get the value of the symbol referred to by the reloc.  */
7984   if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
7985     {
7986       /* A local symbol.  */
7987       isym = isymbuf + ELF32_R_SYM (irel->r_info);
7988
7989       if (isym->st_shndx == SHN_UNDEF)
7990         sym_sec = bfd_und_section_ptr;
7991       else if (isym->st_shndx == SHN_ABS)
7992         sym_sec = bfd_abs_section_ptr;
7993       else if (isym->st_shndx == SHN_COMMON)
7994         sym_sec = bfd_com_section_ptr;
7995       else
7996         sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
7997       memcpy (&irel_fn, irel, sizeof (Elf_Internal_Rela));
7998       symval = nds32_elf_rela_local_sym (abfd, isym, &sym_sec, &irel_fn);
7999       addend = irel_fn.r_addend;
8000     }
8001   else
8002     {
8003       unsigned long indx;
8004       struct elf_link_hash_entry *h;
8005
8006       /* An external symbol.  */
8007       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
8008       h = elf_sym_hashes (abfd)[indx];
8009       BFD_ASSERT (h != NULL);
8010
8011       while (h->root.type == bfd_link_hash_indirect
8012              || h->root.type == bfd_link_hash_warning)
8013         h = (struct elf_link_hash_entry *) h->root.u.i.link;
8014
8015       if (h->root.type != bfd_link_hash_defined
8016           && h->root.type != bfd_link_hash_defweak)
8017         /* This appears to be a reference to an undefined
8018            symbol.  Just ignore it--it will be caught by the
8019            regular reloc processing.  */
8020         return 0;
8021
8022       if (h->root.u.def.section->flags & SEC_MERGE)
8023         {
8024           sym_sec = h->root.u.def.section;
8025           symval = _bfd_merged_section_offset (abfd, &sym_sec, elf_section_data
8026                                                (sym_sec)->sec_info, h->root.u.def.value);
8027           symval = symval + sym_sec->output_section->vma
8028                    + sym_sec->output_offset;
8029         }
8030       else
8031         symval = (h->root.u.def.value
8032                   + h->root.u.def.section->output_section->vma
8033                   + h->root.u.def.section->output_offset);
8034       addend = irel->r_addend;
8035     }
8036
8037   foff = symval + addend;
8038
8039   return foff;
8040 }
8041
8042 static bfd_vma
8043 calculate_got_memory_address (bfd *abfd, struct bfd_link_info *link_info,
8044                               Elf_Internal_Rela *irel,
8045                               Elf_Internal_Shdr *symtab_hdr)
8046 {
8047   int symndx;
8048   bfd_vma *local_got_offsets;
8049   /* Get the value of the symbol referred to by the reloc.  */
8050   struct elf_link_hash_entry *h;
8051   struct elf_nds32_link_hash_table *htab = nds32_elf_hash_table (link_info);
8052
8053   /* An external symbol.  */
8054   symndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
8055   h = elf_sym_hashes (abfd)[symndx];
8056   while (h->root.type == bfd_link_hash_indirect
8057          || h->root.type == bfd_link_hash_warning)
8058     h = (struct elf_link_hash_entry *) h->root.u.i.link;
8059
8060   if (symndx >= 0)
8061     {
8062       BFD_ASSERT (h != NULL);
8063       return (htab->root.sgot->output_section->vma
8064               + htab->root.sgot->output_offset
8065               + h->got.offset);
8066     }
8067   else
8068     {
8069       local_got_offsets = elf_local_got_offsets (abfd);
8070       BFD_ASSERT (local_got_offsets != NULL);
8071       return (htab->root.sgot->output_section->vma
8072               + htab->root.sgot->output_offset
8073               + local_got_offsets[ELF32_R_SYM (irel->r_info)]);
8074     }
8075
8076   /* The _GLOBAL_OFFSET_TABLE_ may be undefweak(or should be?).  */
8077   /* The check of h->root.type is passed.  */
8078 }
8079
8080 static int
8081 is_16bit_NOP (bfd *abfd ATTRIBUTE_UNUSED,
8082               asection *sec, Elf_Internal_Rela *rel)
8083 {
8084   bfd_byte *contents;
8085   unsigned short insn16;
8086
8087   if (!(rel->r_addend & R_NDS32_INSN16_CONVERT_FLAG))
8088     return FALSE;
8089   contents = elf_section_data (sec)->this_hdr.contents;
8090   insn16 = bfd_getb16 (contents + rel->r_offset);
8091   if (insn16 == NDS32_NOP16)
8092     return TRUE;
8093   return FALSE;
8094 }
8095
8096 /* It checks whether the instruction could be converted to
8097    16-bit form and returns the converted one.
8098
8099    `internal_relocs' is supposed to be sorted.  */
8100
8101 static int
8102 is_convert_32_to_16 (bfd *abfd, asection *sec,
8103                      Elf_Internal_Rela *reloc,
8104                      Elf_Internal_Rela *internal_relocs,
8105                      Elf_Internal_Rela *irelend,
8106                      uint16_t *insn16)
8107 {
8108 #define NORMAL_32_TO_16 (1 << 0)
8109 #define SPECIAL_32_TO_16 (1 << 1)
8110   bfd_byte *contents = NULL;
8111   bfd_signed_vma off;
8112   bfd_vma mem_addr;
8113   uint32_t insn = 0;
8114   Elf_Internal_Rela *pc_rel;
8115   int pic_ext_target = 0;
8116   Elf_Internal_Shdr *symtab_hdr;
8117   Elf_Internal_Sym *isymbuf = NULL;
8118   int convert_type;
8119   bfd_vma offset;
8120
8121   if (reloc->r_offset + 4 > sec->size)
8122     return FALSE;
8123
8124   offset = reloc->r_offset;
8125
8126   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
8127     return FALSE;
8128   insn = bfd_getb32 (contents + offset);
8129
8130   if (nds32_convert_32_to_16 (abfd, insn, insn16, NULL))
8131     convert_type = NORMAL_32_TO_16;
8132   else if (special_convert_32_to_16 (insn, insn16, reloc))
8133     convert_type = SPECIAL_32_TO_16;
8134   else
8135     return FALSE;
8136
8137   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8138   if (!nds32_get_local_syms (abfd, sec, &isymbuf))
8139     return FALSE;
8140
8141   /* Find the first relocation of the same relocation-type,
8142      so we iteratie them forward.  */
8143   pc_rel = reloc;
8144   while ((pc_rel - 1) >= internal_relocs && pc_rel[-1].r_offset == offset)
8145     pc_rel--;
8146
8147   for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
8148     {
8149       if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
8150           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
8151           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA
8152           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
8153         {
8154           off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr,
8155                                   &pic_ext_target);
8156           if (off >= ACCURATE_8BIT_S1 || off < -ACCURATE_8BIT_S1
8157               || off == 0)
8158             return FALSE;
8159           break;
8160         }
8161       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
8162         {
8163           /* movi => movi55  */
8164           mem_addr = calculate_memory_address (abfd, pc_rel, isymbuf,
8165                                                symtab_hdr);
8166           /* mem_addr is unsigned, but the value should
8167              be between [-16, 15].  */
8168           if ((mem_addr + 0x10) >> 5)
8169             return FALSE;
8170           break;
8171         }
8172       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_20)
8173                || (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_LO12))
8174         {
8175           /* It never happen movi to movi55 for R_NDS32_TLS_LE_20,
8176              because it can be relaxed to addi for TLS_LE_ADD.  */
8177           return FALSE;
8178         }
8179       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
8180                 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
8181                && (reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG)
8182                && convert_type == SPECIAL_32_TO_16)
8183         {
8184           /* fp-as-gp
8185              We've selected a best fp-base for this access, so we can
8186              always resolve it anyway.  Do nothing.  */
8187           break;
8188         }
8189       else if ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_NONE
8190                 && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_RELA_GNU_VTINHERIT))
8191                || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_RELA_GNU_VTENTRY)
8192                    && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_INSN16))
8193                || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_LOADSTORE)
8194                    && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_DWARF2_OP1_RELA)))
8195         {
8196           /* Prevent unresolved addi instruction translate
8197              to addi45 or addi333.  */
8198           return FALSE;
8199         }
8200       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
8201         {
8202           off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr,
8203                                   &pic_ext_target);
8204           if (off >= ACCURATE_U9BIT_S1 || off <= 0)
8205             return FALSE;
8206           break;
8207         }
8208     }
8209
8210   return TRUE;
8211 }
8212
8213 static void
8214 nds32_elf_write_16 (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *contents,
8215                     Elf_Internal_Rela *reloc,
8216                     Elf_Internal_Rela *internal_relocs,
8217                     Elf_Internal_Rela *irelend,
8218                     unsigned short insn16)
8219 {
8220   Elf_Internal_Rela *pc_rel;
8221   bfd_vma offset;
8222
8223   offset = reloc->r_offset;
8224   bfd_putb16 (insn16, contents + offset);
8225   /* Find the first relocation of the same relocation-type,
8226      so we iteratie them forward.  */
8227   pc_rel = reloc;
8228   while ((pc_rel - 1) > internal_relocs && pc_rel[-1].r_offset == offset)
8229     pc_rel--;
8230
8231   for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
8232     {
8233       if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
8234           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
8235           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA)
8236         {
8237           pc_rel->r_info =
8238             ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PCREL_RELA);
8239         }
8240       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
8241         pc_rel->r_info =
8242           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PLTREL);
8243       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
8244         pc_rel->r_info =
8245           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_5_RELA);
8246       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
8247                || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
8248         pc_rel->r_info =
8249           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_SDA_FP7U2_RELA);
8250       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
8251         pc_rel->r_info =
8252           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_10IFCU_PCREL_RELA);
8253     }
8254 }
8255
8256 /* Find a relocation of type specified by `reloc_type'
8257    of the same r_offset with reloc.
8258    If not found, return irelend.
8259
8260    Assuming relocations are sorted by r_offset,
8261    we find the relocation from `reloc' backward untill relocs,
8262    or find it from `reloc' forward untill irelend.  */
8263
8264 static Elf_Internal_Rela *
8265 find_relocs_at_address (Elf_Internal_Rela *reloc,
8266                         Elf_Internal_Rela *relocs,
8267                         Elf_Internal_Rela *irelend,
8268                         enum elf_nds32_reloc_type reloc_type)
8269 {
8270   Elf_Internal_Rela *rel_t;
8271
8272   /* Find backward.  */
8273   for (rel_t = reloc;
8274        rel_t >= relocs && rel_t->r_offset == reloc->r_offset;
8275        rel_t--)
8276     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8277       return rel_t;
8278
8279   /* We didn't find it backward.  Try find it forward.  */
8280   for (rel_t = reloc;
8281        rel_t < irelend && rel_t->r_offset == reloc->r_offset;
8282        rel_t++)
8283     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8284       return rel_t;
8285
8286   return irelend;
8287 }
8288
8289 /* Find a relocation of specified type and offset.
8290    `reloc' is just a refence point to find a relocation at specified offset.
8291    If not found, return irelend.
8292
8293    Assuming relocations are sorted by r_offset,
8294    we find the relocation from `reloc' backward untill relocs,
8295    or find it from `reloc' forward untill irelend.  */
8296
8297 static Elf_Internal_Rela *
8298 find_relocs_at_address_addr (Elf_Internal_Rela *reloc,
8299                              Elf_Internal_Rela *relocs,
8300                              Elf_Internal_Rela *irelend,
8301                              enum elf_nds32_reloc_type reloc_type,
8302                              bfd_vma offset_p)
8303 {
8304   Elf_Internal_Rela *rel_t = NULL;
8305
8306   /* First, we try to find a relocation of offset `offset_p',
8307      and then we use find_relocs_at_address to find specific type.  */
8308
8309   if (reloc->r_offset > offset_p)
8310     {
8311       /* Find backward.  */
8312       for (rel_t = reloc;
8313            rel_t >= relocs && rel_t->r_offset > offset_p; rel_t--)
8314         /* Do nothing.  */;
8315     }
8316   else if (reloc->r_offset < offset_p)
8317     {
8318       /* Find forward.  */
8319       for (rel_t = reloc;
8320            rel_t < irelend && rel_t->r_offset < offset_p; rel_t++)
8321         /* Do nothing.  */;
8322     }
8323   else
8324     rel_t = reloc;
8325
8326   /* Not found?  */
8327   if (rel_t < relocs || rel_t == irelend || rel_t->r_offset != offset_p)
8328     return irelend;
8329
8330   return find_relocs_at_address (rel_t, relocs, irelend, reloc_type);
8331 }
8332
8333 static bfd_boolean
8334 nds32_elf_check_dup_relocs (Elf_Internal_Rela *reloc,
8335                             Elf_Internal_Rela *internal_relocs,
8336                             Elf_Internal_Rela *irelend,
8337                             unsigned char reloc_type)
8338 {
8339   Elf_Internal_Rela *rel_t;
8340
8341   for (rel_t = reloc;
8342        rel_t >= internal_relocs && rel_t->r_offset == reloc->r_offset;
8343        rel_t--)
8344     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8345       {
8346         if (ELF32_R_SYM (rel_t->r_info) == ELF32_R_SYM (reloc->r_info)
8347             && rel_t->r_addend == reloc->r_addend)
8348           continue;
8349         return TRUE;
8350       }
8351
8352   for (rel_t = reloc; rel_t < irelend && rel_t->r_offset == reloc->r_offset;
8353        rel_t++)
8354     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8355       {
8356         if (ELF32_R_SYM (rel_t->r_info) == ELF32_R_SYM (reloc->r_info)
8357             && rel_t->r_addend == reloc->r_addend)
8358           continue;
8359         return TRUE;
8360       }
8361
8362   return FALSE;
8363 }
8364
8365 typedef struct nds32_elf_blank nds32_elf_blank_t;
8366 struct nds32_elf_blank
8367 {
8368   /* Where the blank begins.  */
8369   bfd_vma offset;
8370   /* The size of the blank.  */
8371   bfd_vma size;
8372   /* The accumulative size before this blank.  */
8373   bfd_vma total_size;
8374   nds32_elf_blank_t *next;
8375   nds32_elf_blank_t *prev;
8376 };
8377
8378 static nds32_elf_blank_t *blank_free_list = NULL;
8379
8380 static nds32_elf_blank_t *
8381 create_nds32_elf_blank (bfd_vma offset_p, bfd_vma size_p)
8382 {
8383   nds32_elf_blank_t *blank_t;
8384
8385   if (blank_free_list)
8386     {
8387       blank_t = blank_free_list;
8388       blank_free_list = blank_free_list->next;
8389     }
8390   else
8391     blank_t = bfd_malloc (sizeof (nds32_elf_blank_t));
8392
8393   if (blank_t == NULL)
8394     return NULL;
8395
8396   blank_t->offset = offset_p;
8397   blank_t->size = size_p;
8398   blank_t->total_size = 0;
8399   blank_t->next = NULL;
8400   blank_t->prev = NULL;
8401
8402   return blank_t;
8403 }
8404
8405 static void
8406 remove_nds32_elf_blank (nds32_elf_blank_t *blank_p)
8407 {
8408   if (blank_free_list)
8409     {
8410       blank_free_list->prev = blank_p;
8411       blank_p->next = blank_free_list;
8412     }
8413   else
8414     blank_p->next = NULL;
8415
8416   blank_p->prev = NULL;
8417   blank_free_list = blank_p;
8418 }
8419
8420 static void
8421 clean_nds32_elf_blank (void)
8422 {
8423   nds32_elf_blank_t *blank_t;
8424
8425   while (blank_free_list)
8426     {
8427       blank_t = blank_free_list;
8428       blank_free_list = blank_free_list->next;
8429       free (blank_t);
8430     }
8431 }
8432
8433 static nds32_elf_blank_t *
8434 search_nds32_elf_blank (nds32_elf_blank_t *blank_p, bfd_vma addr)
8435 {
8436   nds32_elf_blank_t *blank_t;
8437
8438   if (!blank_p)
8439     return NULL;
8440   blank_t = blank_p;
8441
8442   while (blank_t && addr < blank_t->offset)
8443     blank_t = blank_t->prev;
8444   while (blank_t && blank_t->next && addr >= blank_t->next->offset)
8445     blank_t = blank_t->next;
8446
8447   return blank_t;
8448 }
8449
8450 static bfd_vma
8451 get_nds32_elf_blank_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
8452                            int overwrite)
8453 {
8454   nds32_elf_blank_t *blank_t;
8455
8456   blank_t = search_nds32_elf_blank (*blank_p, addr);
8457   if (!blank_t)
8458     return 0;
8459
8460   if (overwrite)
8461     *blank_p = blank_t;
8462
8463   if (addr < blank_t->offset + blank_t->size)
8464     return blank_t->total_size + (addr - blank_t->offset);
8465   else
8466     return blank_t->total_size + blank_t->size;
8467 }
8468
8469 static bfd_boolean
8470 insert_nds32_elf_blank (nds32_elf_blank_t **blank_p, bfd_vma addr, bfd_vma len)
8471 {
8472   nds32_elf_blank_t *blank_t, *blank_t2;
8473
8474   if (!*blank_p)
8475     {
8476       *blank_p = create_nds32_elf_blank (addr, len);
8477       return *blank_p ? TRUE : FALSE;
8478     }
8479
8480   blank_t = search_nds32_elf_blank (*blank_p, addr);
8481
8482   if (blank_t == NULL)
8483     {
8484       blank_t = create_nds32_elf_blank (addr, len);
8485       if (!blank_t)
8486         return FALSE;
8487       while ((*blank_p)->prev != NULL)
8488         *blank_p = (*blank_p)->prev;
8489       blank_t->next = *blank_p;
8490       (*blank_p)->prev = blank_t;
8491       (*blank_p) = blank_t;
8492       return TRUE;
8493     }
8494
8495   if (addr < blank_t->offset + blank_t->size)
8496     {
8497       if (addr > blank_t->offset + blank_t->size)
8498         blank_t->size = addr - blank_t->offset;
8499     }
8500   else
8501     {
8502       blank_t2 = create_nds32_elf_blank (addr, len);
8503       if (!blank_t2)
8504         return FALSE;
8505       if (blank_t->next)
8506         {
8507           blank_t->next->prev = blank_t2;
8508           blank_t2->next = blank_t->next;
8509         }
8510       blank_t2->prev = blank_t;
8511       blank_t->next = blank_t2;
8512       *blank_p = blank_t2;
8513     }
8514
8515   return TRUE;
8516 }
8517
8518 static bfd_boolean
8519 insert_nds32_elf_blank_recalc_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
8520                                      bfd_vma len)
8521 {
8522   nds32_elf_blank_t *blank_t;
8523
8524   if (!insert_nds32_elf_blank (blank_p, addr, len))
8525     return FALSE;
8526
8527   blank_t = *blank_p;
8528
8529   if (!blank_t->prev)
8530     {
8531       blank_t->total_size = 0;
8532       blank_t = blank_t->next;
8533     }
8534
8535   while (blank_t)
8536     {
8537       blank_t->total_size = blank_t->prev->total_size + blank_t->prev->size;
8538       blank_t = blank_t->next;
8539     }
8540
8541   return TRUE;
8542 }
8543
8544 static void
8545 calc_nds32_blank_total (nds32_elf_blank_t *blank_p)
8546 {
8547   nds32_elf_blank_t *blank_t;
8548   bfd_vma total_size = 0;
8549
8550   if (!blank_p)
8551     return;
8552
8553   blank_t = blank_p;
8554   while (blank_t->prev)
8555     blank_t = blank_t->prev;
8556   while (blank_t)
8557     {
8558       blank_t->total_size = total_size;
8559       total_size += blank_t->size;
8560       blank_t = blank_t->next;
8561     }
8562 }
8563
8564 static bfd_boolean
8565 nds32_elf_relax_delete_blanks (bfd *abfd, asection *sec,
8566                                nds32_elf_blank_t *blank_p)
8567 {
8568   Elf_Internal_Shdr *symtab_hdr;        /* Symbol table header of this bfd.  */
8569   Elf_Internal_Sym *isym = NULL;        /* Symbol table of this bfd.  */
8570   Elf_Internal_Sym *isymend;            /* Symbol entry iterator.  */
8571   unsigned int sec_shndx;               /* The section the be relaxed.  */
8572   bfd_byte *contents;                   /* Contents data of iterating section.  */
8573   Elf_Internal_Rela *internal_relocs;
8574   Elf_Internal_Rela *irel;
8575   Elf_Internal_Rela *irelend;
8576   struct elf_link_hash_entry **sym_hashes;
8577   struct elf_link_hash_entry **end_hashes;
8578   unsigned int symcount;
8579   asection *sect;
8580   nds32_elf_blank_t *blank_t;
8581   nds32_elf_blank_t *blank_t2;
8582   nds32_elf_blank_t *blank_head;
8583
8584   blank_head = blank_t = blank_p;
8585   while (blank_head->prev != NULL)
8586     blank_head = blank_head->prev;
8587   while (blank_t->next != NULL)
8588     blank_t = blank_t->next;
8589
8590   if (blank_t->offset + blank_t->size <= sec->size)
8591     {
8592       blank_t->next = create_nds32_elf_blank (sec->size + 4, 0);
8593       blank_t->next->prev = blank_t;
8594     }
8595   if (blank_head->offset > 0)
8596     {
8597       blank_head->prev = create_nds32_elf_blank (0, 0);
8598       blank_head->prev->next = blank_head;
8599       blank_head = blank_head->prev;
8600     }
8601
8602   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
8603
8604   /* The deletion must stop at the next ALIGN reloc for an alignment
8605      power larger than the number of bytes we are deleting.  */
8606
8607   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8608   if (!nds32_get_local_syms (abfd, sec, &isym))
8609     return FALSE;
8610
8611   if (isym == NULL)
8612     {
8613       isym = bfd_elf_get_elf_syms (abfd, symtab_hdr,
8614                                    symtab_hdr->sh_info, 0, NULL, NULL, NULL);
8615       symtab_hdr->contents = (bfd_byte *) isym;
8616     }
8617
8618   if (isym == NULL || symtab_hdr->sh_info == 0)
8619     return FALSE;
8620
8621   blank_t = blank_head;
8622   calc_nds32_blank_total (blank_head);
8623
8624   for (sect = abfd->sections; sect != NULL; sect = sect->next)
8625     {
8626       /* Adjust all the relocs.  */
8627
8628       /* Relocations MUST be kept in memory, because relaxation adjust them.  */
8629       internal_relocs = _bfd_elf_link_read_relocs (abfd, sect, NULL, NULL,
8630                                                    TRUE /* keep_memory */);
8631       irelend = internal_relocs + sect->reloc_count;
8632
8633       blank_t = blank_head;
8634       blank_t2 = blank_head;
8635
8636       if (!(sect->flags & SEC_RELOC))
8637         continue;
8638
8639       nds32_get_section_contents (abfd, sect, &contents, TRUE);
8640
8641       for (irel = internal_relocs; irel < irelend; irel++)
8642         {
8643           bfd_vma raddr;
8644
8645           if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_DIFF8
8646               && ELF32_R_TYPE (irel->r_info) <= R_NDS32_DIFF32
8647               && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
8648             {
8649               unsigned long val = 0;
8650               unsigned long mask;
8651               long before, between;
8652               long offset = 0;
8653
8654               switch (ELF32_R_TYPE (irel->r_info))
8655                 {
8656                 case R_NDS32_DIFF8:
8657                   offset = bfd_get_8 (abfd, contents + irel->r_offset);
8658                   break;
8659                 case R_NDS32_DIFF16:
8660                   offset = bfd_get_16 (abfd, contents + irel->r_offset);
8661                   break;
8662                 case R_NDS32_DIFF32:
8663                   val = bfd_get_32 (abfd, contents + irel->r_offset);
8664                   /* Get the signed bit and mask for the high part.  The
8665                      gcc will alarm when right shift 32-bit since the
8666                      type size of long may be 32-bit.  */
8667                   mask = 0 - (val >> 31);
8668                   if (mask)
8669                     offset = (val | (mask - 0xffffffff));
8670                   else
8671                     offset = val;
8672                   break;
8673                 default:
8674                   BFD_ASSERT (0);
8675                 }
8676
8677               /*                  DIFF value
8678                 0            |encoded in location|
8679                 |------------|-------------------|---------
8680                             sym+off(addend)
8681                 -- before ---| *****************
8682                 --------------------- between ---|
8683
8684                 We only care how much data are relax between DIFF,
8685                 marked as ***.  */
8686
8687               before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
8688               between = get_nds32_elf_blank_total (&blank_t,
8689                                                    irel->r_addend + offset, 0);
8690               if (between == before)
8691                 goto done_adjust_diff;
8692
8693               switch (ELF32_R_TYPE (irel->r_info))
8694                 {
8695                 case R_NDS32_DIFF8:
8696                   bfd_put_8 (abfd, offset - (between - before),
8697                              contents + irel->r_offset);
8698                   break;
8699                 case R_NDS32_DIFF16:
8700                   bfd_put_16 (abfd, offset - (between - before),
8701                               contents + irel->r_offset);
8702                   break;
8703                 case R_NDS32_DIFF32:
8704                   bfd_put_32 (abfd, offset - (between - before),
8705                               contents + irel->r_offset);
8706                   break;
8707                 }
8708             }
8709           else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_DIFF_ULEB128
8710               && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
8711             {
8712               bfd_vma val = 0;
8713               unsigned int len = 0;
8714               unsigned long before, between;
8715               bfd_byte *endp, *p;
8716
8717               val = read_unsigned_leb128 (abfd, contents + irel->r_offset,
8718                                           &len);
8719
8720               before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
8721               between = get_nds32_elf_blank_total (&blank_t,
8722                                                    irel->r_addend + val, 0);
8723               if (between == before)
8724                 goto done_adjust_diff;
8725
8726               p = contents + irel->r_offset;
8727               endp = p + len -1;
8728               memset (p, 0x80, len);
8729               *(endp) = 0;
8730               p = write_uleb128 (p, val - (between - before)) - 1;
8731               if (p < endp)
8732                 *p |= 0x80;
8733             }
8734 done_adjust_diff:
8735
8736           if (sec == sect)
8737             {
8738               raddr = irel->r_offset;
8739               irel->r_offset -= get_nds32_elf_blank_total (&blank_t2,
8740                                                            irel->r_offset, 1);
8741
8742               if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
8743                 continue;
8744               if (blank_t2 && blank_t2->next
8745                   && (blank_t2->offset > raddr
8746                       || blank_t2->next->offset <= raddr))
8747                 _bfd_error_handler
8748                   (_("%B: Error: search_nds32_elf_blank reports wrong node\n"), abfd);
8749
8750               /* Mark reloc in deleted portion as NONE.
8751                  For some relocs like R_NDS32_LABEL that doesn't modify the
8752                  content in the section.  R_NDS32_LABEL doesn't belong to the
8753                  instruction in the section, so we should preserve it.  */
8754               if (raddr >= blank_t2->offset
8755                   && raddr < blank_t2->offset + blank_t2->size
8756                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL
8757                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_BEGIN
8758                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_END
8759                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
8760                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_SUBTRAHEND
8761                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_MINUEND)
8762                 {
8763                   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
8764                                                R_NDS32_NONE);
8765                   continue;
8766                 }
8767             }
8768
8769           if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE
8770               || ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
8771               || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
8772             continue;
8773
8774           if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info
8775               && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx
8776               && ELF_ST_TYPE (isym[ELF32_R_SYM (irel->r_info)].st_info) == STT_SECTION)
8777             {
8778               if (irel->r_addend <= sec->size)
8779                 irel->r_addend -=
8780                   get_nds32_elf_blank_total (&blank_t, irel->r_addend, 1);
8781             }
8782         }
8783     }
8784
8785   /* Adjust the local symbols defined in this section.  */
8786   blank_t = blank_head;
8787   for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
8788     {
8789       if (isym->st_shndx == sec_shndx)
8790         {
8791           if (isym->st_value <= sec->size)
8792             {
8793               bfd_vma ahead;
8794               bfd_vma orig_addr = isym->st_value;
8795
8796               ahead = get_nds32_elf_blank_total (&blank_t, isym->st_value, 1);
8797               isym->st_value -= ahead;
8798
8799               /* Adjust function size.  */
8800               if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC
8801                   && isym->st_size > 0)
8802                 isym->st_size -=
8803                   get_nds32_elf_blank_total
8804                   (&blank_t, orig_addr + isym->st_size, 0) - ahead;
8805             }
8806         }
8807     }
8808
8809   /* Now adjust the global symbols defined in this section.  */
8810   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
8811               - symtab_hdr->sh_info);
8812   sym_hashes = elf_sym_hashes (abfd);
8813   end_hashes = sym_hashes + symcount;
8814   blank_t = blank_head;
8815   for (; sym_hashes < end_hashes; sym_hashes++)
8816     {
8817       struct elf_link_hash_entry *sym_hash = *sym_hashes;
8818
8819       if ((sym_hash->root.type == bfd_link_hash_defined
8820            || sym_hash->root.type == bfd_link_hash_defweak)
8821           && sym_hash->root.u.def.section == sec)
8822         {
8823           if (sym_hash->root.u.def.value <= sec->size)
8824             {
8825               bfd_vma ahead;
8826               bfd_vma orig_addr = sym_hash->root.u.def.value;
8827
8828               ahead = get_nds32_elf_blank_total (&blank_t, sym_hash->root.u.def.value, 1);
8829               sym_hash->root.u.def.value -= ahead;
8830
8831               /* Adjust function size.  */
8832               if (sym_hash->type == STT_FUNC)
8833                 sym_hash->size -=
8834                   get_nds32_elf_blank_total
8835                   (&blank_t, orig_addr + sym_hash->size, 0) - ahead;
8836
8837             }
8838         }
8839     }
8840
8841   contents = elf_section_data (sec)->this_hdr.contents;
8842   blank_t = blank_head;
8843   while (blank_t->next)
8844     {
8845       /* Actually delete the bytes.  */
8846
8847       /* If current blank is the last blank overlap with current section,
8848          go to finish process.  */
8849       if (sec->size <= (blank_t->next->offset))
8850         break;
8851
8852       memmove (contents + blank_t->offset - blank_t->total_size,
8853                contents + blank_t->offset + blank_t->size,
8854                blank_t->next->offset - (blank_t->offset + blank_t->size));
8855
8856       blank_t = blank_t->next;
8857     }
8858
8859   if (sec->size > (blank_t->offset + blank_t->size))
8860     {
8861       /* There are remaining code between blank and section boundary.
8862          Move the remaining code to appropriate location.  */
8863       memmove (contents + blank_t->offset - blank_t->total_size,
8864                contents + blank_t->offset + blank_t->size,
8865                sec->size - (blank_t->offset + blank_t->size));
8866       sec->size -= blank_t->total_size + blank_t->size;
8867     }
8868   else
8869     /* This blank is not entirely included in the section,
8870        reduce the section size by only part of the blank size.  */
8871     sec->size -= blank_t->total_size + (sec->size - blank_t->offset);
8872
8873   while (blank_head)
8874     {
8875       blank_t = blank_head;
8876       blank_head = blank_head->next;
8877       remove_nds32_elf_blank (blank_t);
8878     }
8879
8880   return TRUE;
8881 }
8882
8883 /* Get the contents of a section.  */
8884
8885 static int
8886 nds32_get_section_contents (bfd *abfd, asection *sec,
8887                             bfd_byte **contents_p, bfd_boolean cache)
8888 {
8889   /* Get the section contents.  */
8890   if (elf_section_data (sec)->this_hdr.contents != NULL)
8891     *contents_p = elf_section_data (sec)->this_hdr.contents;
8892   else
8893     {
8894       if (!bfd_malloc_and_get_section (abfd, sec, contents_p))
8895         return FALSE;
8896       if (cache)
8897         elf_section_data (sec)->this_hdr.contents = *contents_p;
8898     }
8899
8900   return TRUE;
8901 }
8902
8903 /* Get the contents of the internal symbol of abfd.  */
8904
8905 static int
8906 nds32_get_local_syms (bfd *abfd, asection *sec ATTRIBUTE_UNUSED,
8907                       Elf_Internal_Sym **isymbuf_p)
8908 {
8909   Elf_Internal_Shdr *symtab_hdr;
8910   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8911
8912   /* Read this BFD's local symbols if we haven't done so already.  */
8913   if (*isymbuf_p == NULL && symtab_hdr->sh_info != 0)
8914     {
8915       *isymbuf_p = (Elf_Internal_Sym *) symtab_hdr->contents;
8916       if (*isymbuf_p == NULL)
8917         {
8918           *isymbuf_p = bfd_elf_get_elf_syms (abfd, symtab_hdr,
8919                                              symtab_hdr->sh_info, 0,
8920                                              NULL, NULL, NULL);
8921           if (*isymbuf_p == NULL)
8922             return FALSE;
8923         }
8924     }
8925   symtab_hdr->contents = (bfd_byte *) (*isymbuf_p);
8926
8927   return TRUE;
8928 }
8929
8930 /* Range of small data.  */
8931 static bfd_vma sdata_range[2][2];
8932 static bfd_vma const sdata_init_range[2] =
8933 { ACCURATE_12BIT_S1, ACCURATE_19BIT };
8934
8935 static int
8936 nds32_elf_insn_size (bfd *abfd ATTRIBUTE_UNUSED,
8937                      bfd_byte *contents, bfd_vma addr)
8938 {
8939   unsigned long insn = bfd_getb32 (contents + addr);
8940
8941   if (insn & 0x80000000)
8942     return 2;
8943
8944   return 4;
8945 }
8946
8947 /* Set the gp relax range.  We have to measure the safe range
8948    to do gp relaxation.  */
8949
8950 static void
8951 relax_range_measurement (bfd *abfd)
8952 {
8953   asection *sec_f, *sec_b;
8954   /* For upper bound.   */
8955   bfd_vma maxpgsz = get_elf_backend_data (abfd)->maxpagesize;
8956   bfd_vma align;
8957   static int decide_relax_range = 0;
8958   int i;
8959   int range_number = sizeof (sdata_init_range) / sizeof (sdata_init_range[0]);
8960
8961   if (decide_relax_range)
8962     return;
8963   decide_relax_range = 1;
8964
8965   if (sda_rela_sec == NULL)
8966     {
8967       /* Since there is no data sections, we assume the range is page size.  */
8968       for (i = 0; i < range_number; i++)
8969         {
8970           sdata_range[i][0] = sdata_init_range[i] - 0x1000;
8971           sdata_range[i][1] = sdata_init_range[i] - 0x1000;
8972         }
8973       return;
8974     }
8975
8976   /* Get the biggest alignment power after the gp located section.  */
8977   sec_f = sda_rela_sec->output_section;
8978   sec_b = sec_f->next;
8979   align = 0;
8980   while (sec_b != NULL)
8981     {
8982       if ((unsigned)(1 << sec_b->alignment_power) > align)
8983         align = (1 << sec_b->alignment_power);
8984       sec_b = sec_b->next;
8985     }
8986
8987   /* I guess we can not determine the section before
8988      gp located section, so we assume the align is max page size.  */
8989   for (i = 0; i < range_number; i++)
8990     {
8991       sdata_range[i][1] = sdata_init_range[i] - align;
8992       BFD_ASSERT (sdata_range[i][1] <= sdata_init_range[i]);
8993       sdata_range[i][0] = sdata_init_range[i] - maxpgsz;
8994       BFD_ASSERT (sdata_range[i][0] <= sdata_init_range[i]);
8995     }
8996 }
8997
8998 /* These are macros used to check flags encoded in r_addend.
8999    They are only used by nds32_elf_relax_section ().  */
9000 #define GET_SEQ_LEN(addend)     ((addend) & 0x000000ff)
9001 #define IS_1ST_CONVERT(addend)  ((addend) & 0x80000000)
9002 #define IS_OPTIMIZE(addend)     ((addend) & 0x40000000)
9003 #define IS_16BIT_ON(addend)     ((addend) & 0x20000000)
9004
9005 static const char * unrecognized_reloc_msg =
9006   /* xgettext:c-format */
9007   N_("%B: warning: %s points to unrecognized reloc at 0x%lx.");
9008
9009 /* Relax LONGCALL1 relocation for nds32_elf_relax_section.  */
9010
9011 static bfd_boolean
9012 nds32_elf_relax_longcall1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9013                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9014                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9015                            Elf_Internal_Shdr *symtab_hdr)
9016 {
9017   /* There are 3 variations for LONGCALL1
9018      case 4-4-2; 16-bit on, optimize off or optimize for space
9019      sethi ta, hi20(symbol)     ; LONGCALL1/HI20
9020      ori   ta, ta, lo12(symbol) ; LO12S0
9021      jral5 ta                   ;
9022
9023      case 4-4-4; 16-bit off, optimize don't care
9024      sethi ta, hi20(symbol)     ; LONGCALL1/HI20
9025      ori   ta, ta, lo12(symbol) ; LO12S0
9026      jral  ta                   ;
9027
9028      case 4-4-4; 16-bit on, optimize for speed
9029      sethi ta, hi20(symbol)     ; LONGCALL1/HI20
9030      ori   ta, ta, lo12(symbol) ; LO12S0
9031      jral  ta                   ;
9032      Check code for -mlong-calls output.  */
9033
9034   /* Get the reloc for the address from which the register is
9035      being loaded.  This reloc will tell us which function is
9036      actually being called.  */
9037
9038   bfd_vma laddr;
9039   int seq_len;  /* Original length of instruction sequence.  */
9040   uint32_t insn;
9041   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
9042   int pic_ext_target = 0;
9043   bfd_signed_vma foff;
9044   uint16_t insn16;
9045
9046   irelend = internal_relocs + sec->reloc_count;
9047   seq_len = GET_SEQ_LEN (irel->r_addend);
9048   laddr = irel->r_offset;
9049   *insn_len = seq_len;
9050
9051   hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9052                                            R_NDS32_HI20_RELA, laddr);
9053   lo_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9054                                            R_NDS32_LO12S0_ORI_RELA,
9055                                            laddr + 4);
9056
9057   if (hi_irelfn == irelend || lo_irelfn == irelend)
9058     {
9059       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL1",
9060                           (long) irel->r_offset);
9061       return FALSE;
9062     }
9063
9064   /* Get the value of the symbol referred to by the reloc.  */
9065   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9066                            &pic_ext_target);
9067
9068   /* This condition only happened when symbol is undefined.  */
9069   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9070       || foff >= CONSERVATIVE_24BIT_S1)
9071     return FALSE;
9072
9073   /* Relax to: jal symbol; 25_PCREL */
9074   /* For simplicity of coding, we are going to modify the section
9075      contents, the section relocs, and the BFD symbol table.  We
9076      must tell the rest of the code not to free up this
9077      information.  It would be possible to instead create a table
9078      of changes which have to be made, as is done in coff-mips.c;
9079      that would be more work, but would require less memory when
9080      the linker is run.  */
9081
9082   /* Replace the long call with a jal.  */
9083   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9084                                R_NDS32_25_PCREL_RELA);
9085   irel->r_addend = hi_irelfn->r_addend;
9086
9087   /* We don't resolve this here but resolve it in relocate_section.  */
9088   insn = INSN_JAL;
9089   bfd_putb32 (insn, contents + irel->r_offset);
9090
9091   hi_irelfn->r_info =
9092     ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9093   lo_irelfn->r_info =
9094     ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9095   *insn_len = 4;
9096
9097   if (seq_len & 0x2)
9098     {
9099       insn16 = NDS32_NOP16;
9100       bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9101       lo_irelfn->r_info =
9102         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
9103       lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9104       *insn_len += 2;
9105     }
9106   return TRUE;
9107 }
9108
9109 #define CONVERT_CONDITION_CALL(insn) (((insn) & 0xffff0000) ^ 0x90000)
9110 /* Relax LONGCALL2 relocation for nds32_elf_relax_section.  */
9111
9112 static bfd_boolean
9113 nds32_elf_relax_longcall2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9114                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9115                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9116                            Elf_Internal_Shdr *symtab_hdr)
9117 {
9118   /* bltz  rt, .L1   ; LONGCALL2
9119      jal   symbol   ; 25_PCREL
9120      .L1: */
9121
9122   /* Get the reloc for the address from which the register is
9123      being loaded.  This reloc will tell us which function is
9124      actually being called.  */
9125
9126   bfd_vma laddr;
9127   uint32_t insn;
9128   Elf_Internal_Rela *i1_irelfn, *cond_irelfn, *irelend;
9129   int pic_ext_target = 0;
9130   bfd_signed_vma foff;
9131
9132   irelend = internal_relocs + sec->reloc_count;
9133   laddr = irel->r_offset;
9134   i1_irelfn =
9135     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9136                                  R_NDS32_25_PCREL_RELA, laddr + 4);
9137
9138   if (i1_irelfn == irelend)
9139     {
9140       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL2",
9141                           (long) irel->r_offset);
9142       return FALSE;
9143     }
9144
9145   insn = bfd_getb32 (contents + laddr);
9146
9147   /* Get the value of the symbol referred to by the reloc.  */
9148   foff = calculate_offset (abfd, sec, i1_irelfn, isymbuf, symtab_hdr,
9149                            &pic_ext_target);
9150
9151   if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1
9152       || foff >= CONSERVATIVE_16BIT_S1)
9153     return FALSE;
9154
9155   /* Relax to   bgezal   rt, label ; 17_PCREL
9156      or         bltzal   rt, label ; 17_PCREL */
9157
9158   /* Convert to complimentary conditional call.  */
9159   insn = CONVERT_CONDITION_CALL (insn);
9160
9161   /* For simplicity of coding, we are going to modify the section
9162      contents, the section relocs, and the BFD symbol table.  We
9163      must tell the rest of the code not to free up this
9164      information.  It would be possible to instead create a table
9165      of changes which have to be made, as is done in coff-mips.c;
9166      that would be more work, but would require less memory when
9167      the linker is run.  */
9168
9169   /* Clean unnessary relocations.  */
9170   i1_irelfn->r_info =
9171     ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info), R_NDS32_NONE);
9172   cond_irelfn =
9173     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9174                                  R_NDS32_17_PCREL_RELA, laddr);
9175   if (cond_irelfn != irelend)
9176     cond_irelfn->r_info =
9177       ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info), R_NDS32_NONE);
9178
9179   /* Replace the long call with a bgezal.  */
9180   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info),
9181                                R_NDS32_17_PCREL_RELA);
9182   irel->r_addend = i1_irelfn->r_addend;
9183
9184   bfd_putb32 (insn, contents + irel->r_offset);
9185
9186   *insn_len = 4;
9187   return TRUE;
9188 }
9189
9190 /* Relax LONGCALL3 relocation for nds32_elf_relax_section.  */
9191
9192 static bfd_boolean
9193 nds32_elf_relax_longcall3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9194                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9195                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9196                            Elf_Internal_Shdr *symtab_hdr)
9197 {
9198   /* There are 3 variations for LONGCALL3
9199      case 4-4-4-2; 16-bit on, optimize off or optimize for space
9200      bltz  rt,   $1                ; LONGCALL3
9201      sethi ta,   hi20(symbol)      ; HI20
9202      ori   ta, ta,  lo12(symbol)   ; LO12S0
9203      jral5 ta                      ;
9204      $1
9205
9206      case 4-4-4-4; 16-bit off, optimize don't care
9207      bltz  rt,   $1                ; LONGCALL3
9208      sethi ta,   hi20(symbol)      ; HI20
9209      ori   ta, ta,  lo12(symbol)   ; LO12S0
9210      jral  ta                      ;
9211      $1
9212
9213      case 4-4-4-4; 16-bit on, optimize for speed
9214      bltz  rt,   $1                ; LONGCALL3
9215      sethi ta,   hi20(symbol)      ; HI20
9216      ori   ta, ta,  lo12(symbol)   ; LO12S0
9217      jral  ta                      ;
9218      $1 */
9219
9220   /* Get the reloc for the address from which the register is
9221      being loaded.  This reloc will tell us which function is
9222      actually being called.  */
9223
9224   bfd_vma laddr;
9225   int seq_len;  /* Original length of instruction sequence.  */
9226   uint32_t insn;
9227   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
9228   int pic_ext_target = 0;
9229   bfd_signed_vma foff;
9230   uint16_t insn16;
9231
9232   irelend = internal_relocs + sec->reloc_count;
9233   seq_len = GET_SEQ_LEN (irel->r_addend);
9234   laddr = irel->r_offset;
9235   *insn_len = seq_len;
9236
9237   hi_irelfn =
9238     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9239                                  R_NDS32_HI20_RELA, laddr + 4);
9240   lo_irelfn =
9241     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9242                                  R_NDS32_LO12S0_ORI_RELA, laddr + 8);
9243
9244   if (hi_irelfn == irelend || lo_irelfn == irelend)
9245     {
9246       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL3",
9247                           (long) irel->r_offset);
9248       return FALSE;
9249     }
9250
9251   /* Get the value of the symbol referred to by the reloc.  */
9252   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9253                            &pic_ext_target);
9254
9255   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9256       || foff >= CONSERVATIVE_24BIT_S1)
9257     return FALSE;
9258
9259   insn = bfd_getb32 (contents + laddr);
9260   if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
9261     {
9262       /* Relax to  bgezal   rt, label ; 17_PCREL
9263          or        bltzal   rt, label ; 17_PCREL */
9264
9265       /* Convert to complimentary conditional call.  */
9266       insn = CONVERT_CONDITION_CALL (insn);
9267       bfd_putb32 (insn, contents + irel->r_offset);
9268
9269       *insn_len = 4;
9270       irel->r_info =
9271         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9272       hi_irelfn->r_info =
9273         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9274       lo_irelfn->r_info =
9275         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9276
9277       cond_irelfn =
9278         find_relocs_at_address_addr (irel, internal_relocs, irelend,
9279                                      R_NDS32_17_PCREL_RELA, laddr);
9280       if (cond_irelfn != irelend)
9281         {
9282           cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9283                                               R_NDS32_17_PCREL_RELA);
9284           cond_irelfn->r_addend = hi_irelfn->r_addend;
9285         }
9286
9287       if (seq_len & 0x2)
9288         {
9289           insn16 = NDS32_NOP16;
9290           bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9291           hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9292                                             R_NDS32_INSN16);
9293           hi_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9294           insn_len += 2;
9295         }
9296     }
9297   else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
9298     {
9299       /* Relax to the following instruction sequence
9300          bltz  rt,   $1 ; LONGCALL2
9301          jal   symbol   ; 25_PCREL
9302          $1     */
9303       *insn_len = 8;
9304       insn = INSN_JAL;
9305       bfd_putb32 (insn, contents + hi_irelfn->r_offset);
9306
9307       hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9308                                         R_NDS32_25_PCREL_RELA);
9309       irel->r_info =
9310         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL2);
9311
9312       lo_irelfn->r_info =
9313         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9314
9315       if (seq_len & 0x2)
9316         {
9317           insn16 = NDS32_NOP16;
9318           bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9319           lo_irelfn->r_info =
9320             ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
9321           lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9322           insn_len += 2;
9323         }
9324     }
9325   return TRUE;
9326 }
9327
9328 /* Relax LONGJUMP1 relocation for nds32_elf_relax_section.  */
9329
9330 static bfd_boolean
9331 nds32_elf_relax_longjump1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9332                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9333                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9334                            Elf_Internal_Shdr *symtab_hdr)
9335 {
9336   /* There are 3 variations for LONGJUMP1
9337      case 4-4-2; 16-bit bit on, optimize off or optimize for space
9338      sethi ta, hi20(symbol)      ; LONGJUMP1/HI20
9339      ori   ta, ta, lo12(symbol)  ; LO12S0
9340      jr5   ta                    ;
9341
9342      case 4-4-4; 16-bit off, optimize don't care
9343      sethi ta, hi20(symbol)      ; LONGJUMP1/HI20
9344      ori   ta, ta, lo12(symbol)  ; LO12S0
9345      jr    ta                    ;
9346
9347      case 4-4-4; 16-bit on, optimize for speed
9348      sethi ta, hi20(symbol)      ; LONGJUMP1/HI20
9349      ori   ta, ta, lo12(symbol)  ; LO12S0
9350      jr    ta                    ;      */
9351
9352   /* Get the reloc for the address from which the register is
9353      being loaded.  This reloc will tell us which function is
9354      actually being called.  */
9355
9356   bfd_vma laddr;
9357   int seq_len;  /* Original length of instruction sequence.  */
9358   int insn16_on;        /* 16-bit on/off.  */
9359   uint32_t insn;
9360   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
9361   int pic_ext_target = 0;
9362   bfd_signed_vma foff;
9363   uint16_t insn16;
9364   unsigned long reloc;
9365
9366   irelend = internal_relocs + sec->reloc_count;
9367   seq_len = GET_SEQ_LEN (irel->r_addend);
9368   laddr = irel->r_offset;
9369   *insn_len = seq_len;
9370   insn16_on = IS_16BIT_ON (irel->r_addend);
9371
9372   hi_irelfn =
9373     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9374                                  R_NDS32_HI20_RELA, laddr);
9375   lo_irelfn =
9376     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9377                                  R_NDS32_LO12S0_ORI_RELA, laddr + 4);
9378   if (hi_irelfn == irelend || lo_irelfn == irelend)
9379     {
9380       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP1",
9381                           (long) irel->r_offset);
9382       return FALSE;
9383     }
9384
9385   /* Get the value of the symbol referred to by the reloc.  */
9386   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9387                            &pic_ext_target);
9388
9389   if (pic_ext_target || foff == 0 || foff >= CONSERVATIVE_24BIT_S1
9390       || foff < -CONSERVATIVE_24BIT_S1)
9391     return FALSE;
9392
9393   if (insn16_on && foff >= -ACCURATE_8BIT_S1
9394       && foff < ACCURATE_8BIT_S1 && (seq_len & 0x2))
9395     {
9396       /* j8     label */
9397       /* 16-bit on, but not optimized for speed.  */
9398       reloc = R_NDS32_9_PCREL_RELA;
9399       insn16 = INSN_J8;
9400       bfd_putb16 (insn16, contents + irel->r_offset);
9401       *insn_len = 2;
9402       irel->r_info =
9403         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
9404     }
9405   else
9406     {
9407       /* j     label */
9408       reloc = R_NDS32_25_PCREL_RELA;
9409       insn = INSN_J;
9410       bfd_putb32 (insn, contents + irel->r_offset);
9411       *insn_len = 4;
9412       irel->r_info =
9413         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_INSN16);
9414       irel->r_addend = 0;
9415     }
9416
9417   hi_irelfn->r_info =
9418     ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
9419   lo_irelfn->r_info =
9420     ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9421
9422   if ((seq_len & 0x2) && ((*insn_len & 2) == 0))
9423     {
9424       insn16 = NDS32_NOP16;
9425       bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9426       lo_irelfn->r_info =
9427         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
9428                       R_NDS32_INSN16);
9429       lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9430       *insn_len += 2;
9431     }
9432   return TRUE;
9433 }
9434
9435 /* Revert condition branch.  This function does not check if the input
9436    instruction is condition branch or not.  */
9437
9438 static void
9439 nds32_elf_convert_branch (uint16_t insn16, uint32_t insn,
9440                            uint16_t *re_insn16, uint32_t *re_insn)
9441 {
9442   uint32_t comp_insn = 0;
9443   uint16_t comp_insn16 = 0;
9444
9445   if (insn)
9446     {
9447       if (N32_OP6 (insn) == N32_OP6_BR1)
9448         {
9449           /* beqs label.  */
9450           comp_insn = (insn ^ 0x4000) & 0xffffc000;
9451           if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5)
9452             {
9453               /* Insn can be contracted to 16-bit implied r5.  */
9454               comp_insn16 =
9455                 (comp_insn & 0x4000) ? INSN_BNES38 : INSN_BEQS38;
9456               comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
9457             }
9458         }
9459       else if (N32_OP6 (insn) == N32_OP6_BR3)
9460         {
9461           /* bnec $ta, imm11, label.  */
9462           comp_insn = (insn ^ 0x80000) & 0xffffff00;
9463         }
9464       else
9465         {
9466           comp_insn = (insn ^ 0x10000) & 0xffffc000;
9467           if (N32_BR2_SUB (insn) == N32_BR2_BEQZ
9468               || N32_BR2_SUB (insn) == N32_BR2_BNEZ)
9469             {
9470               if (N32_IS_RT3 (insn))
9471                 {
9472                   /* Insn can be contracted to 16-bit.  */
9473                   comp_insn16 =
9474                     (comp_insn & 0x10000) ? INSN_BNEZ38 : INSN_BEQZ38;
9475                   comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
9476                 }
9477               else if (N32_RT5 (insn) == REG_R15)
9478                 {
9479                   /* Insn can be contracted to 16-bit.  */
9480                   comp_insn16 =
9481                     (comp_insn & 0x10000) ? INSN_BNES38 : INSN_BEQS38;
9482                 }
9483             }
9484         }
9485     }
9486   else
9487     {
9488       switch ((insn16 & 0xf000) >> 12)
9489         {
9490         case 0xc:
9491           /* beqz38 or bnez38 */
9492           comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
9493           comp_insn = (comp_insn16 & 0x0800) ? INSN_BNEZ : INSN_BEQZ;
9494           comp_insn |= ((comp_insn16 & 0x0700) >> 8) << 20;
9495           break;
9496
9497         case 0xd:
9498           /* beqs38 or bnes38 */
9499           comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
9500           comp_insn = (comp_insn16 & 0x0800) ? INSN_BNE : INSN_BEQ;
9501           comp_insn |= (((comp_insn16 & 0x0700) >> 8) << 20)
9502             | (REG_R5 << 15);
9503           break;
9504
9505         case 0xe:
9506           /* beqzS8 or bnezS8 */
9507           comp_insn16 = (insn16 ^ 0x0100) & 0xff00;
9508           comp_insn = (comp_insn16 & 0x0100) ? INSN_BNEZ : INSN_BEQZ;
9509           comp_insn |= REG_R15 << 20;
9510           break;
9511
9512         default:
9513           break;
9514         }
9515     }
9516   if (comp_insn && re_insn)
9517     *re_insn = comp_insn;
9518   if (comp_insn16 && re_insn16)
9519     *re_insn16 = comp_insn16;
9520 }
9521
9522 /* Relax LONGJUMP2 relocation for nds32_elf_relax_section.  */
9523
9524 static bfd_boolean
9525 nds32_elf_relax_longjump2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9526                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9527                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9528                            Elf_Internal_Shdr *symtab_hdr)
9529 {
9530   /* There are 3 variations for LONGJUMP2
9531      case 2-4;  1st insn convertible, 16-bit on,
9532      optimize off or optimize for space
9533      bnes38  rt, ra, $1 ; LONGJUMP2
9534      j       label      ; 25_PCREL
9535      $1:
9536
9537      case 4-4; 1st insn not convertible
9538      bne  rt, ra, $1 ; LONGJUMP2
9539      j    label      ; 25_PCREL
9540      $1:
9541
9542      case 4-4; 1st insn convertible, 16-bit on, optimize for speed
9543      bne  rt, ra, $1 ; LONGJUMP2
9544      j    label      ; 25_PCREL
9545      $1: */
9546
9547   /* Get the reloc for the address from which the register is
9548      being loaded.  This reloc will tell us which function is
9549      actually being called.  */
9550
9551   bfd_vma laddr;
9552   int seq_len;  /* Original length of instruction sequence.  */
9553   Elf_Internal_Rela *i2_irelfn, *cond_irelfn, *irelend;
9554   int pic_ext_target = 0, first_size;
9555   unsigned int i;
9556   bfd_signed_vma foff;
9557   uint32_t insn, re_insn = 0;
9558   uint16_t insn16, re_insn16 = 0;
9559   unsigned long reloc, cond_reloc;
9560
9561   enum elf_nds32_reloc_type checked_types[] =
9562     { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
9563
9564   irelend = internal_relocs + sec->reloc_count;
9565   seq_len = GET_SEQ_LEN (irel->r_addend);
9566   laddr = irel->r_offset;
9567   *insn_len = seq_len;
9568   first_size = (seq_len == 6) ? 2 : 4;
9569
9570   i2_irelfn =
9571     find_relocs_at_address_addr (irel, internal_relocs,
9572                                  irelend, R_NDS32_25_PCREL_RELA,
9573                                  laddr + first_size);
9574
9575   for (i = 0; i < sizeof (checked_types) / sizeof(checked_types[0]); i++)
9576     {
9577       cond_irelfn =
9578         find_relocs_at_address_addr (irel, internal_relocs, irelend,
9579                                      checked_types[i], laddr);
9580       if (cond_irelfn != irelend)
9581         break;
9582     }
9583
9584   if (i2_irelfn == irelend || cond_irelfn == irelend)
9585     {
9586       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP2",
9587                           (long) irel->r_offset);
9588       return FALSE;
9589     }
9590
9591   /* Get the value of the symbol referred to by the reloc.  */
9592   foff =
9593     calculate_offset (abfd, sec, i2_irelfn, isymbuf, symtab_hdr,
9594                       &pic_ext_target);
9595   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_16BIT_S1
9596       || foff >= CONSERVATIVE_16BIT_S1)
9597     return FALSE;
9598
9599   /* Get the all corresponding instructions.  */
9600   if (first_size == 4)
9601     {
9602       insn = bfd_getb32 (contents + laddr);
9603       nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
9604     }
9605   else
9606     {
9607       insn16 = bfd_getb16 (contents + laddr);
9608       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
9609     }
9610
9611   if (re_insn16 && foff >= -(ACCURATE_8BIT_S1 - first_size)
9612       && foff < ACCURATE_8BIT_S1 - first_size)
9613     {
9614       if (first_size == 4)
9615         {
9616           /* Don't convert it to 16-bit now, keep this as relaxable for
9617              ``label reloc; INSN16''.  */
9618
9619           /* Save comp_insn32 to buffer.  */
9620           bfd_putb32 (re_insn, contents + irel->r_offset);
9621           *insn_len = 4;
9622           reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
9623             R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
9624           cond_reloc = R_NDS32_INSN16;
9625         }
9626       else
9627         {
9628           bfd_putb16 (re_insn16, contents + irel->r_offset);
9629           *insn_len = 2;
9630           reloc = R_NDS32_9_PCREL_RELA;
9631           cond_reloc = R_NDS32_NONE;
9632         }
9633     }
9634   else if (N32_OP6 (re_insn) == N32_OP6_BR1
9635            && (foff >= -(ACCURATE_14BIT_S1 - first_size)
9636                && foff < ACCURATE_14BIT_S1 - first_size))
9637     {
9638       /* beqs     label    ; 15_PCREL */
9639       bfd_putb32 (re_insn, contents + irel->r_offset);
9640       *insn_len = 4;
9641       reloc = R_NDS32_15_PCREL_RELA;
9642       cond_reloc = R_NDS32_NONE;
9643     }
9644   else if (N32_OP6 (re_insn) == N32_OP6_BR2
9645            && foff >= -CONSERVATIVE_16BIT_S1
9646            && foff < CONSERVATIVE_16BIT_S1)
9647     {
9648       /* beqz     label ; 17_PCREL */
9649       bfd_putb32 (re_insn, contents + irel->r_offset);
9650       *insn_len = 4;
9651       reloc = R_NDS32_17_PCREL_RELA;
9652       cond_reloc = R_NDS32_NONE;
9653     }
9654   else
9655     return FALSE;
9656
9657   /* Set all relocations.  */
9658   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info), reloc);
9659   irel->r_addend = i2_irelfn->r_addend;
9660
9661   cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
9662                                       cond_reloc);
9663   cond_irelfn->r_addend = 0;
9664
9665   if ((seq_len ^ *insn_len ) & 0x2)
9666     {
9667       insn16 = NDS32_NOP16;
9668       bfd_putb16 (insn16, contents + irel->r_offset + 4);
9669       i2_irelfn->r_offset = 4;
9670       i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
9671                                         R_NDS32_INSN16);
9672       i2_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9673       *insn_len += 2;
9674     }
9675   else
9676     i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
9677                                       R_NDS32_NONE);
9678   return TRUE;
9679 }
9680
9681 /* Relax LONGJUMP3 relocation for nds32_elf_relax_section.  */
9682
9683 static bfd_boolean
9684 nds32_elf_relax_longjump3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9685                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9686                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9687                            Elf_Internal_Shdr *symtab_hdr)
9688 {
9689   /* There are 5 variations for LONGJUMP3
9690      case 1: 2-4-4-2; 1st insn convertible, 16-bit on,
9691      optimize off or optimize for space
9692      bnes38   rt, ra, $1            ; LONGJUMP3
9693      sethi    ta, hi20(symbol)      ; HI20
9694      ori      ta, ta, lo12(symbol)  ; LO12S0
9695      jr5      ta                    ;
9696      $1:                            ;
9697
9698      case 2: 2-4-4-2; 1st insn convertible, 16-bit on, optimize for speed
9699      bnes38   rt, ra, $1           ; LONGJUMP3
9700      sethi    ta, hi20(symbol)     ; HI20
9701      ori      ta, ta, lo12(symbol) ; LO12S0
9702      jr5      ta                   ;
9703      $1:                           ; LABEL
9704
9705      case 3: 4-4-4-2; 1st insn not convertible, 16-bit on,
9706      optimize off or optimize for space
9707      bne   rt, ra, $1           ; LONGJUMP3
9708      sethi ta, hi20(symbol)     ; HI20
9709      ori   ta, ta, lo12(symbol) ; LO12S0
9710      jr5   ta                   ;
9711      $1:                        ;
9712
9713      case 4: 4-4-4-4; 1st insn don't care, 16-bit off, optimize don't care
9714      16-bit off if no INSN16
9715      bne   rt, ra, $1           ; LONGJUMP3
9716      sethi ta, hi20(symbol)     ; HI20
9717      ori   ta, ta, lo12(symbol) ; LO12S0
9718      jr    ta                   ;
9719      $1:                        ;
9720
9721      case 5: 4-4-4-4; 1st insn not convertible, 16-bit on, optimize for speed
9722      16-bit off if no INSN16
9723      bne   rt, ra, $1           ; LONGJUMP3
9724      sethi ta, hi20(symbol)     ; HI20
9725      ori   ta, ta, lo12(symbol) ; LO12S0
9726      jr    ta                   ;
9727      $1:                        ; LABEL */
9728
9729   /* Get the reloc for the address from which the register is
9730      being loaded.  This reloc will tell us which function is
9731      actually being called.  */
9732   enum elf_nds32_reloc_type checked_types[] =
9733     { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
9734
9735   int reloc_off = 0, cond_removed = 0, convertible;
9736   bfd_vma laddr;
9737   int seq_len;  /* Original length of instruction sequence.  */
9738   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
9739   int pic_ext_target = 0, first_size;
9740   unsigned int i;
9741   bfd_signed_vma foff;
9742   uint32_t insn, re_insn = 0;
9743   uint16_t insn16, re_insn16 = 0;
9744   unsigned long reloc, cond_reloc;
9745
9746   irelend = internal_relocs + sec->reloc_count;
9747   seq_len = GET_SEQ_LEN (irel->r_addend);
9748   laddr = irel->r_offset;
9749   *insn_len = seq_len;
9750
9751   convertible = IS_1ST_CONVERT (irel->r_addend);
9752
9753   if (convertible)
9754     first_size = 2;
9755   else
9756     first_size = 4;
9757
9758   /* Get all needed relocations.  */
9759   hi_irelfn =
9760     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9761                                  R_NDS32_HI20_RELA, laddr + first_size);
9762   lo_irelfn =
9763     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9764                                  R_NDS32_LO12S0_ORI_RELA,
9765                                  laddr + first_size + 4);
9766
9767   for (i = 0; i < sizeof (checked_types) / sizeof (checked_types[0]); i++)
9768     {
9769       cond_irelfn =
9770         find_relocs_at_address_addr (irel, internal_relocs, irelend,
9771                                      checked_types[i], laddr);
9772       if (cond_irelfn != irelend)
9773         break;
9774     }
9775
9776   if (hi_irelfn == irelend || lo_irelfn == irelend || cond_irelfn == irelend)
9777     {
9778       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP3",
9779                           (long) irel->r_offset);
9780       return FALSE;
9781     }
9782
9783   /* Get the value of the symbol referred to by the reloc.  */
9784   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9785                            &pic_ext_target);
9786
9787   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9788       || foff >= CONSERVATIVE_24BIT_S1)
9789     return FALSE;
9790
9791   /* Get the all corresponding instructions.  */
9792   if (first_size == 4)
9793     {
9794       insn = bfd_getb32 (contents + laddr);
9795       nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
9796     }
9797   else
9798     {
9799       insn16 = bfd_getb16 (contents + laddr);
9800       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
9801     }
9802
9803   /* For simplicity of coding, we are going to modify the section
9804      contents, the section relocs, and the BFD symbol table.  We
9805      must tell the rest of the code not to free up this
9806      information.  It would be possible to instead create a table
9807      of changes which have to be made, as is done in coff-mips.c;
9808      that would be more work, but would require less memory when
9809      the linker is run.  */
9810
9811   if (re_insn16 && foff >= -ACCURATE_8BIT_S1 - first_size
9812       && foff < ACCURATE_8BIT_S1 - first_size)
9813     {
9814       if (!(seq_len & 0x2))
9815         {
9816           /* Don't convert it to 16-bit now, keep this as relaxable
9817              for ``label reloc; INSN1a''6.  */
9818           /* Save comp_insn32 to buffer.  */
9819           bfd_putb32 (re_insn, contents + irel->r_offset);
9820           *insn_len = 4;
9821           reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
9822             R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
9823           cond_reloc = R_NDS32_INSN16;
9824         }
9825       else
9826         {
9827           /* Not optimize for speed; convert sequence to 16-bit.  */
9828           /* Save comp_insn16 to buffer.  */
9829           bfd_putb16 (re_insn16, contents + irel->r_offset);
9830           *insn_len = 2;
9831           reloc = R_NDS32_9_PCREL_RELA;
9832           cond_reloc = R_NDS32_NONE;
9833         }
9834       cond_removed = 1;
9835     }
9836   else if (N32_OP6 (re_insn) == N32_OP6_BR1
9837            && (foff >= -(ACCURATE_14BIT_S1 - first_size)
9838                && foff < ACCURATE_14BIT_S1 - first_size))
9839     {
9840       /* beqs     label    ; 15_PCREL */
9841       bfd_putb32 (re_insn, contents + irel->r_offset);
9842       *insn_len = 4;
9843       reloc = R_NDS32_15_PCREL_RELA;
9844       cond_reloc = R_NDS32_NONE;
9845       cond_removed = 1;
9846     }
9847   else if (N32_OP6 (re_insn) == N32_OP6_BR2
9848            && foff >= -CONSERVATIVE_16BIT_S1
9849            && foff < CONSERVATIVE_16BIT_S1)
9850     {
9851       /* beqz     label ; 17_PCREL */
9852       bfd_putb32 (re_insn, contents + irel->r_offset);
9853       *insn_len = 4;
9854       reloc = R_NDS32_17_PCREL_RELA;
9855       cond_reloc = R_NDS32_NONE;
9856       cond_removed = 1;
9857     }
9858   else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
9859            && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
9860     {
9861       /* Relax to one of the following 3 variations
9862
9863          case 2-4; 1st insn convertible, 16-bit on, optimize off or optimize
9864          for space
9865          bnes38  rt, $1 ; LONGJUMP2
9866          j       label  ; 25_PCREL
9867          $1
9868
9869          case 4-4; 1st insn not convertible, others don't care
9870          bne   rt, ra, $1 ; LONGJUMP2
9871          j     label      ; 25_PCREL
9872          $1
9873
9874          case 4-4; 1st insn convertible, 16-bit on, optimize for speed
9875          bne   rt, ra, $1 ; LONGJUMP2
9876          j     label      ; 25_PCREL
9877          $1 */
9878
9879       /* Offset for first instruction.  */
9880
9881       /* Use j label as second instruction.  */
9882       *insn_len = 4 + first_size;
9883       insn = INSN_J;
9884       bfd_putb32 (insn, contents + hi_irelfn->r_offset);
9885       reloc = R_NDS32_LONGJUMP2;
9886       cond_reloc = R_NDS32_25_PLTREL;
9887     }
9888     else
9889       return FALSE;
9890
9891     if (cond_removed == 1)
9892       {
9893         /* Set all relocations.  */
9894         irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
9895         irel->r_addend = hi_irelfn->r_addend;
9896
9897         cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
9898                                             cond_reloc);
9899         cond_irelfn->r_addend = 0;
9900         hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9901                                           R_NDS32_NONE);
9902       }
9903     else
9904       {
9905         irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
9906         irel->r_addend = irel->r_addend;
9907         hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9908                                           cond_reloc);
9909       }
9910
9911   if ((seq_len ^ *insn_len ) & 0x2)
9912     {
9913       insn16 = NDS32_NOP16;
9914       bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9915       lo_irelfn->r_offset = *insn_len;
9916       lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
9917                                         R_NDS32_INSN16);
9918       lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9919       *insn_len += 2;
9920     }
9921   else
9922     lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
9923                                       R_NDS32_NONE);
9924   return TRUE;
9925 }
9926
9927 /* Relax LONGCALL4 relocation for nds32_elf_relax_section.  */
9928
9929 static bfd_boolean
9930 nds32_elf_relax_longcall4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9931                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9932                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9933                            Elf_Internal_Shdr *symtab_hdr)
9934 {
9935   /* The pattern for LONGCALL4.  Support for function cse.
9936      sethi ta, hi20(symbol)     ; LONGCALL4/HI20
9937      ori   ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
9938      jral  ta                   ; PTR_RES/EMPTY/INSN16  */
9939
9940   bfd_vma laddr;
9941   uint32_t insn;
9942   Elf_Internal_Rela *hi_irel, *ptr_irel, *insn_irel, *em_irel, *call_irel;
9943   Elf_Internal_Rela *irelend;
9944   int pic_ext_target = 0;
9945   bfd_signed_vma foff;
9946
9947   irelend = internal_relocs + sec->reloc_count;
9948   laddr = irel->r_offset;
9949
9950   /* Get the reloc for the address from which the register is
9951      being loaded.  This reloc will tell us which function is
9952      actually being called.  */
9953   hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9954                                          R_NDS32_HI20_RELA, laddr);
9955
9956   if (hi_irel == irelend)
9957     {
9958       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL4",
9959                           (long) irel->r_offset);
9960       return FALSE;
9961     }
9962
9963   /* Get the value of the symbol referred to by the reloc.  */
9964   foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr,
9965                            &pic_ext_target);
9966
9967   /* This condition only happened when symbol is undefined.  */
9968   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9969       || foff >= CONSERVATIVE_24BIT_S1)
9970     return FALSE;
9971
9972   /* Relax to: jal symbol; 25_PCREL */
9973   /* For simplicity of coding, we are going to modify the section
9974      contents, the section relocs, and the BFD symbol table.  We
9975      must tell the rest of the code not to free up this
9976      information.  It would be possible to instead create a table
9977      of changes which have to be made, as is done in coff-mips.c;
9978      that would be more work, but would require less memory when
9979      the linker is run.  */
9980
9981   ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9982                                           R_NDS32_PTR_RESOLVED, irel->r_addend);
9983   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9984                                           R_NDS32_EMPTY, irel->r_addend);
9985
9986   if (ptr_irel == irelend || em_irel == irelend)
9987     {
9988       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL4",
9989                           (long) irel->r_offset);
9990       return FALSE;
9991     }
9992   /* Check these is enough space to insert jal in R_NDS32_EMPTY.  */
9993   insn = bfd_getb32 (contents + irel->r_addend);
9994   if (insn & 0x80000000)
9995     return FALSE;
9996
9997   /* Replace the long call with a jal.  */
9998   em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
9999                                   R_NDS32_25_PCREL_RELA);
10000   ptr_irel->r_addend = 1;
10001
10002   /* We don't resolve this here but resolve it in relocate_section.  */
10003   insn = INSN_JAL;
10004   bfd_putb32 (insn, contents + em_irel->r_offset);
10005
10006   irel->r_info =
10007     ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10008
10009   /* If there is function cse, HI20 can not remove now.  */
10010   call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10011                                            R_NDS32_LONGCALL4, laddr);
10012   if (call_irel == irelend)
10013     {
10014       *insn_len = 0;
10015       hi_irel->r_info =
10016         ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
10017     }
10018
10019   insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10020                                           R_NDS32_INSN16, irel->r_addend);
10021   if (insn_irel != irelend)
10022     insn_irel->r_info =
10023       ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10024
10025   return TRUE;
10026 }
10027
10028 /* Relax LONGCALL5 relocation for nds32_elf_relax_section.  */
10029
10030 static bfd_boolean
10031 nds32_elf_relax_longcall5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10032                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10033                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10034                            Elf_Internal_Shdr *symtab_hdr)
10035 {
10036   /* The pattern for LONGCALL5.
10037      bltz  rt, .L1      ; LONGCALL5/17_PCREL
10038      jal   symbol       ; 25_PCREL
10039      .L1:  */
10040
10041   bfd_vma laddr;
10042   uint32_t insn;
10043   Elf_Internal_Rela *cond_irel, *irelend;
10044   int pic_ext_target = 0;
10045   bfd_signed_vma foff;
10046
10047   irelend = internal_relocs + sec->reloc_count;
10048   laddr = irel->r_offset;
10049   insn = bfd_getb32 (contents + laddr);
10050
10051   /* Get the reloc for the address from which the register is
10052      being loaded.  This reloc will tell us which function is
10053      actually being called.  */
10054   cond_irel =
10055     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10056                                  R_NDS32_25_PCREL_RELA, irel->r_addend);
10057   if (cond_irel == irelend)
10058     {
10059       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL5",
10060                           (long) irel->r_offset);
10061       return FALSE;
10062     }
10063
10064   /* Get the value of the symbol referred to by the reloc.  */
10065   foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr,
10066                            &pic_ext_target);
10067
10068   if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1
10069       || foff >= CONSERVATIVE_16BIT_S1)
10070     return FALSE;
10071
10072   /* Relax to   bgezal   rt, label ; 17_PCREL
10073      or         bltzal   rt, label ; 17_PCREL */
10074
10075   /* Convert to complimentary conditional call.  */
10076   insn = CONVERT_CONDITION_CALL (insn);
10077
10078   /* For simplicity of coding, we are going to modify the section
10079      contents, the section relocs, and the BFD symbol table.  We
10080      must tell the rest of the code not to free up this
10081      information.  It would be possible to instead create a table
10082      of changes which have to be made, as is done in coff-mips.c;
10083      that would be more work, but would require less memory when
10084      the linker is run.  */
10085
10086   /* Modify relocation and contents.  */
10087   cond_irel->r_info =
10088     ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_17_PCREL_RELA);
10089
10090   /* Replace the long call with a bgezal.  */
10091   bfd_putb32 (insn, contents + cond_irel->r_offset);
10092   *insn_len = 0;
10093
10094   /* Clean unnessary relocations.  */
10095   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10096
10097   cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10098                                            R_NDS32_17_PCREL_RELA, laddr);
10099   cond_irel->r_info =
10100     ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10101
10102   return TRUE;
10103 }
10104
10105 /* Relax LONGCALL6 relocation for nds32_elf_relax_section.  */
10106
10107 static bfd_boolean
10108 nds32_elf_relax_longcall6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10109                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10110                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10111                            Elf_Internal_Shdr *symtab_hdr)
10112 {
10113   /* The pattern for LONGCALL6.
10114      bltz  rt,   .L1                    ; LONGCALL6/17_PCREL
10115      sethi ta,   hi20(symbol)           ; HI20/PTR
10116      ori   ta, ta,  lo12(symbol)        ; LO12S0_ORI/PTR
10117      jral  ta                           ; PTR_RES/EMPTY/INSN16
10118      .L1  */
10119
10120   bfd_vma laddr;
10121   uint32_t insn;
10122   Elf_Internal_Rela *em_irel, *cond_irel, *irelend;
10123   int pic_ext_target = 0;
10124   bfd_signed_vma foff;
10125
10126   irelend = internal_relocs + sec->reloc_count;
10127   laddr = irel->r_offset;
10128
10129   /* Get the reloc for the address from which the register is
10130      being loaded.  This reloc will tell us which function is
10131      actually being called.  */
10132   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10133                                          R_NDS32_EMPTY, irel->r_addend);
10134
10135   if (em_irel == irelend)
10136     {
10137       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL6",
10138                           (long) irel->r_offset);
10139       return FALSE;
10140     }
10141
10142   /* Get the value of the symbol referred to by the reloc.  */
10143   foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr,
10144                            &pic_ext_target);
10145
10146   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
10147       || foff >= CONSERVATIVE_24BIT_S1)
10148     return FALSE;
10149
10150   /* Check these is enough space to insert jal in R_NDS32_EMPTY.  */
10151   insn = bfd_getb32 (contents + irel->r_addend);
10152   if (insn & 0x80000000)
10153     return FALSE;
10154
10155   insn = bfd_getb32 (contents + laddr);
10156   if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
10157     {
10158       /* Relax to  bgezal   rt, label ; 17_PCREL
10159          or        bltzal   rt, label ; 17_PCREL */
10160
10161       /* Convert to complimentary conditional call.  */
10162       *insn_len = 0;
10163       insn = CONVERT_CONDITION_CALL (insn);
10164       bfd_putb32 (insn, contents + em_irel->r_offset);
10165
10166       em_irel->r_info =
10167         ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_17_PCREL_RELA);
10168
10169       /* Set resolved relocation.  */
10170       cond_irel =
10171         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10172                                      R_NDS32_PTR_RESOLVED, irel->r_addend);
10173       if (cond_irel == irelend)
10174         {
10175           _bfd_error_handler (unrecognized_reloc_msg, abfd,
10176                               "R_NDS32_LONGCALL6", (long) irel->r_offset);
10177           return FALSE;
10178         }
10179       cond_irel->r_addend = 1;
10180
10181       /* Clear relocations.  */
10182
10183       irel->r_info =
10184         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10185
10186       cond_irel =
10187         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10188                                      R_NDS32_17_PCREL_RELA, laddr);
10189       if (cond_irel != irelend)
10190         cond_irel->r_info =
10191           ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10192
10193       cond_irel =
10194         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10195                                      R_NDS32_INSN16, irel->r_addend);
10196       if (cond_irel != irelend)
10197         cond_irel->r_info =
10198           ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10199
10200     }
10201   else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
10202     {
10203       /* Relax to the following instruction sequence
10204          bltz  rt, .L1  ; LONGCALL2/17_PCREL
10205          jal   symbol   ; 25_PCREL/PTR_RES
10206          .L1  */
10207       *insn_len = 4;
10208       /* Convert instruction.  */
10209       insn = INSN_JAL;
10210       bfd_putb32 (insn, contents + em_irel->r_offset);
10211
10212       /* Convert relocations.  */
10213       em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
10214                                       R_NDS32_25_PCREL_RELA);
10215       irel->r_info =
10216         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL5);
10217
10218       /* Set resolved relocation.  */
10219       cond_irel =
10220         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10221                                      R_NDS32_PTR_RESOLVED, irel->r_addend);
10222       if (cond_irel == irelend)
10223         {
10224           _bfd_error_handler (unrecognized_reloc_msg, abfd,
10225                               "R_NDS32_LONGCALL6", (long) irel->r_offset);
10226           return FALSE;
10227         }
10228       cond_irel->r_addend = 1;
10229
10230       cond_irel =
10231         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10232                                      R_NDS32_INSN16, irel->r_addend);
10233       if (cond_irel != irelend)
10234         cond_irel->r_info =
10235           ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10236     }
10237   return TRUE;
10238 }
10239
10240 /* Relax LONGJUMP4 relocation for nds32_elf_relax_section.  */
10241
10242 static bfd_boolean
10243 nds32_elf_relax_longjump4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10244                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10245                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10246                            Elf_Internal_Shdr *symtab_hdr)
10247 {
10248   /* The pattern for LONGJUMP4.
10249      sethi ta, hi20(symbol)     ; LONGJUMP4/HI20
10250      ori   ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10251      jr    ta                   ; PTR_RES/INSN16/EMPTY  */
10252
10253   bfd_vma laddr;
10254   int seq_len;  /* Original length of instruction sequence.  */
10255   uint32_t insn;
10256   Elf_Internal_Rela *hi_irel, *ptr_irel, *em_irel, *call_irel, *irelend;
10257   int pic_ext_target = 0;
10258   bfd_signed_vma foff;
10259
10260   irelend = internal_relocs + sec->reloc_count;
10261   seq_len = GET_SEQ_LEN (irel->r_addend);
10262   laddr = irel->r_offset;
10263   *insn_len = seq_len;
10264
10265   /* Get the reloc for the address from which the register is
10266      being loaded.  This reloc will tell us which function is
10267      actually being called.  */
10268
10269   hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10270                                          R_NDS32_HI20_RELA, laddr);
10271
10272   if (hi_irel == irelend)
10273     {
10274       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP4",
10275                           (long) irel->r_offset);
10276       return FALSE;
10277     }
10278
10279   /* Get the value of the symbol referred to by the reloc.  */
10280   foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr,
10281                            &pic_ext_target);
10282
10283   if (pic_ext_target || foff == 0 || foff >= CONSERVATIVE_24BIT_S1
10284       || foff < -CONSERVATIVE_24BIT_S1)
10285     return FALSE;
10286
10287   /* Convert it to "j label", it may be converted to j8 in the final
10288      pass of relaxation.  Therefore, we do not consider this currently.  */
10289   ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10290                                           R_NDS32_PTR_RESOLVED, irel->r_addend);
10291   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10292                                          R_NDS32_EMPTY, irel->r_addend);
10293
10294   if (ptr_irel == irelend || em_irel == irelend)
10295     {
10296       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP4",
10297                           (long) irel->r_offset);
10298       return FALSE;
10299     }
10300
10301   em_irel->r_info =
10302     ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_25_PCREL_RELA);
10303   ptr_irel->r_addend = 1;
10304
10305   /* Write instruction.  */
10306   insn = INSN_J;
10307   bfd_putb32 (insn, contents + em_irel->r_offset);
10308
10309   /* Clear relocations.  */
10310   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10311
10312   /* If there is function cse, HI20 can not remove now.  */
10313   call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10314                                            R_NDS32_LONGJUMP4, laddr);
10315   if (call_irel == irelend)
10316     {
10317       *insn_len = 0;
10318       hi_irel->r_info =
10319         ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
10320     }
10321
10322   return TRUE;
10323 }
10324
10325 /* Relax LONGJUMP5 relocation for nds32_elf_relax_section.  */
10326
10327 static bfd_boolean
10328 nds32_elf_relax_longjump5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10329                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10330                            int *seq_len, bfd_byte *contents,
10331                            Elf_Internal_Sym *isymbuf,
10332                            Elf_Internal_Shdr *symtab_hdr)
10333 {
10334   /* There are 2 variations for LONGJUMP5
10335      case 2-4;  1st insn convertible, 16-bit on.
10336      bnes38  rt, ra, .L1        ; LONGJUMP5/9_PCREL/INSN16
10337      j       label              ; 25_PCREL/INSN16
10338      $1:
10339
10340      case 4-4; 1st insn not convertible
10341      bne  rt, ra, .L1   ; LONGJUMP5/15_PCREL/INSN16
10342      j    label         ; 25_PCREL/INSN16
10343      .L1:  */
10344
10345   bfd_vma laddr;
10346   Elf_Internal_Rela *cond_irel,  *irelend;
10347   int pic_ext_target = 0;
10348   unsigned int i;
10349   bfd_signed_vma foff;
10350   uint32_t insn, re_insn = 0;
10351   uint16_t insn16, re_insn16 = 0;
10352   unsigned long reloc;
10353
10354   enum elf_nds32_reloc_type checked_types[] =
10355     { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
10356       R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
10357
10358   irelend = internal_relocs + sec->reloc_count;
10359   laddr = irel->r_offset;
10360
10361   /* Get the reloc for the address from which the register is
10362      being loaded.  This reloc will tell us which function is
10363      actually being called.  */
10364
10365   cond_irel =
10366     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10367                                  R_NDS32_25_PCREL_RELA, irel->r_addend);
10368   if (cond_irel == irelend)
10369     {
10370       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP5",
10371                           (long) irel->r_offset);
10372       return FALSE;
10373     }
10374
10375   /* Get the value of the symbol referred to by the reloc.  */
10376   foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr,
10377                            &pic_ext_target);
10378
10379   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_16BIT_S1
10380       || foff >= CONSERVATIVE_16BIT_S1)
10381     return FALSE;
10382
10383   /* Get the all corresponding instructions.  */
10384   insn = bfd_getb32 (contents + laddr);
10385   /* Check instruction size.  */
10386   if (insn & 0x80000000)
10387     {
10388       *seq_len = 0;
10389       insn16 = insn >> 16;
10390       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
10391     }
10392   else
10393     nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
10394
10395   if (N32_OP6 (re_insn) == N32_OP6_BR1
10396       && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
10397     {
10398       /* beqs label ; 15_PCREL.  */
10399       bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10400       reloc = R_NDS32_15_PCREL_RELA;
10401     }
10402   else if (N32_OP6 (re_insn) == N32_OP6_BR2
10403            && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
10404     {
10405       /* beqz label ; 17_PCREL.  */
10406       bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10407       reloc = R_NDS32_17_PCREL_RELA;
10408     }
10409   else if ( N32_OP6 (re_insn) == N32_OP6_BR3
10410            && foff >= -CONSERVATIVE_8BIT_S1 && foff < CONSERVATIVE_8BIT_S1)
10411     {
10412       /* beqc label ; 9_PCREL.  */
10413       bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10414       reloc = R_NDS32_WORD_9_PCREL_RELA;
10415     }
10416   else
10417     return FALSE;
10418
10419   /* Set all relocations.  */
10420   cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), reloc);
10421
10422   /* Clean relocations.  */
10423   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10424   for (i = 0; i < sizeof (checked_types) / sizeof (checked_types[0]); i++)
10425     {
10426       cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10427                                                checked_types[i], laddr);
10428       if (cond_irel != irelend)
10429         {
10430           if (*seq_len == 0
10431               && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
10432             {
10433               /* If the branch instruction is 2 byte, it cannot remove
10434                  directly.  Only convert it to nop16 and remove it after
10435                  checking alignment issue.  */
10436               insn16 = NDS32_NOP16;
10437               bfd_putb16 (insn16, contents + laddr);
10438               cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10439             }
10440           else
10441             cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10442                                               R_NDS32_NONE);
10443         }
10444     }
10445   *insn_len = 0;
10446
10447   return TRUE;
10448 }
10449
10450 /* Relax LONGJUMP6 relocation for nds32_elf_relax_section.  */
10451
10452 static bfd_boolean
10453 nds32_elf_relax_longjump6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10454                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10455                            int *seq_len, bfd_byte *contents,
10456                            Elf_Internal_Sym *isymbuf,
10457                            Elf_Internal_Shdr *symtab_hdr)
10458 {
10459   /* There are 5 variations for LONGJUMP6
10460      case : 2-4-4-4; 1st insn convertible, 16-bit on.
10461      bnes38   rt, ra, .L1               ; LONGJUMP6/15_PCREL/INSN16
10462      sethi    ta, hi20(symbol)          ; HI20/PTR
10463      ori      ta, ta, lo12(symbol)      ; LO12S0_ORI/PTR
10464      jr       ta                        ; PTR_RES/INSN16/EMPTY
10465      .L1:
10466
10467      case : 4-4-4-4; 1st insn not convertible, 16-bit on.
10468      bne   rt, ra, .L1          ; LONGJUMP6/15_PCREL/INSN16
10469      sethi ta, hi20(symbol)     ; HI20/PTR
10470      ori   ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10471      jr    ta                   ; PTR_RES/INSN16/EMPTY
10472      .L1:  */
10473
10474   enum elf_nds32_reloc_type checked_types[] =
10475     { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
10476       R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
10477
10478   int reloc_off = 0, cond_removed = 0;
10479   bfd_vma laddr;
10480   Elf_Internal_Rela *cond_irel, *em_irel, *irelend, *insn_irel;
10481   int pic_ext_target = 0;
10482   unsigned int i;
10483   bfd_signed_vma foff;
10484   uint32_t insn, re_insn = 0;
10485   uint16_t insn16, re_insn16 = 0;
10486   unsigned long reloc;
10487
10488   irelend = internal_relocs + sec->reloc_count;
10489   laddr = irel->r_offset;
10490
10491   /* Get the reloc for the address from which the register is
10492      being loaded.  This reloc will tell us which function is
10493      actually being called.  */
10494   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10495                                          R_NDS32_EMPTY, irel->r_addend);
10496
10497   if (em_irel == irelend)
10498     {
10499       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP6",
10500                           (long) 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, em_irel, isymbuf, symtab_hdr,
10506                            &pic_ext_target);
10507
10508   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
10509       || foff >= CONSERVATIVE_24BIT_S1)
10510     return FALSE;
10511
10512   insn = bfd_getb32 (contents + laddr);
10513   /* Check instruction size.  */
10514   if (insn & 0x80000000)
10515     {
10516       *seq_len = 0;
10517       insn16 = insn >> 16;
10518       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
10519     }
10520   else
10521     nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
10522
10523   /* For simplicity of coding, we are going to modify the section
10524      contents, the section relocs, and the BFD symbol table.  We
10525      must tell the rest of the code not to free up this
10526      information.  It would be possible to instead create a table
10527      of changes which have to be made, as is done in coff-mips.c;
10528      that would be more work, but would require less memory when
10529      the linker is run.  */
10530
10531   if (N32_OP6 (re_insn) == N32_OP6_BR1
10532       && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
10533     {
10534       /* beqs     label    ; 15_PCREL */
10535       bfd_putb32 (re_insn, contents + em_irel->r_offset);
10536       reloc = R_NDS32_15_PCREL_RELA;
10537       cond_removed = 1;
10538     }
10539   else if (N32_OP6 (re_insn) == N32_OP6_BR2
10540            && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
10541     {
10542       /* beqz     label ; 17_PCREL */
10543       bfd_putb32 (re_insn, contents + em_irel->r_offset);
10544       reloc = R_NDS32_17_PCREL_RELA;
10545       cond_removed = 1;
10546     }
10547   else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
10548            && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
10549     {
10550       /* Relax to one of the following 2 variations
10551
10552          case 2-4;  1st insn convertible, 16-bit on.
10553          bnes38  rt, ra, .L1    ; LONGJUMP5/9_PCREL/INSN16
10554          j       label          ; 25_PCREL/INSN16
10555          $1:
10556
10557          case 4-4; 1st insn not convertible
10558          bne  rt, ra, .L1       ; LONGJUMP5/15_PCREL/INSN16
10559          j    label             ; 25_PCREL/INSN16
10560          .L1:  */
10561
10562       /* Use j label as second instruction.  */
10563       insn = INSN_J;
10564       reloc = R_NDS32_25_PCREL_RELA;
10565       bfd_putb32 (insn, contents + em_irel->r_offset);
10566     }
10567   else
10568     return FALSE;
10569
10570   /* Set all relocations.  */
10571   em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), reloc);
10572
10573   cond_irel =
10574     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10575                                  R_NDS32_PTR_RESOLVED, em_irel->r_offset);
10576   cond_irel->r_addend = 1;
10577
10578   /* Use INSN16 of first branch instruction to distinguish if keeping
10579      INSN16 of final instruction or not.  */
10580   insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10581                                            R_NDS32_INSN16, irel->r_offset);
10582   if (insn_irel == irelend)
10583     {
10584       /* Clean the final INSN16.  */
10585       insn_irel =
10586         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10587                                      R_NDS32_INSN16, em_irel->r_offset);
10588       insn_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10589                                         R_NDS32_NONE);
10590     }
10591
10592   if (cond_removed == 1)
10593     {
10594       *insn_len = 0;
10595
10596       /* Clear relocations.  */
10597       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10598
10599       for (i = 0; i < sizeof (checked_types) / sizeof (checked_types[0]); i++)
10600         {
10601           cond_irel =
10602             find_relocs_at_address_addr (irel, internal_relocs, irelend,
10603                                          checked_types[i], laddr);
10604           if (cond_irel != irelend)
10605             {
10606               if (*seq_len == 0
10607                   && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
10608                 {
10609                   /* If the branch instruction is 2 byte, it cannot remove
10610                      directly.  Only convert it to nop16 and remove it after
10611                      checking alignment issue.  */
10612                   insn16 = NDS32_NOP16;
10613                   bfd_putb16 (insn16, contents + laddr);
10614                   cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10615                 }
10616               else
10617                 cond_irel->r_info =
10618                   ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10619             }
10620         }
10621     }
10622   else
10623     {
10624       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
10625                                    R_NDS32_LONGJUMP5);
10626     }
10627
10628   return TRUE;
10629 }
10630
10631 /* Relax LONGJUMP7 relocation for nds32_elf_relax_section.  */
10632
10633 static bfd_boolean
10634 nds32_elf_relax_longjump7 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10635                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10636                            int *seq_len, bfd_byte *contents,
10637                            Elf_Internal_Sym *isymbuf,
10638                            Elf_Internal_Shdr *symtab_hdr)
10639 {
10640   /* There are 2 variations for LONGJUMP5
10641      case 2-4;  1st insn convertible, 16-bit on.
10642      movi55  ta, imm11          ; LONGJUMP7/INSN16
10643      beq     rt, ta, label      ; 15_PCREL
10644
10645      case 4-4; 1st insn not convertible
10646      movi55  ta, imm11          ; LONGJUMP7/INSN16
10647      beq     rt, ta, label      ; 15_PCREL  */
10648
10649   bfd_vma laddr;
10650   Elf_Internal_Rela *cond_irel,  *irelend, *insn_irel;
10651   int pic_ext_target = 0;
10652   bfd_signed_vma foff;
10653   uint32_t insn, re_insn = 0;
10654   uint16_t insn16;
10655   uint32_t imm11;
10656
10657   irelend = internal_relocs + sec->reloc_count;
10658   laddr = irel->r_offset;
10659
10660   /* Get the reloc for the address from which the register is
10661      being loaded.  This reloc will tell us which function is
10662      actually being called.  */
10663
10664   cond_irel =
10665     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10666                                  R_NDS32_15_PCREL_RELA, irel->r_addend);
10667   if (cond_irel == irelend)
10668     {
10669       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP7",
10670                           (long) irel->r_offset);
10671       return FALSE;
10672     }
10673
10674   /* Get the value of the symbol referred to by the reloc.  */
10675   foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr,
10676                            &pic_ext_target);
10677
10678   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_8BIT_S1
10679       || foff >= CONSERVATIVE_8BIT_S1)
10680     return FALSE;
10681
10682   /* Get the first instruction for its size.  */
10683   insn = bfd_getb32 (contents + laddr);
10684   if (insn & 0x80000000)
10685     {
10686       *seq_len = 0;
10687       /* Get the immediate from movi55.  */
10688       imm11 = N16_IMM5S (insn >> 16);
10689     }
10690   else
10691     {
10692       /* Get the immediate from movi.  */
10693       imm11 = N32_IMM20S (insn);
10694     }
10695
10696   /* Get the branch instruction.  */
10697   insn = bfd_getb32 (contents + irel->r_addend);
10698   /* Convert instruction to BR3.  */
10699   if ((insn >> 14) & 0x1)
10700     re_insn = N32_BR3 (BNEC, N32_RT5 (insn), imm11, 0);
10701   else
10702     re_insn = N32_BR3 (BEQC, N32_RT5 (insn), imm11, 0);
10703
10704   bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10705
10706   /* Set all relocations.  */
10707   cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10708                                     R_NDS32_WORD_9_PCREL_RELA);
10709
10710   /* Clean relocations.  */
10711   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10712   insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10713                                            R_NDS32_INSN16, irel->r_offset);
10714   if (insn_irel != irelend)
10715     {
10716       if (*seq_len == 0)
10717         {
10718           /* If the first insntruction is 16bit, convert it to nop16.  */
10719           insn16 = NDS32_NOP16;
10720           bfd_putb16 (insn16, contents + laddr);
10721           insn_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10722         }
10723       else
10724         cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10725                                           R_NDS32_NONE);
10726     }
10727   *insn_len = 0;
10728
10729   return TRUE;
10730 }
10731
10732 #define GET_LOADSTORE_RANGE(addend) (((addend) >> 8) & 0x3f)
10733
10734 /* Relax LOADSTORE relocation for nds32_elf_relax_section.  */
10735
10736 static bfd_boolean
10737 nds32_elf_relax_loadstore (struct bfd_link_info *link_info, bfd *abfd,
10738                            asection *sec, Elf_Internal_Rela *irel,
10739                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10740                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10741                            Elf_Internal_Shdr *symtab_hdr, int load_store_relax)
10742 {
10743   int eliminate_sethi = 0, range_type;
10744   unsigned int i;
10745   bfd_vma local_sda, laddr;
10746   int seq_len;  /* Original length of instruction sequence.  */
10747   uint32_t insn;
10748   Elf_Internal_Rela *hi_irelfn = NULL, *irelend;
10749   bfd_vma access_addr = 0;
10750   bfd_vma range_l = 0, range_h = 0;     /* Upper/lower bound.  */
10751   enum elf_nds32_reloc_type checked_types[] =
10752     { R_NDS32_HI20_RELA, R_NDS32_GOT_HI20,
10753       R_NDS32_GOTPC_HI20, R_NDS32_GOTOFF_HI20,
10754       R_NDS32_PLTREL_HI20, R_NDS32_PLT_GOTREL_HI20,
10755       R_NDS32_TLS_LE_HI20
10756     };
10757
10758   irelend = internal_relocs + sec->reloc_count;
10759   seq_len = GET_SEQ_LEN (irel->r_addend);
10760   laddr = irel->r_offset;
10761   *insn_len = seq_len;
10762
10763   /* Get the high part relocation.  */
10764   for (i = 0; i < ARRAY_SIZE (checked_types); i++)
10765     {
10766       hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10767                                                checked_types[i], laddr);
10768       if (hi_irelfn != irelend)
10769         break;
10770     }
10771
10772   if (hi_irelfn == irelend)
10773     {
10774       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LOADSTORE",
10775                           (long) irel->r_offset);
10776         return FALSE;
10777     }
10778
10779   range_type = GET_LOADSTORE_RANGE (irel->r_addend);
10780   nds32_elf_final_sda_base (sec->output_section->owner,
10781                             link_info, &local_sda, FALSE);
10782
10783   switch (ELF32_R_TYPE (hi_irelfn->r_info))
10784     {
10785     case R_NDS32_HI20_RELA:
10786       insn = bfd_getb32 (contents + laddr);
10787       access_addr =
10788         calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
10789
10790       if (range_type == NDS32_LOADSTORE_IMM)
10791         {
10792           struct elf_link_hash_entry *h = NULL;
10793           int indx;
10794
10795           if (ELF32_R_SYM (hi_irelfn->r_info) >= symtab_hdr->sh_info)
10796             {
10797               indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
10798               h = elf_sym_hashes (abfd)[indx];
10799             }
10800
10801           if ((access_addr < CONSERVATIVE_20BIT)
10802               && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
10803             {
10804               eliminate_sethi = 1;
10805               break;
10806             }
10807
10808           /* This is avoid to relax symbol address which is fixed
10809              relocations.  Ex: _stack.  */
10810           if (h && bfd_is_abs_section (h->root.u.def.section))
10811             return FALSE;
10812         }
10813
10814       if (!load_store_relax)
10815         return FALSE;
10816
10817       /* Case for set gp register.  */
10818       if (N32_RT5 (insn) == REG_GP)
10819         break;
10820
10821       if (range_type == NDS32_LOADSTORE_FLOAT_S
10822           || range_type == NDS32_LOADSTORE_FLOAT_S)
10823         {
10824           range_l = sdata_range[0][0];
10825           range_h = sdata_range[0][1];
10826         }
10827       else
10828         {
10829           range_l = sdata_range[1][0];
10830           range_h = sdata_range[1][1];
10831         }
10832       break;
10833
10834     case R_NDS32_GOT_HI20:
10835       access_addr =
10836         calculate_got_memory_address (abfd, link_info, hi_irelfn, symtab_hdr);
10837
10838       /* If this symbol is not in .got, the return value will be -1.
10839          Since the gp value is set to SDA_BASE but not GLOBAL_OFFSET_TABLE,
10840          a negative offset is allowed.  */
10841       if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
10842           && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
10843         eliminate_sethi = 1;
10844       break;
10845
10846     case R_NDS32_PLT_GOTREL_HI20:
10847       access_addr = calculate_plt_memory_address (abfd, link_info, isymbuf,
10848                                                   hi_irelfn, symtab_hdr);
10849
10850       if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
10851           && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
10852         eliminate_sethi = 1;
10853       break;
10854
10855     case R_NDS32_GOTOFF_HI20:
10856       access_addr =
10857         calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
10858
10859       if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
10860           && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
10861         eliminate_sethi = 1;
10862       break;
10863
10864     case R_NDS32_GOTPC_HI20:
10865       /* The access_addr must consider r_addend of hi_irel.  */
10866       access_addr = sec->output_section->vma + sec->output_offset
10867         + irel->r_offset + hi_irelfn->r_addend;
10868
10869       if ((bfd_signed_vma) (local_sda - access_addr) < CONSERVATIVE_20BIT
10870           && (bfd_signed_vma) (local_sda - access_addr) >= -CONSERVATIVE_20BIT)
10871         eliminate_sethi = 1;
10872       break;
10873
10874     case R_NDS32_TLS_LE_HI20:
10875       access_addr =
10876         calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
10877       BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
10878       access_addr -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
10879       if ((range_type == NDS32_LOADSTORE_IMM)
10880           && (bfd_signed_vma) (access_addr) < CONSERVATIVE_20BIT
10881           && (bfd_signed_vma) (access_addr) >= -CONSERVATIVE_20BIT)
10882         eliminate_sethi = 1;
10883       break;
10884
10885     default:
10886       return FALSE;
10887     }
10888
10889   /* Delete sethi instruction.  */
10890   if (eliminate_sethi == 1
10891       || (local_sda <= access_addr && (access_addr - local_sda) < range_h)
10892       || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
10893     {
10894       hi_irelfn->r_info =
10895         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
10896       irel->r_info =
10897         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10898       *insn_len = 0;
10899     }
10900   return TRUE;
10901 }
10902
10903 /* Relax LO12 relocation for nds32_elf_relax_section.  */
10904
10905 static void
10906 nds32_elf_relax_lo12 (struct bfd_link_info *link_info, bfd *abfd,
10907                       asection *sec, Elf_Internal_Rela *irel,
10908                       Elf_Internal_Rela *internal_relocs, bfd_byte *contents,
10909                       Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr)
10910 {
10911   uint32_t insn;
10912   bfd_vma local_sda, laddr;
10913   unsigned long reloc;
10914   bfd_vma access_addr;
10915   bfd_vma range_l = 0, range_h = 0;     /* Upper/lower bound.  */
10916   Elf_Internal_Rela *irelfn = NULL, *irelend;
10917   struct elf_link_hash_entry *h = NULL;
10918   int indx;
10919
10920   /* For SDA base relative relaxation.  */
10921   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
10922                             &local_sda, FALSE);
10923
10924   irelend = internal_relocs + sec->reloc_count;
10925   laddr = irel->r_offset;
10926   insn = bfd_getb32 (contents + laddr);
10927
10928   if (!is_sda_access_insn (insn) && N32_OP6 (insn) != N32_OP6_ORI)
10929     return;
10930
10931   access_addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
10932
10933   if (ELF32_R_SYM (irel->r_info) >= symtab_hdr->sh_info)
10934     {
10935       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
10936       h = elf_sym_hashes (abfd)[indx];
10937     }
10938
10939   if (N32_OP6 (insn) == N32_OP6_ORI && access_addr < CONSERVATIVE_20BIT
10940       && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
10941     {
10942       reloc = R_NDS32_20_RELA;
10943       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
10944       insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
10945       bfd_putb32 (insn, contents + laddr);
10946     }
10947   /* This is avoid to relax symbol address which is fixed
10948      relocations.  Ex: _stack.  */
10949   else if (N32_OP6 (insn) == N32_OP6_ORI
10950            && h && bfd_is_abs_section (h->root.u.def.section))
10951     return;
10952   else
10953     {
10954       range_l = sdata_range[1][0];
10955       range_h = sdata_range[1][1];
10956       switch (ELF32_R_TYPE (irel->r_info))
10957         {
10958         case R_NDS32_LO12S0_RELA:
10959           reloc = R_NDS32_SDA19S0_RELA;
10960           break;
10961         case R_NDS32_LO12S1_RELA:
10962           reloc = R_NDS32_SDA18S1_RELA;
10963           break;
10964         case R_NDS32_LO12S2_RELA:
10965           reloc = R_NDS32_SDA17S2_RELA;
10966           break;
10967         case R_NDS32_LO12S2_DP_RELA:
10968           range_l = sdata_range[0][0];
10969           range_h = sdata_range[0][1];
10970           reloc = R_NDS32_SDA12S2_DP_RELA;
10971           break;
10972         case R_NDS32_LO12S2_SP_RELA:
10973           range_l = sdata_range[0][0];
10974           range_h = sdata_range[0][1];
10975           reloc = R_NDS32_SDA12S2_SP_RELA;
10976           break;
10977         default:
10978           return;
10979         }
10980
10981       /* There are range_h and range_l because linker has to promise
10982          all sections move cross one page together.  */
10983       if ((local_sda <= access_addr && (access_addr - local_sda) < range_h)
10984           || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
10985         {
10986           if (N32_OP6 (insn) == N32_OP6_ORI && N32_RT5 (insn) == REG_GP)
10987             {
10988               /* Maybe we should add R_NDS32_INSN16 reloc type here
10989                  or manually do some optimization.  sethi can't be
10990                  eliminated when updating $gp so the relative ori
10991                  needs to be preserved.  */
10992               return;
10993             }
10994           if (!turn_insn_to_sda_access (insn, ELF32_R_TYPE (irel->r_info),
10995                                         &insn))
10996             return;
10997           irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
10998           bfd_putb32 (insn, contents + laddr);
10999
11000           irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11001                                            R_NDS32_INSN16);
11002           /* SDA17 must keep INSN16 for converting fp_as_gp.  */
11003           if (irelfn != irelend && reloc != R_NDS32_SDA17S2_RELA)
11004             irelfn->r_info =
11005               ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_NDS32_NONE);
11006
11007         }
11008     }
11009   return;
11010 }
11011
11012 /* Relax low part of PIC instruction pattern.  */
11013
11014 static void
11015 nds32_elf_relax_piclo12 (struct bfd_link_info *link_info, bfd *abfd,
11016                          asection *sec, Elf_Internal_Rela *irel,
11017                          bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11018                          Elf_Internal_Shdr *symtab_hdr)
11019 {
11020   uint32_t insn;
11021   bfd_vma local_sda, laddr;
11022   bfd_signed_vma foff;
11023   unsigned long reloc;
11024
11025   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11026                             &local_sda, FALSE);
11027   laddr = irel->r_offset;
11028   insn = bfd_getb32 (contents + laddr);
11029
11030   if (N32_OP6 (insn) != N32_OP6_ORI)
11031     return;
11032
11033   if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12)
11034     {
11035       foff = calculate_got_memory_address (abfd, link_info, irel,
11036                                            symtab_hdr) - local_sda;
11037       reloc = R_NDS32_GOT20;
11038     }
11039   else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12)
11040     {
11041       foff = calculate_plt_memory_address (abfd, link_info, isymbuf, irel,
11042                                            symtab_hdr) - local_sda;
11043       reloc = R_NDS32_PLT_GOTREL_LO20;
11044     }
11045   else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12)
11046     {
11047       foff = calculate_memory_address (abfd, irel, isymbuf,
11048                                        symtab_hdr) - local_sda;
11049       reloc = R_NDS32_GOTOFF;
11050     }
11051   else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12)
11052     {
11053       foff = local_sda - sec->output_section->vma + sec->output_offset
11054         + irel->r_offset + irel->r_addend;
11055       reloc = R_NDS32_GOTPC20;
11056     }
11057   else
11058     return;
11059
11060   if ((foff < CONSERVATIVE_20BIT) && (foff >= -CONSERVATIVE_20BIT))
11061     {
11062       /* Turn into MOVI.  */
11063       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
11064       insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
11065       bfd_putb32 (insn, contents + laddr);
11066     }
11067 }
11068
11069 /* Relax low part of LE TLS instruction pattern.  */
11070
11071 static void
11072 nds32_elf_relax_letlslo12 (struct bfd_link_info *link_info, bfd *abfd,
11073                            Elf_Internal_Rela *irel,
11074                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11075                            Elf_Internal_Shdr *symtab_hdr)
11076 {
11077   uint32_t insn;
11078   bfd_vma laddr;
11079   bfd_signed_vma foff;
11080   unsigned long reloc;
11081
11082   laddr = irel->r_offset;
11083   foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11084   BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
11085   foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
11086   insn = bfd_getb32 (contents + laddr);
11087
11088   if ( (bfd_signed_vma) (foff) < CONSERVATIVE_20BIT
11089       && (bfd_signed_vma) (foff) >= -CONSERVATIVE_20BIT)
11090     {
11091       /* Pattern sethi-ori transform to movi.  */
11092       reloc = R_NDS32_TLS_LE_20;
11093       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
11094       insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
11095       bfd_putb32 (insn, contents + laddr);
11096     }
11097 }
11098
11099 /* Relax LE TLS calculate address instruction pattern.  */
11100
11101 static void
11102 nds32_elf_relax_letlsadd (struct bfd_link_info *link_info, bfd *abfd,
11103                           asection *sec, Elf_Internal_Rela *irel,
11104                           Elf_Internal_Rela *internal_relocs,
11105                           bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11106                           Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11107 {
11108   /* Local TLS non-pic
11109      sethi    ta, hi20(symbol@tpoff)      ; TLS_LE_HI20
11110      ori      ta, ta, lo12(symbol@tpoff)  ; TLS_LE_LO12
11111      add      ra, ta, tp                  ; TLS_LE_ADD */
11112
11113   uint32_t insn;
11114   bfd_vma laddr;
11115   bfd_signed_vma foff;
11116   Elf_Internal_Rela *i1_irelfn, *irelend;
11117
11118   irelend = internal_relocs + sec->reloc_count;
11119   laddr = irel->r_offset;
11120   insn = bfd_getb32 (contents + laddr);
11121   i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11122                                       R_NDS32_PTR_RESOLVED);
11123   foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11124   BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
11125   foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
11126
11127   /* The range is +/-16k.  */
11128   if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT
11129       && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT)
11130     {
11131       /* Transform add to addi.  */
11132       insn = N32_TYPE2 (ADDI, N32_RT5 (insn), N32_RB5 (insn), 0);
11133       irel->r_info =
11134         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S0);
11135
11136       bfd_putb32 (insn, contents + laddr);
11137       if (i1_irelfn != irelend)
11138         {
11139           i1_irelfn->r_addend |= 1;
11140           *again = TRUE;
11141         }
11142     }
11143 }
11144
11145 /* Relax LE TLS load store instruction pattern.  */
11146
11147 static void
11148 nds32_elf_relax_letlsls (struct bfd_link_info *link_info, bfd *abfd,
11149                          asection *sec, Elf_Internal_Rela *irel,
11150                          Elf_Internal_Rela *internal_relocs,
11151                          bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11152                          Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11153 {
11154
11155   uint32_t insn;
11156   bfd_vma laddr;
11157   bfd_signed_vma foff;
11158   Elf_Internal_Rela *i1_irelfn, *irelend;
11159   int success = 0;
11160
11161   irelend = internal_relocs + sec->reloc_count;
11162   laddr = irel->r_offset;
11163   insn = bfd_getb32 (contents + laddr);
11164   i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11165                                       R_NDS32_PTR_RESOLVED);
11166   foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11167   BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
11168   foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
11169
11170   switch ((N32_OP6 (insn) << 8) | (insn & 0xff))
11171     {
11172     case (N32_OP6_MEM << 8) | N32_MEM_LB:
11173     case (N32_OP6_MEM << 8) | N32_MEM_SB:
11174     case (N32_OP6_MEM << 8) | N32_MEM_LBS:
11175       /* The range is +/-16k.  */
11176       if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT
11177           && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT)
11178         {
11179           insn =
11180             ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
11181           irel->r_info =
11182             ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S0);
11183           success = 1;
11184           break;
11185         }
11186       /* Fall through.  */
11187     case (N32_OP6_MEM << 8) | N32_MEM_LH:
11188     case (N32_OP6_MEM << 8) | N32_MEM_SH:
11189     case (N32_OP6_MEM << 8) | N32_MEM_LHS:
11190       /* The range is +/-32k.  */
11191       if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT_S1
11192           && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT_S1)
11193         {
11194           insn =
11195             ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
11196           irel->r_info =
11197             ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S1);
11198           success = 1;
11199           break;
11200         }
11201       /* Fall through.  */
11202     case (N32_OP6_MEM << 8) | N32_MEM_LW:
11203     case (N32_OP6_MEM << 8) | N32_MEM_SW:
11204       /* The range is +/-64k.  */
11205       if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT_S2
11206           && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT_S2)
11207         {
11208           insn =
11209             ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
11210           irel->r_info =
11211             ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S2);
11212           success = 1;
11213           break;
11214         }
11215       /* Fall through.  */
11216     default:
11217       break;
11218     }
11219
11220   if (success)
11221     {
11222       bfd_putb32 (insn, contents + laddr);
11223       if (i1_irelfn != irelend)
11224         {
11225           i1_irelfn->r_addend |= 1;
11226           *again = TRUE;
11227         }
11228     }
11229 }
11230
11231 /* Relax PTR relocation for nds32_elf_relax_section.  */
11232
11233 static bfd_boolean
11234 nds32_elf_relax_ptr (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
11235                      Elf_Internal_Rela *internal_relocs, int *insn_len,
11236                      int *seq_len, bfd_byte *contents)
11237 {
11238   Elf_Internal_Rela *ptr_irel, *irelend, *count_irel, *re_irel;
11239
11240   irelend = internal_relocs + sec->reloc_count;
11241
11242   re_irel =
11243     find_relocs_at_address_addr (irel, internal_relocs, irelend,
11244                                  R_NDS32_PTR_RESOLVED, irel->r_addend);
11245
11246   if (re_irel == irelend)
11247     {
11248       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_PTR",
11249                           (long) irel->r_offset);
11250       return FALSE;
11251     }
11252
11253   if (re_irel->r_addend != 1)
11254     return FALSE;
11255
11256   /* Pointed target is relaxed and no longer needs this void *,
11257      change the type to NONE.  */
11258   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11259
11260   /* Find PTR_COUNT to decide remove it or not.  If PTR_COUNT does
11261      not exist, it means only count 1 and remove it directly.  */
11262   /* TODO: I hope we can obsolate R_NDS32_COUNT in the future.  */
11263   count_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11264                                        R_NDS32_PTR_COUNT);
11265   ptr_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11266                                      R_NDS32_PTR);
11267   if (count_irel != irelend)
11268     {
11269       if (--count_irel->r_addend > 0)
11270         return FALSE;
11271     }
11272
11273   if (ptr_irel != irelend)
11274     return FALSE;
11275
11276   /* If the PTR_COUNT is already 0, remove current instruction.  */
11277   *seq_len = nds32_elf_insn_size (abfd, contents, irel->r_offset);
11278   *insn_len = 0;
11279   return TRUE;
11280 }
11281
11282 /* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section.  */
11283
11284 static void
11285 nds32_elf_relax_pltgot_suff (struct bfd_link_info *link_info, bfd *abfd,
11286                              asection *sec, Elf_Internal_Rela *irel,
11287                              Elf_Internal_Rela *internal_relocs,
11288                              bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11289                              Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11290 {
11291   uint32_t insn;
11292   bfd_signed_vma foff;
11293   Elf_Internal_Rela *i1_irelfn, *irelend;
11294   bfd_vma local_sda, laddr;
11295
11296   irelend = internal_relocs + sec->reloc_count;
11297   laddr = irel->r_offset;
11298   insn = bfd_getb32 (contents + laddr);
11299
11300   /* FIXME: It's a little trouble to turn JRAL5 to JAL since
11301      we need additional space.  It might be help if we could
11302      borrow some space from instructions to be eliminated
11303      such as sethi, ori, add.  */
11304   if (insn & 0x80000000)
11305     return;
11306
11307   if (nds32_elf_check_dup_relocs
11308       (irel, internal_relocs, irelend, R_NDS32_PLT_GOT_SUFF))
11309     return;
11310
11311   i1_irelfn =
11312     find_relocs_at_address (irel, internal_relocs, irelend,
11313                             R_NDS32_PTR_RESOLVED);
11314
11315   /* FIXIT 090606
11316      The boundary should be reduced since the .plt section hasn't
11317      been created and the address of specific entry is still unknown
11318      Maybe the range between the function call and the begin of the
11319      .text section can be used to decide if the .plt is in the range
11320      of function call.  */
11321
11322   if (N32_OP6 (insn) == N32_OP6_ALU1
11323       && N32_SUB5 (insn) == N32_ALU1_ADD)
11324     {
11325       /* Get the value of the symbol referred to by the reloc.  */
11326       nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11327                                 &local_sda, FALSE);
11328       foff = (bfd_signed_vma) (calculate_plt_memory_address
11329                                (abfd, link_info, isymbuf, irel,
11330                                 symtab_hdr) - local_sda);
11331       /* This condition only happened when symbol is undefined.  */
11332       if (foff == 0)
11333         return;
11334
11335       if (foff < -CONSERVATIVE_19BIT || foff >= CONSERVATIVE_19BIT)
11336         return;
11337       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
11338                                    R_NDS32_PLT_GOTREL_LO19);
11339       /* addi.gp */
11340       insn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19));
11341     }
11342   else if (N32_OP6 (insn) == N32_OP6_JREG
11343            && N32_SUB5 (insn) == N32_JREG_JRAL)
11344     {
11345       /* Get the value of the symbol referred to by the reloc.  */
11346       foff =
11347         calculate_plt_offset (abfd, sec, link_info, isymbuf, irel, symtab_hdr);
11348       /* This condition only happened when symbol is undefined.  */
11349       if (foff == 0)
11350         return;
11351       if (foff < -CONSERVATIVE_24BIT_S1 || foff >= CONSERVATIVE_24BIT_S1)
11352         return;
11353       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_25_PLTREL);
11354       insn = INSN_JAL;
11355     }
11356   else
11357     return;
11358
11359   bfd_putb32 (insn, contents + laddr);
11360   if (i1_irelfn != irelend)
11361     {
11362       i1_irelfn->r_addend |= 1;
11363       *again = TRUE;
11364     }
11365 }
11366
11367 /* Relax GOT_SUFF relocation for nds32_elf_relax_section.  */
11368
11369 static void
11370 nds32_elf_relax_got_suff (struct bfd_link_info *link_info, bfd *abfd,
11371                           asection *sec, Elf_Internal_Rela *irel,
11372                           Elf_Internal_Rela *internal_relocs,
11373                           bfd_byte *contents, Elf_Internal_Shdr *symtab_hdr,
11374                           bfd_boolean *again)
11375 {
11376   uint32_t insn;
11377   bfd_signed_vma foff;
11378   Elf_Internal_Rela *i1_irelfn, *irelend;
11379   bfd_vma local_sda, laddr;
11380
11381   irelend = internal_relocs + sec->reloc_count;
11382   laddr = irel->r_offset;
11383   insn = bfd_getb32 (contents + laddr);
11384   if (insn & 0x80000000)
11385     return;
11386
11387   if (nds32_elf_check_dup_relocs
11388       (irel, internal_relocs, irelend, R_NDS32_GOT_SUFF))
11389     return;
11390
11391   i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11392                                       R_NDS32_PTR_RESOLVED);
11393
11394   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11395                             &local_sda, FALSE);
11396   foff = calculate_got_memory_address (abfd, link_info, irel,
11397                                        symtab_hdr) - local_sda;
11398
11399   if (foff < CONSERVATIVE_19BIT && foff >= -CONSERVATIVE_19BIT)
11400     {
11401       /* Turn LW to LWI.GP.  Change relocation type to R_NDS32_GOT_REL.  */
11402       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
11403       irel->r_info =
11404         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_GOT17S2_RELA);
11405       bfd_putb32 (insn, contents + laddr);
11406       if (i1_irelfn != irelend)
11407         {
11408           i1_irelfn->r_addend |= 1;
11409           *again = TRUE;
11410         }
11411     }
11412 }
11413
11414 /* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section.  */
11415
11416 static void
11417 nds32_elf_relax_gotoff_suff (struct bfd_link_info *link_info, bfd *abfd,
11418                              asection *sec, Elf_Internal_Rela *irel,
11419                              Elf_Internal_Rela *internal_relocs,
11420                              bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11421                              Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11422 {
11423   int opc_insn_gotoff;
11424   uint32_t insn;
11425   bfd_signed_vma foff;
11426   Elf_Internal_Rela *i1_irelfn, *i2_irelfn, *irelend;
11427   bfd_vma local_sda, laddr;
11428
11429   irelend = internal_relocs + sec->reloc_count;
11430   laddr = irel->r_offset;
11431   insn = bfd_getb32 (contents + laddr);
11432
11433   if (insn & 0x80000000)
11434     return;
11435
11436   if (nds32_elf_check_dup_relocs
11437       (irel, internal_relocs, irelend, R_NDS32_GOTOFF_SUFF))
11438     return;
11439
11440   i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11441                                       R_NDS32_PTR_RESOLVED);
11442   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11443                             &local_sda, FALSE);
11444   foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11445   foff = foff - local_sda;
11446
11447   if (foff >= CONSERVATIVE_19BIT || foff < -CONSERVATIVE_19BIT)
11448     return;
11449
11450   /* Concatenate opcode and sub-opcode for switch case.
11451      It may be MEM or ALU1.  */
11452   opc_insn_gotoff = (N32_OP6 (insn) << 8) | (insn & 0xff);
11453   switch (opc_insn_gotoff)
11454     {
11455     case (N32_OP6_MEM << 8) | N32_MEM_LW:
11456       /* 4-byte aligned.  */
11457       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
11458       irel->r_info =
11459         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA17S2_RELA);
11460       break;
11461     case (N32_OP6_MEM << 8) | N32_MEM_SW:
11462       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3));
11463       irel->r_info =
11464         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA17S2_RELA);
11465       break;
11466     case (N32_OP6_MEM << 8) | N32_MEM_LH:
11467       /* 2-byte aligned.  */
11468       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0);
11469       irel->r_info =
11470         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
11471       break;
11472     case (N32_OP6_MEM << 8) | N32_MEM_LHS:
11473       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (18));
11474       irel->r_info =
11475         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
11476       break;
11477     case (N32_OP6_MEM << 8) | N32_MEM_SH:
11478       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (19));
11479       irel->r_info =
11480         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
11481       break;
11482     case (N32_OP6_MEM << 8) | N32_MEM_LB:
11483       /* 1-byte aligned.  */
11484       insn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0);
11485       irel->r_info =
11486         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11487       break;
11488     case (N32_OP6_MEM << 8) | N32_MEM_LBS:
11489       insn = N32_TYPE1 (LBGP, N32_RT5 (insn), __BIT (19));
11490       irel->r_info =
11491         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11492       break;
11493     case (N32_OP6_MEM << 8) | N32_MEM_SB:
11494       insn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0);
11495       irel->r_info =
11496         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11497       break;
11498     case (N32_OP6_ALU1 << 8) | N32_ALU1_ADD:
11499       insn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19));
11500       irel->r_info =
11501         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11502       break;
11503     default:
11504       return;
11505     }
11506
11507   bfd_putb32 (insn, contents + laddr);
11508   if (i1_irelfn != irelend)
11509     {
11510       i1_irelfn->r_addend |= 1;
11511       *again = TRUE;
11512     }
11513   if ((i2_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11514                                            R_NDS32_INSN16)) != irelend)
11515     i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11516
11517 }
11518
11519 static bfd_boolean
11520 nds32_relax_adjust_label (bfd *abfd, asection *sec,
11521                           Elf_Internal_Rela *internal_relocs,
11522                           bfd_byte *contents,
11523                           nds32_elf_blank_t **relax_blank_list,
11524                           int optimize, int opt_size)
11525 {
11526   /* This code block is used to adjust 4-byte alignment by relax a pair
11527      of instruction a time.
11528
11529      It recognizes three types of relocations.
11530      1. R_NDS32_LABEL - a aligment.
11531      2. R_NDS32_INSN16 - relax a 32-bit instruction to 16-bit.
11532      3. is_16bit_NOP () - remove a 16-bit instruction.  */
11533
11534   /* TODO: It seems currently implementation only support 4-byte aligment.
11535      We should handle any-aligment.  */
11536
11537   Elf_Internal_Rela *insn_rel = NULL, *label_rel = NULL, *irel;
11538   Elf_Internal_Rela *tmp_rel, *tmp2_rel = NULL;
11539   Elf_Internal_Rela rel_temp;
11540   Elf_Internal_Rela *irelend;
11541   bfd_vma address;
11542   uint16_t insn16;
11543
11544   /* Checking for branch relaxation relies on the relocations to
11545      be sorted on 'r_offset'.  This is not guaranteed so we must sort.  */
11546   nds32_insertion_sort (internal_relocs, sec->reloc_count,
11547                         sizeof (Elf_Internal_Rela), compar_reloc);
11548
11549   irelend = internal_relocs + sec->reloc_count;
11550
11551   /* Force R_NDS32_LABEL before R_NDS32_INSN16.  */
11552   /* FIXME: Can we generate the right order in assembler?
11553      So we don't have to swapping them here.  */
11554
11555   for (label_rel = internal_relocs, insn_rel = internal_relocs;
11556        label_rel < irelend; label_rel++)
11557     {
11558       if (ELF32_R_TYPE (label_rel->r_info) != R_NDS32_LABEL)
11559         continue;
11560
11561       /* Find the first reloc has the same offset with label_rel.  */
11562       while (insn_rel < irelend && insn_rel->r_offset < label_rel->r_offset)
11563         insn_rel++;
11564
11565       for (;insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset;
11566            insn_rel++)
11567         /* Check if there were R_NDS32_INSN16 and R_NDS32_LABEL at the same
11568            address.  */
11569         if (ELF32_R_TYPE (insn_rel->r_info) == R_NDS32_INSN16)
11570           break;
11571
11572       if (insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset
11573           && insn_rel < label_rel)
11574         {
11575           /* Swap the two reloc if the R_NDS32_INSN16 is
11576              before R_NDS32_LABEL.  */
11577           memcpy (&rel_temp, insn_rel, sizeof (Elf_Internal_Rela));
11578           memcpy (insn_rel, label_rel, sizeof (Elf_Internal_Rela));
11579           memcpy (label_rel, &rel_temp, sizeof (Elf_Internal_Rela));
11580         }
11581     }
11582
11583   label_rel = NULL;
11584   insn_rel = NULL;
11585   /* If there were a sequence of R_NDS32_LABEL end up with .align 2
11586      or higher, remove other R_NDS32_LABEL with lower alignment.
11587      If an R_NDS32_INSN16 in between R_NDS32_LABELs must be converted,
11588      then the R_NDS32_LABEL sequence is broke.  */
11589   for (tmp_rel = internal_relocs; tmp_rel < irelend; tmp_rel++)
11590     {
11591       if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_LABEL)
11592         {
11593           if (label_rel == NULL)
11594             {
11595               if (tmp_rel->r_addend < 2)
11596                 label_rel = tmp_rel;
11597               continue;
11598             }
11599           else if (tmp_rel->r_addend > 1)
11600             {
11601               /* Remove all LABEL relocation from label_rel to tmp_rel
11602                  including relocations with same offset as tmp_rel.  */
11603               for (tmp2_rel = label_rel; tmp2_rel < tmp_rel
11604                    || tmp2_rel->r_offset == tmp_rel->r_offset; tmp2_rel++)
11605                 {
11606                   if (ELF32_R_TYPE (tmp2_rel->r_info) == R_NDS32_LABEL
11607                       && tmp2_rel->r_addend < 2)
11608                     tmp2_rel->r_info =
11609                       ELF32_R_INFO (ELF32_R_SYM (tmp2_rel->r_info),
11610                                     R_NDS32_NONE);
11611                 }
11612               label_rel = NULL;
11613             }
11614         }
11615       else if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16 && label_rel)
11616         {
11617           /* A new INSN16 which can be converted, so clear label_rel.  */
11618           if (is_convert_32_to_16 (abfd, sec, tmp_rel, internal_relocs,
11619                                    irelend, &insn16)
11620               || is_16bit_NOP (abfd, sec, tmp_rel))
11621             label_rel = NULL;
11622         }
11623     }
11624
11625   label_rel = NULL;
11626   insn_rel = NULL;
11627   /* Optimized for speed and nothing has not been relaxed.
11628      It's time to align labels.
11629      We may convert a 16-bit instruction right before a label to
11630      32-bit, in order to align the label if necessary
11631      all reloc entries has been sorted by r_offset.  */
11632   for (irel = internal_relocs; irel < irelend; irel++)
11633     {
11634       if (ELF32_R_TYPE (irel->r_info) != R_NDS32_INSN16
11635           && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL)
11636         continue;
11637
11638       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_INSN16)
11639         {
11640           /* A new INSN16 found, resize the old one.  */
11641           if (is_convert_32_to_16
11642               (abfd, sec, irel, internal_relocs, irelend, &insn16)
11643               || is_16bit_NOP (abfd, sec, irel))
11644             {
11645               if (insn_rel)
11646                 {
11647                   /* Previous INSN16 reloc exists, reduce its
11648                      size to 16-bit.  */
11649                   if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
11650                                            irelend, &insn16))
11651                     {
11652                       nds32_elf_write_16 (abfd, contents, insn_rel,
11653                                           internal_relocs, irelend, insn16);
11654
11655                       if (!insert_nds32_elf_blank_recalc_total
11656                           (relax_blank_list, insn_rel->r_offset + 2, 2))
11657                         return FALSE;
11658                     }
11659                   else if (is_16bit_NOP (abfd, sec, insn_rel))
11660                     {
11661                       if (!insert_nds32_elf_blank_recalc_total
11662                           (relax_blank_list, insn_rel->r_offset, 2))
11663                         return FALSE;
11664                     }
11665                   insn_rel->r_info =
11666                     ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info), R_NDS32_NONE);
11667                 }
11668               /* Save the new one for later use.  */
11669               insn_rel = irel;
11670             }
11671           else
11672             irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
11673                                          R_NDS32_NONE);
11674         }
11675       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL)
11676         {
11677           /* Search for label.  */
11678           int force_relax = 0;
11679
11680           /* Label on 16-bit instruction or optimization
11681              needless, just reset this reloc.  */
11682           insn16 = bfd_getb16 (contents + irel->r_offset);
11683           if ((irel->r_addend & 0x1f) < 2 && (!optimize || (insn16 & 0x8000)))
11684             {
11685               irel->r_info =
11686                 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11687               continue;
11688             }
11689
11690           address =
11691             irel->r_offset - get_nds32_elf_blank_total (relax_blank_list,
11692                                                         irel->r_offset, 1);
11693
11694           if (!insn_rel)
11695             {
11696               /* Check if there is case which can not be aligned.  */
11697               if (irel->r_addend == 2 && address & 0x2)
11698                 return FALSE;
11699               continue;
11700             }
11701
11702           /* Try to align this label.  */
11703
11704           if ((irel->r_addend & 0x1f) < 2)
11705             {
11706               /* Check if there is a INSN16 at the same address.
11707                  Label_rel always seats before insn_rel after
11708                  our sort.  */
11709
11710               /* Search for INSN16 at LABEL location.  If INSN16 is at
11711                  same location and this LABEL alignment is lower than 2,
11712                  the INSN16 can be converted to 2-byte.  */
11713               for (tmp_rel = irel;
11714                    tmp_rel < irelend && tmp_rel->r_offset == irel->r_offset;
11715                    tmp_rel++)
11716                 {
11717                   if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16
11718                       && (is_convert_32_to_16
11719                           (abfd, sec, tmp_rel, internal_relocs,
11720                            irelend, &insn16)
11721                           || is_16bit_NOP (abfd, sec, tmp_rel)))
11722                     {
11723                       force_relax = 1;
11724                       break;
11725                     }
11726                 }
11727             }
11728
11729           if (force_relax || irel->r_addend == 1 || address & 0x2)
11730             {
11731               /* Label not aligned.  */
11732               /* Previous reloc exists, reduce its size to 16-bit.  */
11733               if (is_convert_32_to_16 (abfd, sec, insn_rel,
11734                                        internal_relocs, irelend, &insn16))
11735                 {
11736                   nds32_elf_write_16 (abfd, contents, insn_rel,
11737                                       internal_relocs, irelend, insn16);
11738
11739                   if (!insert_nds32_elf_blank_recalc_total
11740                       (relax_blank_list, insn_rel->r_offset + 2, 2))
11741                     return FALSE;
11742                 }
11743               else if (is_16bit_NOP (abfd, sec, insn_rel))
11744                 {
11745                   if (!insert_nds32_elf_blank_recalc_total
11746                       (relax_blank_list, insn_rel->r_offset, 2))
11747                     return FALSE;
11748                 }
11749
11750             }
11751           /* INSN16 reloc is used.  */
11752           insn_rel = NULL;
11753         }
11754     }
11755
11756   address =
11757     sec->size - get_nds32_elf_blank_total (relax_blank_list, sec->size, 0);
11758   if (insn_rel && (address & 0x2 || opt_size))
11759     {
11760       if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
11761                                irelend, &insn16))
11762         {
11763           nds32_elf_write_16 (abfd, contents, insn_rel, internal_relocs,
11764                               irelend, insn16);
11765           if (!insert_nds32_elf_blank_recalc_total
11766               (relax_blank_list, insn_rel->r_offset + 2, 2))
11767             return FALSE;
11768           insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
11769                                            R_NDS32_NONE);
11770         }
11771       else if (is_16bit_NOP (abfd, sec, insn_rel))
11772         {
11773           if (!insert_nds32_elf_blank_recalc_total
11774               (relax_blank_list, insn_rel->r_offset, 2))
11775             return FALSE;
11776           insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
11777                                            R_NDS32_NONE);
11778         }
11779     }
11780   insn_rel = NULL;
11781   return TRUE;
11782 }
11783
11784 /* Pick relaxation round.  */
11785
11786 static int
11787 nds32_elf_pick_relax (bfd_boolean init, asection *sec, bfd_boolean *again,
11788                       struct elf_nds32_link_hash_table *table,
11789                       struct bfd_link_info *link_info)
11790 {
11791   static asection *final_sec, *first_sec = NULL;
11792   static bfd_boolean normal_again = FALSE;
11793   static bfd_boolean set = FALSE;
11794   static bfd_boolean first = TRUE;
11795   int round_table[] = {
11796       NDS32_RELAX_NORMAL_ROUND,
11797       NDS32_RELAX_JUMP_IFC_ROUND,
11798       NDS32_RELAX_EX9_BUILD_ROUND,
11799       NDS32_RELAX_EX9_REPLACE_ROUND,
11800   };
11801   static int pass = 0;
11802   static int relax_round;
11803
11804   /* The new round.  */
11805   if (init && first_sec == sec)
11806     {
11807       set = TRUE;
11808       normal_again = FALSE;
11809     }
11810
11811   if (first)
11812     {
11813       /* Run an empty run to get the final section.  */
11814       relax_round = NDS32_RELAX_EMPTY_ROUND;
11815
11816       /* It has to enter relax again because we can
11817          not make sure what the final turn is.  */
11818       *again = TRUE;
11819
11820       first = FALSE;
11821       first_sec = sec;
11822     }
11823
11824   if (!set)
11825     {
11826       /* Not reenter yet.  */
11827       final_sec = sec;
11828       return relax_round;
11829     }
11830
11831   relax_round = round_table[pass];
11832
11833   if (!init && relax_round == NDS32_RELAX_NORMAL_ROUND && *again)
11834     normal_again = TRUE;
11835
11836   if (!init && final_sec == sec)
11837     {
11838       switch (relax_round)
11839         {
11840         case NDS32_RELAX_NORMAL_ROUND:
11841           if (!normal_again)
11842             {
11843               /* Normal relaxation done.  */
11844               if (table->target_optimize & NDS32_RELAX_JUMP_IFC_ON)
11845                 {
11846                   pass++;
11847                   *again = TRUE;
11848                 }
11849               else if (table->target_optimize & NDS32_RELAX_EX9_ON)
11850                 {
11851                   pass += 2;    /* NDS32_RELAX_EX9_BUILD_ROUND */
11852                   *again = TRUE;
11853                 }
11854               else if (table->ex9_import_file)
11855                 {
11856                   /* Import ex9 table.  */
11857                   if (table->update_ex9_table)
11858                     pass += 2;  /* NDS32_RELAX_EX9_BUILD_ROUND */
11859                   else
11860                     pass += 3;  /* NDS32_RELAX_EX9_REPLACE_ROUND */
11861                   nds32_elf_ex9_import_table (link_info);
11862                   *again = TRUE;
11863                 }
11864             }
11865           break;
11866         case NDS32_RELAX_JUMP_IFC_ROUND:
11867           if (!nds32_elf_ifc_finish (link_info))
11868             _bfd_error_handler (_("error: Jump IFC Fail."));
11869           if (table->target_optimize & NDS32_RELAX_EX9_ON)
11870             {
11871               pass++;
11872               *again = TRUE;
11873             }
11874           break;
11875         case NDS32_RELAX_EX9_BUILD_ROUND:
11876           nds32_elf_ex9_finish (link_info);
11877           pass++;
11878           *again = TRUE;
11879           break;
11880         case NDS32_RELAX_EX9_REPLACE_ROUND:
11881           if (table->target_optimize & NDS32_RELAX_JUMP_IFC_ON)
11882             {
11883               /* Do jump IFC optimization again.  */
11884               if (!nds32_elf_ifc_finish (link_info))
11885                 _bfd_error_handler (_("error: Jump IFC Fail."));
11886             }
11887           break;
11888         default:
11889           break;
11890         }
11891     }
11892
11893   return relax_round;
11894 }
11895
11896 static bfd_boolean
11897 nds32_elf_relax_section (bfd *abfd, asection *sec,
11898                          struct bfd_link_info *link_info, bfd_boolean *again)
11899 {
11900   nds32_elf_blank_t *relax_blank_list = NULL;
11901   Elf_Internal_Shdr *symtab_hdr;
11902   Elf_Internal_Rela *internal_relocs;
11903   Elf_Internal_Rela *irel;
11904   Elf_Internal_Rela *irelend;
11905   Elf_Internal_Sym *isymbuf = NULL;
11906   bfd_byte *contents = NULL;
11907   bfd_boolean result = TRUE;
11908   int optimize = 0;
11909   int opt_size = 0;
11910   uint32_t insn;
11911   uint16_t insn16;
11912
11913   /* Target dependnet option.  */
11914   struct elf_nds32_link_hash_table *table;
11915   int load_store_relax;
11916   int relax_round;
11917
11918   relax_blank_list = NULL;
11919
11920   *again = FALSE;
11921
11922   /* Nothing to do for
11923    * relocatable link or
11924    * non-relocatable section or
11925    * non-code section or
11926    * empty content or
11927    * no reloc entry.  */
11928   if (bfd_link_relocatable (link_info)
11929       || (sec->flags & SEC_RELOC) == 0
11930       || (sec->flags & SEC_EXCLUDE) == 1
11931       || (sec->flags & SEC_CODE) == 0
11932       || sec->size == 0)
11933     return TRUE;
11934
11935   /* 09.12.11 Workaround.  */
11936   /*  We have to adjust align for R_NDS32_LABEL if needed.
11937       The adjust approach only can fix 2-byte align once.  */
11938   if (sec->alignment_power > 2)
11939     return TRUE;
11940
11941   /* The optimization type to do.  */
11942
11943   table = nds32_elf_hash_table (link_info);
11944   relax_round = nds32_elf_pick_relax (TRUE, sec, again, table, link_info);
11945   switch (relax_round)
11946     {
11947     case NDS32_RELAX_JUMP_IFC_ROUND:
11948       /* Here is the entrance of ifc jump relaxation.  */
11949       if (!nds32_elf_ifc_calc (link_info, abfd, sec))
11950         return FALSE;
11951       nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
11952       return TRUE;
11953
11954     case NDS32_RELAX_EX9_BUILD_ROUND:
11955       /* Here is the entrance of ex9 relaxation.  There are two pass of
11956          ex9 relaxation.  The one is to traverse all instructions and build
11957          the hash table.  The other one is to compare instructions and replace
11958          it by ex9.it.  */
11959       if (!nds32_elf_ex9_build_hash_table (abfd, sec, link_info))
11960         return FALSE;
11961       nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
11962       return TRUE;
11963
11964     case NDS32_RELAX_EX9_REPLACE_ROUND:
11965       if (!nds32_elf_ex9_replace_instruction (link_info, abfd, sec))
11966         return FALSE;
11967       return TRUE;
11968
11969     case NDS32_RELAX_EMPTY_ROUND:
11970       nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
11971       return TRUE;
11972
11973     case NDS32_RELAX_NORMAL_ROUND:
11974     default:
11975       if (sec->reloc_count == 0)
11976         return TRUE;
11977       break;
11978     }
11979
11980   /* The begining of general relaxation.  */
11981
11982   if (is_SDA_BASE_set == 0)
11983     {
11984       bfd_vma gp;
11985       is_SDA_BASE_set = 1;
11986       nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11987                                 &gp, FALSE);
11988       relax_range_measurement (abfd);
11989     }
11990
11991   if (is_ITB_BASE_set == 0)
11992     {
11993       /* Set the _ITB_BASE_.  */
11994       if (!nds32_elf_ex9_itb_base (link_info))
11995         {
11996           _bfd_error_handler (_("%B: error: Cannot set _ITB_BASE_"), abfd);
11997           bfd_set_error (bfd_error_bad_value);
11998         }
11999     }
12000
12001   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12002   /* Relocations MUST be kept in memory, because relaxation adjust them.  */
12003   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
12004                                                TRUE /* keep_memory */);
12005   if (internal_relocs == NULL)
12006     goto error_return;
12007
12008   irelend = internal_relocs + sec->reloc_count;
12009   irel = find_relocs_at_address (internal_relocs, internal_relocs,
12010                                  irelend, R_NDS32_RELAX_ENTRY);
12011
12012   if (irel == irelend)
12013     return TRUE;
12014
12015   if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
12016     {
12017       if (irel->r_addend & R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG)
12018         {
12019           nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
12020           return TRUE;
12021         }
12022
12023       if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG)
12024         optimize = 1;
12025
12026       if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG)
12027         opt_size = 1;
12028     }
12029
12030   load_store_relax = table->load_store_relax;
12031
12032   /* Get symbol table and section content.  */
12033   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
12034       || !nds32_get_local_syms (abfd, sec, &isymbuf))
12035     goto error_return;
12036
12037   /* Do relax loop only when finalize is not done.
12038      Take care of relaxable relocs except INSN16.  */
12039   for (irel = internal_relocs; irel < irelend; irel++)
12040     {
12041       int seq_len;              /* Original length of instruction sequence.  */
12042       int insn_len = 0;         /* Final length of instruction sequence.  */
12043       bfd_boolean removed;
12044
12045       insn = 0;
12046       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
12047           && (irel->r_addend & 0x1f) >= 2)
12048         optimize = 1;
12049
12050       /* Relocation Types
12051          R_NDS32_LONGCALL1      53
12052          R_NDS32_LONGCALL2      54
12053          R_NDS32_LONGCALL3      55
12054          R_NDS32_LONGJUMP1      56
12055          R_NDS32_LONGJUMP2      57
12056          R_NDS32_LONGJUMP3      58
12057          R_NDS32_LOADSTORE      59  */
12058       if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL1
12059           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LOADSTORE)
12060         seq_len = GET_SEQ_LEN (irel->r_addend);
12061
12062       /* Relocation Types
12063          R_NDS32_LONGCALL4      107
12064          R_NDS32_LONGCALL5      108
12065          R_NDS32_LONGCALL6      109
12066          R_NDS32_LONGJUMP4      110
12067          R_NDS32_LONGJUMP5      111
12068          R_NDS32_LONGJUMP6      112
12069          R_NDS32_LONGJUMP7      113  */
12070       else if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL4
12071                && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LONGJUMP7)
12072         seq_len = 4;
12073
12074         /* Relocation Types
12075          R_NDS32_LO12S0_RELA            30
12076          R_NDS32_LO12S1_RELA            29
12077          R_NDS32_LO12S2_RELA            28
12078          R_NDS32_LO12S2_SP_RELA         71
12079          R_NDS32_LO12S2_DP_RELA         70
12080          R_NDS32_GOT_LO12               46
12081          R_NDS32_GOTOFF_LO12            50
12082          R_NDS32_PLTREL_LO12            65
12083          R_NDS32_PLT_GOTREL_LO12        67
12084          R_NDS32_17IFC_PCREL_RELA       96
12085          R_NDS32_GOT_SUFF               193
12086          R_NDS32_GOTOFF_SUFF            194
12087          R_NDS32_PLT_GOT_SUFF           195
12088          R_NDS32_MULCALL_SUFF           196
12089          R_NDS32_PTR                    197  */
12090       else if ((ELF32_R_TYPE (irel->r_info) <= R_NDS32_LO12S0_RELA
12091                 && ELF32_R_TYPE (irel->r_info) >= R_NDS32_LO12S2_RELA)
12092                || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_SP_RELA
12093                || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_DP_RELA
12094                || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12
12095                || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12
12096                || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12
12097                || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLTREL_LO12
12098                || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12
12099                || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_GOT_SUFF
12100                    && ELF32_R_TYPE (irel->r_info) <= R_NDS32_PTR)
12101                || ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
12102                || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LO12
12103                || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_ADD
12104                || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LS)
12105         seq_len = 0;
12106       else
12107         continue;
12108
12109       insn_len = seq_len;
12110       removed = FALSE;
12111
12112       switch (ELF32_R_TYPE (irel->r_info))
12113         {
12114         case R_NDS32_LONGCALL1:
12115           removed = nds32_elf_relax_longcall1 (abfd, sec, irel, internal_relocs,
12116                                                &insn_len, contents, isymbuf,
12117                                                symtab_hdr);
12118           break;
12119         case R_NDS32_LONGCALL2:
12120           removed = nds32_elf_relax_longcall2 (abfd, sec, irel, internal_relocs,
12121                                                &insn_len, contents, isymbuf,
12122                                                symtab_hdr);
12123           break;
12124         case R_NDS32_LONGCALL3:
12125           removed = nds32_elf_relax_longcall3 (abfd, sec, irel, internal_relocs,
12126                                                &insn_len, contents, isymbuf,
12127                                                symtab_hdr);
12128           break;
12129         case R_NDS32_LONGJUMP1:
12130           removed = nds32_elf_relax_longjump1 (abfd, sec, irel, internal_relocs,
12131                                                &insn_len, contents, isymbuf,
12132                                                symtab_hdr);
12133           break;
12134         case R_NDS32_LONGJUMP2:
12135           removed = nds32_elf_relax_longjump2 (abfd, sec, irel, internal_relocs,
12136                                                &insn_len, contents, isymbuf,
12137                                                symtab_hdr);
12138           break;
12139         case R_NDS32_LONGJUMP3:
12140           removed = nds32_elf_relax_longjump3 (abfd, sec, irel, internal_relocs,
12141                                                &insn_len, contents, isymbuf,
12142                                                symtab_hdr);
12143           break;
12144         case R_NDS32_LONGCALL4:
12145           removed = nds32_elf_relax_longcall4 (abfd, sec, irel, internal_relocs,
12146                                                &insn_len, contents, isymbuf,
12147                                                symtab_hdr);
12148           break;
12149         case R_NDS32_LONGCALL5:
12150           removed = nds32_elf_relax_longcall5 (abfd, sec, irel, internal_relocs,
12151                                                &insn_len, contents, isymbuf,
12152                                                symtab_hdr);
12153           break;
12154         case R_NDS32_LONGCALL6:
12155           removed = nds32_elf_relax_longcall6 (abfd, sec, irel, internal_relocs,
12156                                                &insn_len, contents, isymbuf,
12157                                                symtab_hdr);
12158           break;
12159         case R_NDS32_LONGJUMP4:
12160           removed = nds32_elf_relax_longjump4 (abfd, sec, irel, internal_relocs,
12161                                                &insn_len, contents, isymbuf,
12162                                                symtab_hdr);
12163           break;
12164         case R_NDS32_LONGJUMP5:
12165           removed = nds32_elf_relax_longjump5 (abfd, sec, irel, internal_relocs,
12166                                                &insn_len, &seq_len, contents,
12167                                                isymbuf, symtab_hdr);
12168           break;
12169         case R_NDS32_LONGJUMP6:
12170           removed = nds32_elf_relax_longjump6 (abfd, sec, irel, internal_relocs,
12171                                                &insn_len, &seq_len, contents,
12172                                                isymbuf, symtab_hdr);
12173           break;
12174         case R_NDS32_LONGJUMP7:
12175           removed = nds32_elf_relax_longjump7 (abfd, sec, irel, internal_relocs,
12176                                                &insn_len, &seq_len, contents,
12177                                                isymbuf, symtab_hdr);
12178           break;
12179         case R_NDS32_LOADSTORE:
12180           removed = nds32_elf_relax_loadstore (link_info, abfd, sec, irel,
12181                                                internal_relocs, &insn_len,
12182                                                contents, isymbuf, symtab_hdr,
12183                                                load_store_relax);
12184           break;
12185         case R_NDS32_LO12S0_RELA:
12186         case R_NDS32_LO12S1_RELA:
12187         case R_NDS32_LO12S2_DP_RELA:
12188         case R_NDS32_LO12S2_SP_RELA:
12189         case R_NDS32_LO12S2_RELA:
12190           /* Relax for low part.  */
12191           nds32_elf_relax_lo12 (link_info, abfd, sec, irel, internal_relocs,
12192                                 contents, isymbuf, symtab_hdr);
12193
12194           /* It is impossible to delete blank, so just continue.  */
12195           continue;
12196         case R_NDS32_GOT_LO12:
12197         case R_NDS32_GOTOFF_LO12:
12198         case R_NDS32_PLTREL_LO12:
12199         case R_NDS32_PLT_GOTREL_LO12:
12200         case R_NDS32_GOTPC_LO12:
12201           /* Relax for PIC gp-relative low part.  */
12202           nds32_elf_relax_piclo12 (link_info, abfd, sec, irel, contents,
12203                                    isymbuf, symtab_hdr);
12204
12205           /* It is impossible to delete blank, so just continue.  */
12206           continue;
12207         case R_NDS32_TLS_LE_LO12:
12208           /* Relax for LE TLS low part.  */
12209           nds32_elf_relax_letlslo12 (link_info, abfd, irel, contents,
12210                                      isymbuf, symtab_hdr);
12211
12212           /* It is impossible to delete blank, so just continue.  */
12213           continue;
12214         case R_NDS32_TLS_LE_ADD:
12215           nds32_elf_relax_letlsadd (link_info, abfd, sec, irel, internal_relocs,
12216                                     contents, isymbuf, symtab_hdr, again);
12217           /* It is impossible to delete blank, so just continue.  */
12218           continue;
12219         case R_NDS32_TLS_LE_LS:
12220           nds32_elf_relax_letlsls (link_info, abfd, sec, irel, internal_relocs,
12221                                    contents, isymbuf, symtab_hdr, again);
12222           continue;
12223         case R_NDS32_PTR:
12224           removed = nds32_elf_relax_ptr (abfd, sec, irel, internal_relocs,
12225                                          &insn_len, &seq_len, contents);
12226           break;
12227         case R_NDS32_PLT_GOT_SUFF:
12228           nds32_elf_relax_pltgot_suff (link_info, abfd, sec, irel,
12229                                        internal_relocs, contents,
12230                                        isymbuf, symtab_hdr, again);
12231           /* It is impossible to delete blank, so just continue.  */
12232           continue;
12233         case R_NDS32_GOT_SUFF:
12234           nds32_elf_relax_got_suff (link_info, abfd, sec, irel,
12235                                     internal_relocs, contents,
12236                                     symtab_hdr, again);
12237           /* It is impossible to delete blank, so just continue.  */
12238           continue;
12239         case R_NDS32_GOTOFF_SUFF:
12240           nds32_elf_relax_gotoff_suff (link_info, abfd, sec, irel,
12241                                        internal_relocs, contents,
12242                                        isymbuf, symtab_hdr, again);
12243           /* It is impossible to delete blank, so just continue.  */
12244           continue;
12245         default:
12246           continue;
12247
12248         }
12249       if (removed && seq_len - insn_len > 0)
12250         {
12251           if (!insert_nds32_elf_blank
12252               (&relax_blank_list, irel->r_offset + insn_len,
12253                seq_len - insn_len))
12254             goto error_return;
12255           *again = TRUE;
12256         }
12257     }
12258
12259   calc_nds32_blank_total (relax_blank_list);
12260
12261   if (table->relax_fp_as_gp)
12262     {
12263       if (!nds32_relax_fp_as_gp (link_info, abfd, sec, internal_relocs,
12264                                  irelend, isymbuf))
12265         goto error_return;
12266
12267       if (*again == FALSE)
12268         {
12269           if (!nds32_fag_remove_unused_fpbase (abfd, sec, internal_relocs,
12270                                                irelend))
12271             goto error_return;
12272         }
12273     }
12274
12275   nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
12276
12277   if (*again == FALSE)
12278     {
12279       if (!nds32_relax_adjust_label (abfd, sec, internal_relocs, contents,
12280                                      &relax_blank_list, optimize, opt_size))
12281         goto error_return;
12282     }
12283
12284   /* It doesn't matter optimize_for_space_no_align anymore.
12285        If object file is assembled with flag '-Os',
12286        the we don't adjust jump-destination on 4-byte boundary.  */
12287
12288   if (relax_blank_list)
12289     {
12290       nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
12291       relax_blank_list = NULL;
12292     }
12293
12294   if (*again == FALSE)
12295     {
12296       /* Closing the section, so we don't relax it anymore.  */
12297       bfd_vma sec_size_align;
12298       Elf_Internal_Rela *tmp_rel;
12299
12300       /* Pad to alignment boundary.  Only handle current section alignment.  */
12301       sec_size_align = (sec->size + (~((-1U) << sec->alignment_power)))
12302                        & ((-1U) << sec->alignment_power);
12303       if ((sec_size_align - sec->size) & 0x2)
12304         {
12305           insn16 = NDS32_NOP16;
12306           bfd_putb16 (insn16, contents + sec->size);
12307           sec->size += 2;
12308         }
12309
12310       while (sec_size_align != sec->size)
12311         {
12312           insn = NDS32_NOP32;
12313           bfd_putb32 (insn, contents + sec->size);
12314           sec->size += 4;
12315         }
12316
12317       tmp_rel = find_relocs_at_address (internal_relocs, internal_relocs,
12318                                         irelend, R_NDS32_RELAX_ENTRY);
12319       if (tmp_rel != irelend)
12320         tmp_rel->r_addend |= R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG;
12321
12322       clean_nds32_elf_blank ();
12323     }
12324
12325 finish:
12326   if (internal_relocs != NULL
12327       && elf_section_data (sec)->relocs != internal_relocs)
12328     free (internal_relocs);
12329
12330   if (contents != NULL
12331       && elf_section_data (sec)->this_hdr.contents != contents)
12332     free (contents);
12333
12334   if (isymbuf != NULL && symtab_hdr->contents != (bfd_byte *) isymbuf)
12335     free (isymbuf);
12336
12337   return result;
12338
12339 error_return:
12340   result = FALSE;
12341   goto finish;
12342 }
12343
12344 static struct bfd_elf_special_section const nds32_elf_special_sections[] =
12345 {
12346   {".sdata", 6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE},
12347   {".sbss", 5, -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE},
12348   {NULL, 0, 0, 0, 0}
12349 };
12350
12351 static bfd_boolean
12352 nds32_elf_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED,
12353                             struct bfd_link_info *info,
12354                             void *finfo ATTRIBUTE_UNUSED,
12355                             bfd_boolean (*func) (void *, const char *,
12356                                                  Elf_Internal_Sym *,
12357                                                  asection *,
12358                                                  struct elf_link_hash_entry *)
12359                             ATTRIBUTE_UNUSED)
12360 {
12361   FILE *sym_ld_script = NULL;
12362   struct elf_nds32_link_hash_table *table;
12363
12364   table = nds32_elf_hash_table (info);
12365   sym_ld_script = table->sym_ld_script;
12366
12367   if (check_start_export_sym)
12368     fprintf (sym_ld_script, "}\n");
12369
12370   return TRUE;
12371 }
12372
12373 static enum elf_reloc_type_class
12374 nds32_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
12375                             const asection *rel_sec ATTRIBUTE_UNUSED,
12376                             const Elf_Internal_Rela *rela)
12377 {
12378   switch ((int) ELF32_R_TYPE (rela->r_info))
12379     {
12380     case R_NDS32_RELATIVE:
12381       return reloc_class_relative;
12382     case R_NDS32_JMP_SLOT:
12383       return reloc_class_plt;
12384     case R_NDS32_COPY:
12385       return reloc_class_copy;
12386     default:
12387       return reloc_class_normal;
12388     }
12389 }
12390
12391 /* Put target dependent option into info hash table.  */
12392 void
12393 bfd_elf32_nds32_set_target_option (struct bfd_link_info *link_info,
12394                                    int relax_fp_as_gp,
12395                                    int eliminate_gc_relocs,
12396                                    FILE * sym_ld_script, int load_store_relax,
12397                                    int target_optimize, int relax_status,
12398                                    int relax_round, FILE * ex9_export_file,
12399                                    FILE * ex9_import_file,
12400                                    int update_ex9_table, int ex9_limit,
12401                                    bfd_boolean ex9_loop_aware,
12402                                    bfd_boolean ifc_loop_aware)
12403 {
12404   struct elf_nds32_link_hash_table *table;
12405
12406   table = nds32_elf_hash_table (link_info);
12407   if (table == NULL)
12408     return;
12409
12410   table->relax_fp_as_gp = relax_fp_as_gp;
12411   table->eliminate_gc_relocs = eliminate_gc_relocs;
12412   table->sym_ld_script = sym_ld_script;
12413   table ->load_store_relax = load_store_relax;
12414   table->target_optimize = target_optimize;
12415   table->relax_status = relax_status;
12416   table->relax_round = relax_round;
12417   table->ex9_export_file = ex9_export_file;
12418   table->ex9_import_file = ex9_import_file;
12419   table->update_ex9_table = update_ex9_table;
12420   table->ex9_limit = ex9_limit;
12421   table->ex9_loop_aware = ex9_loop_aware;
12422   table->ifc_loop_aware = ifc_loop_aware;
12423 }
12424 \f
12425 /* These functions and data-structures are used for fp-as-gp
12426    optimization.  */
12427
12428 #define FAG_THRESHOLD   3       /* At least 3 gp-access.  */
12429 /* lwi37.fp covers 508 bytes, but there may be 32-byte padding between
12430    the read-only section and read-write section.  */
12431 #define FAG_WINDOW      (508 - 32)
12432
12433 /* An nds32_fag represent a gp-relative access.
12434    We find best fp-base by using a sliding window
12435    to find a base address which can cover most gp-access.  */
12436 struct nds32_fag
12437 {
12438   struct nds32_fag *next;       /* NULL-teminated linked list.  */
12439   bfd_vma addr;                 /* The address of this fag.  */
12440   Elf_Internal_Rela **relas;    /* The relocations associated with this fag.
12441                                    It is used for applying FP7U2_FLAG.  */
12442   int count;                    /* How many times this address is referred.
12443                                    There should be exactly `count' relocations
12444                                    in relas.  */
12445   int relas_capcity;            /* The buffer size of relas.
12446                                    We use an array instead of linked-list,
12447                                    and realloc is used to adjust buffer size.  */
12448 };
12449
12450 static void
12451 nds32_fag_init (struct nds32_fag *head)
12452 {
12453   memset (head, 0, sizeof (struct nds32_fag));
12454 }
12455
12456 static void
12457 nds32_fag_verify (struct nds32_fag *head)
12458 {
12459   struct nds32_fag *iter;
12460   struct nds32_fag *prev;
12461
12462   prev = NULL;
12463   iter = head->next;
12464   while (iter)
12465     {
12466       if (prev && prev->addr >= iter->addr)
12467         puts ("Bug in fp-as-gp insertion.");
12468       prev = iter;
12469       iter = iter->next;
12470     }
12471 }
12472
12473 /* Insert a fag in ascending order.
12474    If a fag of the same address already exists,
12475    they are chained by relas array.  */
12476
12477 static void
12478 nds32_fag_insert (struct nds32_fag *head, bfd_vma addr,
12479                   Elf_Internal_Rela * rel)
12480 {
12481   struct nds32_fag *iter;
12482   struct nds32_fag *new_fag;
12483   const int INIT_RELAS_CAP = 4;
12484
12485   for (iter = head;
12486        iter->next && iter->next->addr <= addr;
12487        iter = iter->next)
12488     /* Find somewhere to insert.  */ ;
12489
12490   /* `iter' will be equal to `head' if the list is empty.  */
12491   if (iter != head && iter->addr == addr)
12492     {
12493       /* The address exists in the list.
12494          Insert `rel' into relocation list, relas.  */
12495
12496       /* Check whether relas is big enough.  */
12497       if (iter->count >= iter->relas_capcity)
12498         {
12499           iter->relas_capcity *= 2;
12500           iter->relas = bfd_realloc
12501             (iter->relas, iter->relas_capcity * sizeof (void *));
12502         }
12503       iter->relas[iter->count++] = rel;
12504       return;
12505     }
12506
12507   /* This is a new address.  Create a fag node for it.  */
12508   new_fag = bfd_malloc (sizeof (struct nds32_fag));
12509   memset (new_fag, 0, sizeof (*new_fag));
12510   new_fag->addr = addr;
12511   new_fag->count = 1;
12512   new_fag->next = iter->next;
12513   new_fag->relas_capcity = INIT_RELAS_CAP;
12514   new_fag->relas = (Elf_Internal_Rela **)
12515     bfd_malloc (new_fag->relas_capcity * sizeof (void *));
12516   new_fag->relas[0] = rel;
12517   iter->next = new_fag;
12518
12519   nds32_fag_verify (head);
12520 }
12521
12522 static void
12523 nds32_fag_free_list (struct nds32_fag *head)
12524 {
12525   struct nds32_fag *iter;
12526
12527   iter = head->next;
12528   while (iter)
12529     {
12530       struct nds32_fag *tmp = iter;
12531       iter = iter->next;
12532       free (tmp->relas);
12533       tmp->relas = NULL;
12534       free (tmp);
12535     }
12536 }
12537
12538 /* Find the best fp-base address.
12539    The relocation associated with that address is returned,
12540    so we can track the symbol instead of a fixed address.
12541
12542    When relaxation, the address of an datum may change,
12543    because a text section is shrinked, so the data section
12544    moves forward.  If the aligments of text and data section
12545    are different, their distance may change too.
12546    Therefore, tracking a fixed address is not appriate.  */
12547
12548 static int
12549 nds32_fag_find_base (struct nds32_fag *head, struct nds32_fag **bestpp)
12550 {
12551   struct nds32_fag *base;       /* First fag in the window.  */
12552   struct nds32_fag *last;       /* First fag outside the window.  */
12553   int accu = 0;                 /* Usage accumulation.  */
12554   struct nds32_fag *best;       /* Best fag.  */
12555   int baccu = 0;                /* Best accumulation.  */
12556
12557   /* Use first fag for initial, and find the last fag in the window.
12558
12559      In each iteration, we could simply subtract previous fag
12560      and accumulate following fags which are inside the window,
12561      untill we each the end.  */
12562
12563   if (head->next == NULL)
12564     {
12565       *bestpp = NULL;
12566       return 0;
12567     }
12568
12569   /* Initialize base.  */
12570   base = head->next;
12571   best = base;
12572   for (last = base;
12573        last && last->addr < base->addr + FAG_WINDOW;
12574        last = last->next)
12575     accu += last->count;
12576
12577   baccu = accu;
12578
12579   /* Record the best base in each iteration.  */
12580   while (base->next)
12581     {
12582       accu -= base->count;
12583       base = base->next;
12584       /* Account fags in window.  */
12585       for (/* Nothing.  */;
12586            last && last->addr < base->addr + FAG_WINDOW;
12587            last = last->next)
12588         accu += last->count;
12589
12590       /* A better fp-base?  */
12591       if (accu > baccu)
12592         {
12593           best = base;
12594           baccu = accu;
12595         }
12596     }
12597
12598   if (bestpp)
12599     *bestpp = best;
12600   return baccu;
12601 }
12602
12603 /* Apply R_NDS32_INSN16_FP7U2_FLAG on gp-relative accesses,
12604    so we can convert it fo fp-relative access later.
12605    `best_fag' is the best fp-base.  Only those inside the window
12606    of best_fag is applied the flag.  */
12607
12608 static bfd_boolean
12609 nds32_fag_mark_relax (struct bfd_link_info *link_info,
12610                       bfd *abfd, struct nds32_fag *best_fag,
12611                       Elf_Internal_Rela *internal_relocs,
12612                       Elf_Internal_Rela *irelend)
12613 {
12614   struct nds32_fag *ifag;
12615   bfd_vma best_fpbase, gp;
12616   bfd *output_bfd;
12617
12618   output_bfd = abfd->sections->output_section->owner;
12619   nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
12620   best_fpbase = best_fag->addr;
12621
12622   if (best_fpbase > gp + sdata_range[1][1]
12623       || best_fpbase < gp - sdata_range[1][0])
12624     return FALSE;
12625
12626   /* Mark these inside the window R_NDS32_INSN16_FP7U2_FLAG flag,
12627      so we know they can be converted to lwi37.fp.   */
12628   for (ifag = best_fag;
12629        ifag && ifag->addr < best_fpbase + FAG_WINDOW; ifag = ifag->next)
12630     {
12631       int i;
12632
12633       for (i = 0; i < ifag->count; i++)
12634         {
12635           Elf_Internal_Rela *insn16_rel;
12636           Elf_Internal_Rela *fag_rel;
12637
12638           fag_rel = ifag->relas[i];
12639
12640           /* Only if this is within the WINDOWS, FP7U2_FLAG
12641              is applied.  */
12642
12643           insn16_rel = find_relocs_at_address
12644             (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
12645
12646           if (insn16_rel != irelend)
12647             insn16_rel->r_addend = R_NDS32_INSN16_FP7U2_FLAG;
12648         }
12649     }
12650   return TRUE;
12651 }
12652
12653 /* Reset INSN16 to clean fp as gp.  */
12654
12655 static void
12656 nds32_fag_unmark_relax (struct nds32_fag *fag,
12657                         Elf_Internal_Rela *internal_relocs,
12658                         Elf_Internal_Rela *irelend)
12659 {
12660   struct nds32_fag *ifag;
12661   int i;
12662   Elf_Internal_Rela *insn16_rel;
12663   Elf_Internal_Rela *fag_rel;
12664
12665   for (ifag = fag; ifag; ifag = ifag->next)
12666     {
12667       for (i = 0; i < ifag->count; i++)
12668         {
12669           fag_rel = ifag->relas[i];
12670
12671           /* Restore the INSN16 relocation.  */
12672           insn16_rel = find_relocs_at_address
12673             (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
12674
12675           if (insn16_rel != irelend)
12676             insn16_rel->r_addend &= ~R_NDS32_INSN16_FP7U2_FLAG;
12677         }
12678     }
12679 }
12680
12681 /* This is the main function of fp-as-gp optimization.
12682    It should be called by relax_section.  */
12683
12684 static bfd_boolean
12685 nds32_relax_fp_as_gp (struct bfd_link_info *link_info,
12686                       bfd *abfd, asection *sec,
12687                       Elf_Internal_Rela *internal_relocs,
12688                       Elf_Internal_Rela *irelend,
12689                       Elf_Internal_Sym *isymbuf)
12690 {
12691   Elf_Internal_Rela *begin_rel = NULL;
12692   Elf_Internal_Rela *irel;
12693   struct nds32_fag fag_head;
12694   Elf_Internal_Shdr *symtab_hdr;
12695   bfd_byte *contents;
12696   bfd_boolean ifc_inside = FALSE;
12697
12698   /* FIXME: Can we bfd_elf_link_read_relocs for the relocs?  */
12699
12700   /* Per-function fp-base selection.
12701      1. Create a list for all the gp-relative access.
12702      2. Base on those gp-relative address,
12703         find a fp-base which can cover most access.
12704      3. Use the fp-base for fp-as-gp relaxation.
12705
12706      NOTE: If fp-as-gp is not worth to do, (e.g., less than 3 times),
12707      we should
12708      1. delete the `la $fp, _FP_BASE_' instruction and
12709      2. not convert lwi.gp to lwi37.fp.
12710
12711      To delete the _FP_BASE_ instruction, we simply apply
12712      R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG flag in the r_addend to disable it.
12713
12714      To suppress the conversion, we simply NOT to apply
12715      R_NDS32_INSN16_FP7U2_FLAG flag.  */
12716
12717   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12718
12719   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
12720       || !nds32_get_local_syms (abfd, sec, &isymbuf))
12721     return FALSE;
12722
12723   /* Check whether it is worth for fp-as-gp optimization,
12724      i.e., at least 3 gp-load.
12725
12726      Set R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG if we should NOT
12727      apply this optimization.  */
12728
12729   for (irel = internal_relocs; irel < irelend; irel++)
12730     {
12731       /* We recognize R_NDS32_RELAX_REGION_BEGIN/_END for the region.
12732          One we enter the begin of the region, we track all the LW/ST
12733          instructions, so when we leave the region, we try to find
12734          the best fp-base address for those LW/ST instructions.  */
12735
12736       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
12737           && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
12738         {
12739           /* Begin of the region.  */
12740           if (begin_rel)
12741             /* xgettext:c-format */
12742             _bfd_error_handler (_("%B: Nested OMIT_FP in %A."), abfd, sec);
12743
12744           begin_rel = irel;
12745           nds32_fag_init (&fag_head);
12746           ifc_inside = FALSE;
12747         }
12748       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
12749                && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
12750         {
12751           int accu;
12752           struct nds32_fag *best_fag, *tmp_fag;
12753           int dist;
12754
12755           /* End of the region.
12756              Check whether it is worth to do fp-as-gp.  */
12757
12758           if (begin_rel == NULL)
12759             {
12760               /* xgettext:c-format */
12761               _bfd_error_handler (_("%B: Unmatched OMIT_FP in %A."), abfd, sec);
12762               continue;
12763             }
12764
12765           accu = nds32_fag_find_base (&fag_head, &best_fag);
12766
12767           /* Clean FP7U2_FLAG because they may set ever.  */
12768           tmp_fag = fag_head.next;
12769           nds32_fag_unmark_relax (tmp_fag, internal_relocs, irelend);
12770
12771           /* Check if it is worth, and FP_BASE is near enough to SDA_BASE.  */
12772           if (accu < FAG_THRESHOLD
12773               || !nds32_fag_mark_relax (link_info, abfd, best_fag,
12774                                         internal_relocs, irelend))
12775             {
12776               /* Not worth to do fp-as-gp.  */
12777               begin_rel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
12778               begin_rel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
12779               irel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
12780               irel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
12781               nds32_fag_free_list (&fag_head);
12782               begin_rel = NULL;
12783               continue;
12784             }
12785
12786           /* R_SYM of R_NDS32_RELAX_REGION_BEGIN is not used by assembler,
12787              so we use it to record the distance to the reloction of best
12788              fp-base.  */
12789           dist = best_fag->relas[0] - begin_rel;
12790           BFD_ASSERT (dist > 0 && dist < 0xffffff);
12791           /* Use high 16 bits of addend to record the _FP_BASE_ matched
12792              relocation.  And get the base value when relocating.  */
12793           begin_rel->r_addend &= (0x1 << 16) - 1;
12794           begin_rel->r_addend |= dist << 16;
12795
12796           nds32_fag_free_list (&fag_head);
12797           begin_rel = NULL;
12798         }
12799
12800       if (begin_rel == NULL || ifc_inside)
12801         /* Skip if we are not in the region of fp-as-gp.  */
12802         continue;
12803
12804       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S2_RELA
12805           || ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA17S2_RELA)
12806         {
12807           bfd_vma addr;
12808           uint32_t insn;
12809
12810           /* A gp-relative access is found.  Insert it to the fag-list.  */
12811
12812           /* Rt is necessary an RT3, so it can be converted to lwi37.fp.  */
12813           insn = bfd_getb32 (contents + irel->r_offset);
12814           if (!N32_IS_RT3 (insn))
12815             continue;
12816
12817           addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
12818           nds32_fag_insert (&fag_head, addr, irel);
12819         }
12820       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA_FP7U2_RELA)
12821         {
12822           begin_rel = NULL;
12823         }
12824       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
12825                || ELF32_R_TYPE (irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
12826         {
12827           /* Suppress fp as gp when encounter ifc.  */
12828           ifc_inside = TRUE;
12829         }
12830     }
12831
12832   return TRUE;
12833 }
12834
12835 /* Remove unused `la $fp, _FD_BASE_' instruction.  */
12836
12837 static bfd_boolean
12838 nds32_fag_remove_unused_fpbase (bfd *abfd, asection *sec,
12839                                 Elf_Internal_Rela *internal_relocs,
12840                                 Elf_Internal_Rela *irelend)
12841 {
12842   Elf_Internal_Rela *irel;
12843   Elf_Internal_Shdr *symtab_hdr;
12844   bfd_byte *contents = NULL;
12845   nds32_elf_blank_t *relax_blank_list = NULL;
12846   bfd_boolean result = TRUE;
12847   bfd_boolean unused_region = FALSE;
12848
12849   /*
12850      NOTE: Disable fp-as-gp if we encounter ifcall relocations.
12851      * R_NDS32_17IFC_PCREL_RELA
12852      * R_NDS32_10IFCU_PCREL_RELA
12853
12854      CASE??????????????
12855   */
12856
12857   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12858   nds32_get_section_contents (abfd, sec, &contents, TRUE);
12859
12860   for (irel = internal_relocs; irel < irelend; irel++)
12861     {
12862       /* To remove unused fp-base, we simply find the REGION_NOT_OMIT_FP
12863          we marked to in previous pass.
12864          DO NOT scan relocations again, since we've alreadly decided it
12865          and set the flag.  */
12866       const char *syname;
12867       int syndx;
12868       uint32_t insn;
12869
12870       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
12871           && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
12872         unused_region = TRUE;
12873       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
12874                && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
12875         unused_region = FALSE;
12876
12877       /* We're not in the region.  */
12878       if (!unused_region)
12879         continue;
12880
12881       /* _FP_BASE_ must be a GLOBAL symbol.  */
12882       syndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
12883       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
12884         continue;
12885
12886       /* The symbol name must be _FP_BASE_.  */
12887       syname = elf_sym_hashes (abfd)[syndx]->root.root.string;
12888       if (strcmp (syname, FP_BASE_NAME) != 0)
12889         continue;
12890
12891       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA19S0_RELA)
12892         {
12893           /* addi.gp  $fp, -256  */
12894           insn = bfd_getb32 (contents + irel->r_offset);
12895           if (insn != INSN_ADDIGP_TO_FP)
12896             continue;
12897         }
12898       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S0_RELA)
12899         {
12900           /* addi  $fp, $gp, -256  */
12901           insn = bfd_getb32 (contents + irel->r_offset);
12902           if (insn != INSN_ADDI_GP_TO_FP)
12903             continue;
12904         }
12905       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_20_RELA)
12906         {
12907           /* movi  $fp, FP_BASE  */
12908           insn = bfd_getb32 (contents + irel->r_offset);
12909           if (insn != INSN_MOVI_TO_FP)
12910             continue;
12911         }
12912       else
12913         continue;
12914
12915       /* We got here because a FP_BASE instruction is found.  */
12916       if (!insert_nds32_elf_blank_recalc_total
12917           (&relax_blank_list, irel->r_offset, 4))
12918         goto error_return;
12919     }
12920
12921 finish:
12922   if (relax_blank_list)
12923     {
12924       nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
12925       relax_blank_list = NULL;
12926     }
12927   return result;
12928
12929 error_return:
12930   result = FALSE;
12931   goto finish;
12932 }
12933
12934 /* This is a version of bfd_generic_get_relocated_section_contents.
12935    We need this variety because relaxation will modify the dwarf
12936    infomation.  When there is undefined symbol reference error mesage,
12937    linker need to dump line number where the symbol be used.  However
12938    the address is be relaxed, it can not get the original dwarf contents.
12939    The variety only modify function call for reading in the section.  */
12940
12941 static bfd_byte *
12942 nds32_elf_get_relocated_section_contents (bfd *abfd,
12943                                           struct bfd_link_info *link_info,
12944                                           struct bfd_link_order *link_order,
12945                                           bfd_byte *data,
12946                                           bfd_boolean relocatable,
12947                                           asymbol **symbols)
12948 {
12949   bfd *input_bfd = link_order->u.indirect.section->owner;
12950   asection *input_section = link_order->u.indirect.section;
12951   long reloc_size;
12952   arelent **reloc_vector;
12953   long reloc_count;
12954
12955   reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
12956   if (reloc_size < 0)
12957     return NULL;
12958
12959   /* Read in the section.  */
12960   if (!nds32_get_section_contents (input_bfd, input_section, &data, FALSE))
12961     return NULL;
12962
12963   if (reloc_size == 0)
12964     return data;
12965
12966   reloc_vector = (arelent **) bfd_malloc (reloc_size);
12967   if (reloc_vector == NULL)
12968     return NULL;
12969
12970   reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
12971                                         reloc_vector, symbols);
12972   if (reloc_count < 0)
12973     goto error_return;
12974
12975   if (reloc_count > 0)
12976     {
12977       arelent **parent;
12978       for (parent = reloc_vector; *parent != NULL; parent++)
12979         {
12980           char *error_message = NULL;
12981           asymbol *symbol;
12982           bfd_reloc_status_type r;
12983
12984           symbol = *(*parent)->sym_ptr_ptr;
12985           if (symbol->section && discarded_section (symbol->section))
12986             {
12987               bfd_byte *p;
12988               static reloc_howto_type none_howto
12989                 = HOWTO (0, 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL,
12990                          "unused", FALSE, 0, 0, FALSE);
12991
12992               p = data + (*parent)->address * bfd_octets_per_byte (input_bfd);
12993               _bfd_clear_contents ((*parent)->howto, input_bfd, input_section,
12994                                    p);
12995               (*parent)->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
12996               (*parent)->addend = 0;
12997               (*parent)->howto = &none_howto;
12998               r = bfd_reloc_ok;
12999             }
13000           else
13001             r = bfd_perform_relocation (input_bfd, *parent, data,
13002                                         input_section,
13003                                         relocatable ? abfd : NULL,
13004                                         &error_message);
13005
13006           if (relocatable)
13007             {
13008               asection *os = input_section->output_section;
13009
13010               /* A partial link, so keep the relocs.  */
13011               os->orelocation[os->reloc_count] = *parent;
13012               os->reloc_count++;
13013             }
13014
13015           if (r != bfd_reloc_ok)
13016             {
13017               switch (r)
13018                 {
13019                 case bfd_reloc_undefined:
13020                   (*link_info->callbacks->undefined_symbol)
13021                     (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13022                      input_bfd, input_section, (*parent)->address, TRUE);
13023                   break;
13024                 case bfd_reloc_dangerous:
13025                   BFD_ASSERT (error_message != NULL);
13026                   (*link_info->callbacks->reloc_dangerous)
13027                     (link_info, error_message,
13028                      input_bfd, input_section, (*parent)->address);
13029                   break;
13030                 case bfd_reloc_overflow:
13031                   (*link_info->callbacks->reloc_overflow)
13032                     (link_info, NULL,
13033                      bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13034                      (*parent)->howto->name, (*parent)->addend,
13035                      input_bfd, input_section, (*parent)->address);
13036                   break;
13037                 case bfd_reloc_outofrange:
13038                   /* PR ld/13730:
13039                      This error can result when processing some partially
13040                      complete binaries.  Do not abort, but issue an error
13041                      message instead.  */
13042                   link_info->callbacks->einfo
13043                     /* xgettext:c-format */
13044                     (_("%X%P: %B(%A): relocation \"%R\" goes out of range\n"),
13045                      abfd, input_section, * parent);
13046                   goto error_return;
13047
13048                 default:
13049                   abort ();
13050                   break;
13051                 }
13052             }
13053         }
13054     }
13055
13056   free (reloc_vector);
13057   return data;
13058
13059 error_return:
13060   free (reloc_vector);
13061   return NULL;
13062 }
13063 \f
13064 /* Link-time IFC relaxation.
13065    In this optimization, we chains jump instructions
13066    of the same destination with ifcall.  */
13067
13068
13069 /* List to save jal and j relocation.  */
13070 struct elf_nds32_ifc_symbol_entry
13071 {
13072   asection *sec;
13073   struct elf_link_hash_entry *h;
13074   struct elf_nds32_ifc_irel_list *irel_head;
13075   unsigned long insn;
13076   int times;
13077   int enable;           /* Apply ifc.  */
13078   int ex9_enable;       /* Apply ifc after ex9.  */
13079   struct elf_nds32_ifc_symbol_entry *next;
13080 };
13081
13082 struct elf_nds32_ifc_irel_list
13083 {
13084   Elf_Internal_Rela *irel;
13085   asection *sec;
13086   bfd_vma addr;
13087   /* If this is set, then it is the last instruction for
13088      ifc-chain, so it must be keep for the actual branching.  */
13089   int keep;
13090   struct elf_nds32_ifc_irel_list *next;
13091 };
13092
13093 static struct elf_nds32_ifc_symbol_entry *ifc_symbol_head = NULL;
13094
13095 /* Insert symbol of jal and j for ifc.  */
13096
13097 static void
13098 nds32_elf_ifc_insert_symbol (asection *sec,
13099                              struct elf_link_hash_entry *h,
13100                              Elf_Internal_Rela *irel,
13101                              unsigned long insn)
13102 {
13103   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13104
13105   /* Check there is target of existing entry the same as the new one.  */
13106   while (ptr != NULL)
13107     {
13108       if (((h == NULL && ptr->sec == sec
13109             && ELF32_R_SYM (ptr->irel_head->irel->r_info) == ELF32_R_SYM (irel->r_info)
13110             && ptr->irel_head->irel->r_addend == irel->r_addend)
13111            || h != NULL)
13112           && ptr->h == h
13113           && ptr->insn == insn)
13114         {
13115           /* The same target exist, so insert into list.  */
13116           struct elf_nds32_ifc_irel_list *irel_list = ptr->irel_head;
13117
13118           while (irel_list->next != NULL)
13119             irel_list = irel_list->next;
13120           irel_list->next = bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list));
13121           irel_list = irel_list->next;
13122           irel_list->irel = irel;
13123           irel_list->keep = 1;
13124
13125           if (h == NULL)
13126             irel_list->sec = NULL;
13127           else
13128             irel_list->sec = sec;
13129           irel_list->next = NULL;
13130           return;
13131         }
13132       if (ptr->next == NULL)
13133         break;
13134       ptr = ptr->next;
13135     }
13136
13137   /* There is no same target entry, so build a new one.  */
13138   if (ifc_symbol_head == NULL)
13139     {
13140       ifc_symbol_head = bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry));
13141       ptr = ifc_symbol_head;
13142     }
13143   else
13144     {
13145       ptr->next = bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry));
13146       ptr = ptr->next;
13147     }
13148
13149   ptr->h = h;
13150   ptr->irel_head = bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list));
13151   ptr->irel_head->irel = irel;
13152   ptr->insn = insn;
13153   ptr->irel_head->keep = 1;
13154
13155   if (h == NULL)
13156     {
13157       /* Local symbols.  */
13158       ptr->sec = sec;
13159       ptr->irel_head->sec = NULL;
13160     }
13161   else
13162     {
13163       /* Global symbol.  */
13164       ptr->sec = NULL;
13165       ptr->irel_head->sec = sec;
13166     }
13167
13168   ptr->irel_head->next = NULL;
13169   ptr->times = 0;
13170   ptr->enable = 0;
13171   ptr->ex9_enable = 0;
13172   ptr->next = NULL;
13173 }
13174
13175 /* Gather all jal and j instructions.  */
13176
13177 static bfd_boolean
13178 nds32_elf_ifc_calc (struct bfd_link_info *info,
13179                     bfd *abfd, asection *sec)
13180 {
13181   Elf_Internal_Rela *internal_relocs;
13182   Elf_Internal_Rela *irelend;
13183   Elf_Internal_Rela *irel;
13184   Elf_Internal_Shdr *symtab_hdr;
13185   bfd_byte *contents = NULL;
13186   uint32_t insn, insn_with_reg;
13187   unsigned long r_symndx;
13188   struct elf_link_hash_entry *h;
13189   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
13190   struct elf_nds32_link_hash_table *table;
13191   bfd_boolean ifc_loop_aware;
13192
13193   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
13194                                                TRUE /* keep_memory */);
13195   irelend = internal_relocs + sec->reloc_count;
13196   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13197
13198   /* Check if the object enable ifc.  */
13199   irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend,
13200                                  R_NDS32_RELAX_ENTRY);
13201
13202   if (irel == NULL
13203       || irel >= irelend
13204       || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
13205       || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
13206           && !(irel->r_addend & R_NDS32_RELAX_ENTRY_IFC_FLAG)))
13207     return TRUE;
13208
13209   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
13210     return FALSE;
13211
13212   table = nds32_elf_hash_table (info);
13213   ifc_loop_aware = table->ifc_loop_aware;
13214   while (irel != NULL && irel < irelend)
13215     {
13216       /* Traverse all relocation and gather all of them to build the list.  */
13217
13218       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN)
13219         {
13220           if (ifc_loop_aware == 1
13221               && (irel->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG) != 0)
13222             {
13223               /* Check the region if loop or not.  If it is true and
13224                  ifc-loop-aware is true, ignore the region till region end.  */
13225               while (irel != NULL
13226                      && irel < irelend
13227                      && (ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_END
13228                          || (irel->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG) != 0))
13229                 irel++;
13230             }
13231         }
13232
13233       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA)
13234         {
13235           insn = bfd_getb32 (contents + irel->r_offset);
13236           nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
13237           r_symndx = ELF32_R_SYM (irel->r_info);
13238           if (r_symndx < symtab_hdr->sh_info)
13239             {
13240               /* Local symbol.  */
13241               nds32_elf_ifc_insert_symbol (sec, NULL, irel, insn_with_reg);
13242             }
13243           else
13244             {
13245               /* External symbol.  */
13246               h = sym_hashes[r_symndx - symtab_hdr->sh_info];
13247               nds32_elf_ifc_insert_symbol (sec, h, irel, insn_with_reg);
13248             }
13249         }
13250       irel++;
13251     }
13252   return TRUE;
13253 }
13254
13255 /* Determine whether j and jal should be substituted.  */
13256
13257 static void
13258 nds32_elf_ifc_filter (struct bfd_link_info *info)
13259 {
13260   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13261   struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13262   struct elf_nds32_ifc_irel_list *irel_keeper = NULL;
13263   struct elf_nds32_link_hash_table *table;
13264   int target_optimize;
13265   bfd_vma address;
13266
13267   table = nds32_elf_hash_table (info);
13268   target_optimize = table->target_optimize;
13269   while (ptr)
13270     {
13271       irel_ptr = ptr->irel_head;
13272       if (ptr->h == NULL)
13273         {
13274           /* Local symbol.  */
13275           irel_keeper = irel_ptr;
13276           while (irel_ptr && irel_ptr->next)
13277             {
13278               /* Check there is jump target can be used.  */
13279               if ((irel_ptr->next->irel->r_offset
13280                    - irel_keeper->irel->r_offset) > 1022)
13281                 irel_keeper = irel_ptr->next;
13282               else
13283                 {
13284                   ptr->enable = 1;
13285                   irel_ptr->keep = 0;
13286                 }
13287               irel_ptr = irel_ptr->next;
13288             }
13289         }
13290       else
13291         {
13292           /* Global symbol.  */
13293           /* We have to get the absolute address and decide
13294              whether to keep it or not.  */
13295           while (irel_ptr)
13296             {
13297               address = (irel_ptr->irel->r_offset
13298                          + irel_ptr->sec->output_section->vma
13299                          + irel_ptr->sec->output_offset);
13300               irel_ptr->addr = address;
13301               irel_ptr = irel_ptr->next;
13302             }
13303
13304           irel_ptr = ptr->irel_head;
13305           while (irel_ptr)
13306             {
13307               /* Sort by address.  */
13308               struct elf_nds32_ifc_irel_list *irel_dest = irel_ptr;
13309               struct elf_nds32_ifc_irel_list *irel_temp = irel_ptr;
13310               struct elf_nds32_ifc_irel_list *irel_ptr_prev = NULL;
13311               struct elf_nds32_ifc_irel_list *irel_dest_prev = NULL;
13312
13313               /* Get the smallest one.  */
13314               while (irel_temp->next)
13315                 {
13316                   if (irel_temp->next->addr < irel_dest->addr)
13317                     {
13318                       irel_dest_prev = irel_temp;
13319                       irel_dest = irel_temp->next;
13320                     }
13321                   irel_temp = irel_temp->next;
13322                 }
13323
13324               if (irel_dest != irel_ptr)
13325                 {
13326                   if (irel_ptr_prev)
13327                     irel_ptr_prev->next = irel_dest;
13328                   if (irel_dest_prev)
13329                     irel_dest_prev->next = irel_ptr;
13330                   irel_temp = irel_ptr->next;
13331                   irel_ptr->next = irel_dest->next;
13332                   irel_dest->next = irel_temp;
13333                 }
13334               irel_ptr_prev = irel_ptr;
13335               irel_ptr = irel_ptr->next;
13336             }
13337
13338           irel_ptr = ptr->irel_head;
13339           irel_keeper = irel_ptr;
13340           while (irel_ptr && irel_ptr->next)
13341             {
13342               if ((irel_ptr->next->addr - irel_keeper->addr) > 1022)
13343                 irel_keeper = irel_ptr->next;
13344               else
13345                 {
13346                   ptr->enable = 1;
13347                   irel_ptr->keep = 0;
13348                 }
13349               irel_ptr = irel_ptr->next;
13350             }
13351         }
13352
13353         /* Ex9 enable.  Reserve it for ex9.  */
13354       if ((target_optimize & NDS32_RELAX_EX9_ON)
13355           && ptr->irel_head != irel_keeper)
13356         ptr->enable = 0;
13357       ptr = ptr->next;
13358     }
13359 }
13360
13361 /* Determine whether j and jal should be substituted after ex9 done.  */
13362
13363 static void
13364 nds32_elf_ifc_filter_after_ex9 (void)
13365 {
13366   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13367   struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13368
13369   while (ptr)
13370     {
13371       if (ptr->enable == 0)
13372         {
13373           /* Check whether ifc is applied or not.  */
13374           irel_ptr = ptr->irel_head;
13375           ptr->ex9_enable = 1;
13376           while (irel_ptr)
13377             {
13378               if (ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_TRAN)
13379                 {
13380                   /* Ex9 already.  */
13381                   ptr->ex9_enable = 0;
13382                   break;
13383                 }
13384               irel_ptr = irel_ptr->next;
13385             }
13386         }
13387       ptr = ptr->next;
13388     }
13389 }
13390
13391 /* Wrapper to do ifc relaxation.  */
13392
13393 bfd_boolean
13394 nds32_elf_ifc_finish (struct bfd_link_info *info)
13395 {
13396   int relax_status;
13397   struct elf_nds32_link_hash_table *table;
13398
13399   table = nds32_elf_hash_table (info);
13400   relax_status = table->relax_status;
13401
13402   if (!(relax_status & NDS32_RELAX_JUMP_IFC_DONE))
13403     nds32_elf_ifc_filter (info);
13404   else
13405     nds32_elf_ifc_filter_after_ex9 ();
13406
13407   if (!nds32_elf_ifc_replace (info))
13408     return FALSE;
13409
13410   if (table)
13411     table->relax_status |= NDS32_RELAX_JUMP_IFC_DONE;
13412   return TRUE;
13413 }
13414
13415 /* Traverse the result of ifc filter and replace it with ifcall9.  */
13416
13417 static bfd_boolean
13418 nds32_elf_ifc_replace (struct bfd_link_info *info)
13419 {
13420   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13421   struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13422   nds32_elf_blank_t *relax_blank_list = NULL;
13423   bfd_byte *contents = NULL;
13424   Elf_Internal_Rela *internal_relocs;
13425   Elf_Internal_Rela *irel;
13426   Elf_Internal_Rela *irelend;
13427   unsigned short insn16 = INSN_IFCALL9;
13428   struct elf_nds32_link_hash_table *table;
13429   int relax_status;
13430
13431   table = nds32_elf_hash_table (info);
13432   relax_status = table->relax_status;
13433
13434   while (ptr)
13435     {
13436       /* Traverse the ifc gather list, and replace the
13437          filter entries by ifcall9.  */
13438       if ((!(relax_status & NDS32_RELAX_JUMP_IFC_DONE) && ptr->enable == 1)
13439           || ((relax_status & NDS32_RELAX_JUMP_IFC_DONE)
13440               && ptr->ex9_enable == 1))
13441         {
13442           irel_ptr = ptr->irel_head;
13443           if (ptr->h == NULL)
13444             {
13445               /* Local symbol.  */
13446               internal_relocs = _bfd_elf_link_read_relocs
13447                 (ptr->sec->owner, ptr->sec, NULL, NULL, TRUE /* keep_memory */);
13448               irelend = internal_relocs + ptr->sec->reloc_count;
13449
13450               if (!nds32_get_section_contents (ptr->sec->owner, ptr->sec,
13451                                                &contents, TRUE))
13452                 return FALSE;
13453
13454               while (irel_ptr)
13455                 {
13456                   if (irel_ptr->keep == 0 && irel_ptr->next)
13457                     {
13458                       /* The one can be replaced.  We have to check whether
13459                          there is any alignment point in the region.  */
13460                       irel = irel_ptr->irel;
13461                       while (((irel_ptr->next->keep == 0
13462                                && irel < irel_ptr->next->irel)
13463                               || (irel_ptr->next->keep == 1 && irel < irelend))
13464                              && !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13465                                   && (irel->r_addend & 0x1f) == 2))
13466                         irel++;
13467                       if (irel >= irelend
13468                           || !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13469                                && (irel->r_addend & 0x1f) == 2
13470                                && ((irel->r_offset - get_nds32_elf_blank_total
13471                                     (&relax_blank_list, irel->r_offset, 1))
13472                                    & 0x02) == 0))
13473                         {
13474                           /* Replace by ifcall9.  */
13475                           bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13476                           if (!insert_nds32_elf_blank_recalc_total
13477                               (&relax_blank_list, irel_ptr->irel->r_offset + 2, 2))
13478                             return FALSE;
13479                           irel_ptr->irel->r_info =
13480                             ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13481                                           R_NDS32_10IFCU_PCREL_RELA);
13482                         }
13483                     }
13484                   irel_ptr = irel_ptr->next;
13485                 }
13486
13487               /* Delete the redundant code.  */
13488               if (relax_blank_list)
13489                 {
13490                   nds32_elf_relax_delete_blanks (ptr->sec->owner, ptr->sec,
13491                                                  relax_blank_list);
13492                   relax_blank_list = NULL;
13493                 }
13494             }
13495           else
13496             {
13497               /* Global symbol.  */
13498               while (irel_ptr)
13499                 {
13500                   if (irel_ptr->keep == 0 && irel_ptr->next)
13501                     {
13502                       /* The one can be replaced, and we have to check
13503                          whether there is any alignment point in the region.  */
13504                       internal_relocs = _bfd_elf_link_read_relocs
13505                         (irel_ptr->sec->owner, irel_ptr->sec, NULL, NULL,
13506                          TRUE /* keep_memory */);
13507                       irelend = internal_relocs + irel_ptr->sec->reloc_count;
13508                       if (!nds32_get_section_contents (irel_ptr->sec->owner,
13509                                                        irel_ptr->sec, &contents,
13510                                                        TRUE))
13511                         return FALSE;
13512
13513                       irel = irel_ptr->irel;
13514                       while (((irel_ptr->sec == irel_ptr->next->sec
13515                                && irel_ptr->next->keep == 0
13516                                && irel < irel_ptr->next->irel)
13517                               || ((irel_ptr->sec != irel_ptr->next->sec
13518                                    || irel_ptr->next->keep == 1)
13519                                   && irel < irelend))
13520                              && !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13521                                   && (irel->r_addend & 0x1f) == 2))
13522                         irel++;
13523                       if (irel >= irelend
13524                           || !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13525                                && (irel->r_addend & 0x1f) == 2
13526                                && ((irel->r_offset
13527                                     - get_nds32_elf_blank_total (&relax_blank_list,
13528                                                             irel->r_offset, 1)) & 0x02) == 0))
13529                         {
13530                           /* Replace by ifcall9.  */
13531                           bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13532                           if (!insert_nds32_elf_blank_recalc_total
13533                               (&relax_blank_list, irel_ptr->irel->r_offset + 2, 2))
13534                             return FALSE;
13535
13536                           /* Delete the redundant code, and clear the relocation.  */
13537                           nds32_elf_relax_delete_blanks (irel_ptr->sec->owner,
13538                                                          irel_ptr->sec,
13539                                                          relax_blank_list);
13540                           irel_ptr->irel->r_info =
13541                             ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13542                                           R_NDS32_10IFCU_PCREL_RELA);
13543                           relax_blank_list = NULL;
13544                         }
13545                     }
13546
13547                   irel_ptr = irel_ptr->next;
13548                 }
13549             }
13550         }
13551       ptr = ptr->next;
13552     }
13553
13554   return TRUE;
13555 }
13556
13557 /* Relocate ifcall.  */
13558
13559 static bfd_boolean
13560 nds32_elf_ifc_reloc (void)
13561 {
13562   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13563   struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13564   struct elf_nds32_ifc_irel_list *irel_keeper = NULL;
13565   bfd_vma relocation, address;
13566   unsigned short insn16;
13567   bfd_byte *contents = NULL;
13568   static bfd_boolean done = FALSE;
13569
13570   if (done)
13571     return TRUE;
13572
13573   done = TRUE;
13574
13575   while (ptr)
13576     {
13577       /* Check the entry is enable ifcall.  */
13578       if (ptr->enable == 1 || ptr->ex9_enable == 1)
13579         {
13580           /* Get the reserve jump.  */
13581           irel_ptr = ptr->irel_head;
13582           while (irel_ptr)
13583             {
13584               if (irel_ptr->keep == 1)
13585                 {
13586                   irel_keeper = irel_ptr;
13587                   break;
13588                 }
13589               irel_ptr = irel_ptr->next;
13590             }
13591
13592           irel_ptr = ptr->irel_head;
13593           if (ptr->h == NULL)
13594             {
13595               /* Local symbol.  */
13596               if (!nds32_get_section_contents (ptr->sec->owner, ptr->sec,
13597                                                &contents, TRUE))
13598                 return FALSE;
13599
13600               while (irel_ptr)
13601                 {
13602                   if (irel_ptr->keep == 0
13603                       && ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
13604                     {
13605                       relocation = irel_keeper->irel->r_offset;
13606                       relocation = relocation - irel_ptr->irel->r_offset;
13607                       while (irel_keeper && relocation > 1022)
13608                         {
13609                           irel_keeper = irel_keeper->next;
13610                           if (irel_keeper && irel_keeper->keep == 1)
13611                             {
13612                               relocation = irel_keeper->irel->r_offset;
13613                               relocation = relocation - irel_ptr->irel->r_offset;
13614                             }
13615                         }
13616                       if (relocation > 1022)
13617                         {
13618                           /* Double check.  */
13619                           irel_keeper = ptr->irel_head;
13620                           while (irel_keeper)
13621                             {
13622                               if (irel_keeper->keep == 1)
13623                                 {
13624                                   relocation = irel_keeper->irel->r_offset;
13625                                   relocation = relocation - irel_ptr->irel->r_offset;
13626                                 }
13627                               if (relocation <= 1022)
13628                                 break;
13629                               irel_keeper = irel_keeper->next;
13630                             }
13631                           if (!irel_keeper)
13632                             return FALSE;
13633                         }
13634                       irel_ptr->irel->r_info =
13635                         ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13636                                       R_NDS32_NONE);
13637                       insn16 = INSN_IFCALL9 | (relocation >> 1);
13638                       bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13639                     }
13640                   irel_ptr = irel_ptr->next;
13641                 }
13642             }
13643           else
13644             {
13645               /* Global symbol.  */
13646               while (irel_ptr)
13647                 {
13648                   if (irel_ptr->keep == 0
13649                       && ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
13650                     {
13651                       /* Get the distance between ifcall and jump.  */
13652                       relocation = (irel_keeper->irel->r_offset
13653                                     + irel_keeper->sec->output_section->vma
13654                                     + irel_keeper->sec->output_offset);
13655                       address = (irel_ptr->irel->r_offset
13656                                  + irel_ptr->sec->output_section->vma
13657                                  + irel_ptr->sec->output_offset);
13658                       relocation = relocation - address;
13659
13660                       /* The distance is over ragne, find callee again.  */
13661                       while (irel_keeper && relocation > 1022)
13662                         {
13663                           irel_keeper = irel_keeper->next;
13664                           if (irel_keeper && irel_keeper->keep ==1)
13665                             {
13666                               relocation = (irel_keeper->irel->r_offset
13667                                             + irel_keeper->sec->output_section->vma
13668                                             + irel_keeper->sec->output_offset);
13669                               relocation = relocation - address;
13670                             }
13671                         }
13672
13673                       if (relocation > 1022)
13674                         {
13675                           /* Double check.  */
13676                           irel_keeper = ptr->irel_head;
13677                           while (irel_keeper)
13678                             {
13679                               if (irel_keeper->keep == 1)
13680                                 {
13681
13682                                   relocation = (irel_keeper->irel->r_offset
13683                                                 + irel_keeper->sec->output_section->vma
13684                                                 + irel_keeper->sec->output_offset);
13685                                   relocation = relocation - address;
13686                                 }
13687                               if (relocation <= 1022)
13688                                 break;
13689                               irel_keeper = irel_keeper->next;
13690                             }
13691                           if (!irel_keeper)
13692                             return FALSE;
13693                         }
13694                       if (!nds32_get_section_contents
13695                           (irel_ptr->sec->owner, irel_ptr->sec, &contents, TRUE))
13696                         return FALSE;
13697                       insn16 = INSN_IFCALL9 | (relocation >> 1);
13698                       bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13699                       irel_ptr->irel->r_info =
13700                         ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13701                                       R_NDS32_NONE);
13702                     }
13703                   irel_ptr =irel_ptr->next;
13704                 }
13705             }
13706         }
13707       ptr = ptr->next;
13708     }
13709
13710   return TRUE;
13711 }
13712
13713 /* End of IFC relaxation.  */
13714 \f
13715 /* EX9 Instruction Table Relaxation.  */
13716
13717 /* Global hash list.  */
13718 struct elf_link_hash_entry_list
13719 {
13720   struct elf_link_hash_entry *h;
13721   struct elf_link_hash_entry_list *next;
13722 };
13723
13724 /* Save different destination but same insn.  */
13725 struct elf_link_hash_entry_mul_list
13726 {
13727   /* Global symbol times.  */
13728   int times;
13729   /* Save relocation for each global symbol but useful??  */
13730   Elf_Internal_Rela *irel;
13731   /* For sethi, two sethi may have the same high-part but different low-parts.  */
13732   Elf_Internal_Rela rel_backup;
13733   struct elf_link_hash_entry_list *h_list;
13734   struct elf_link_hash_entry_mul_list *next;
13735 };
13736
13737 /* Instruction hash table.  */
13738 struct elf_nds32_code_hash_entry
13739 {
13740   struct bfd_hash_entry root;
13741   int times;
13742   /* For insn that can use relocation or constant ex: sethi.  */
13743   int const_insn;
13744   asection *sec;
13745   struct elf_link_hash_entry_mul_list *m_list;
13746   /* Using r_addend.  */
13747   Elf_Internal_Rela *irel;
13748   /* Using r_info.  */
13749   Elf_Internal_Rela rel_backup;
13750 };
13751
13752 /* Instruction count list.  */
13753 struct elf_nds32_insn_times_entry
13754 {
13755   const char *string;
13756   int times;
13757   int order;
13758   asection *sec;
13759   struct elf_link_hash_entry_mul_list *m_list;
13760   Elf_Internal_Rela *irel;
13761   Elf_Internal_Rela rel_backup;
13762   struct elf_nds32_insn_times_entry *next;
13763 };
13764
13765 /* J and JAL symbol list.  */
13766 struct elf_nds32_symbol_entry
13767 {
13768   char *string;
13769   unsigned long insn;
13770   struct elf_nds32_symbol_entry *next;
13771 };
13772
13773 /* Relocation list.  */
13774 struct elf_nds32_irel_entry
13775 {
13776   Elf_Internal_Rela *irel;
13777   struct elf_nds32_irel_entry *next;
13778 };
13779
13780 /* ex9.it insn need to be fixed.  */
13781 struct elf_nds32_ex9_refix
13782 {
13783   Elf_Internal_Rela *irel;
13784   asection *sec;
13785   struct elf_link_hash_entry *h;
13786   int order;
13787   struct elf_nds32_ex9_refix *next;
13788 };
13789
13790 static struct bfd_hash_table ex9_code_table;
13791 static struct elf_nds32_insn_times_entry *ex9_insn_head = NULL;
13792 static struct elf_nds32_ex9_refix *ex9_refix_head = NULL;
13793
13794 /* EX9 hash function.  */
13795
13796 static struct bfd_hash_entry *
13797 nds32_elf_code_hash_newfunc (struct bfd_hash_entry *entry,
13798                              struct bfd_hash_table *table,
13799                              const char *string)
13800 {
13801   struct elf_nds32_code_hash_entry *ret;
13802
13803   /* Allocate the structure if it has not already been allocated by a
13804      subclass.  */
13805   if (entry == NULL)
13806     {
13807       entry = (struct bfd_hash_entry *)
13808         bfd_hash_allocate (table, sizeof (*ret));
13809       if (entry == NULL)
13810         return entry;
13811     }
13812
13813   /* Call the allocation method of the superclass.  */
13814   entry = bfd_hash_newfunc (entry, table, string);
13815   if (entry == NULL)
13816     return entry;
13817
13818   ret = (struct elf_nds32_code_hash_entry*) entry;
13819   ret->times = 0;
13820   ret->const_insn = 0;
13821   ret->m_list = NULL;
13822   ret->sec = NULL;
13823   ret->irel = NULL;
13824   return &ret->root;
13825 }
13826
13827 /* Insert ex9 entry
13828    this insert must be stable sorted by times.  */
13829
13830 static void
13831 nds32_elf_ex9_insert_entry (struct elf_nds32_insn_times_entry *ptr)
13832 {
13833   struct elf_nds32_insn_times_entry *temp;
13834   struct elf_nds32_insn_times_entry *temp2;
13835
13836   if (ex9_insn_head == NULL)
13837     {
13838       ex9_insn_head = ptr;
13839       ptr->next = NULL;
13840     }
13841   else
13842     {
13843       temp = ex9_insn_head;
13844       temp2 = ex9_insn_head;
13845       while (temp->next &&
13846              (temp->next->times >= ptr->times
13847               || temp->times == -1))
13848         {
13849           if (temp->times == -1)
13850             temp2 = temp;
13851           temp = temp->next;
13852         }
13853       if (ptr->times > temp->times && temp->times != -1)
13854         {
13855           ptr->next = temp;
13856           if (temp2->times == -1)
13857             temp2->next = ptr;
13858           else
13859             ex9_insn_head = ptr;
13860         }
13861       else if (temp->next == NULL)
13862         {
13863           temp->next = ptr;
13864           ptr->next = NULL;
13865         }
13866       else
13867         {
13868           ptr->next = temp->next;
13869           temp->next = ptr;
13870         }
13871     }
13872 }
13873
13874 /* Examine each insn times in hash table.
13875    Handle multi-link hash entry.
13876
13877    TODO: This function doesn't assign so much info since it is fake.  */
13878
13879 static int
13880 nds32_elf_examine_insn_times (struct elf_nds32_code_hash_entry *h)
13881 {
13882   struct elf_nds32_insn_times_entry *ptr;
13883   int times;
13884
13885   if (h->m_list == NULL)
13886     {
13887       /* Local symbol insn or insn without relocation.  */
13888       if (h->times < 3)
13889         return TRUE;
13890
13891       ptr = (struct elf_nds32_insn_times_entry *)
13892         bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13893       ptr->times = h->times;
13894       ptr->string = h->root.string;
13895       ptr->m_list = NULL;
13896       ptr->sec = h->sec;
13897       ptr->irel = h->irel;
13898       ptr->rel_backup = h->rel_backup;
13899       nds32_elf_ex9_insert_entry (ptr);
13900     }
13901   else
13902     {
13903       /* Global symbol insn.  */
13904       /* Only sethi insn has multiple m_list.  */
13905       struct elf_link_hash_entry_mul_list *m_list = h->m_list;
13906
13907       times = 0;
13908       while (m_list)
13909         {
13910           times += m_list->times;
13911           m_list = m_list->next;
13912         }
13913       if (times >= 3)
13914         {
13915           m_list = h->m_list;
13916           ptr = (struct elf_nds32_insn_times_entry *)
13917             bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13918           ptr->times = times; /* Use the total times.  */
13919           ptr->string = h->root.string;
13920           ptr->m_list = m_list;
13921           ptr->sec = h->sec;
13922           ptr->irel = m_list->irel;
13923           ptr->rel_backup = m_list->rel_backup;
13924           nds32_elf_ex9_insert_entry (ptr);
13925         }
13926       if (h->const_insn == 1)
13927         {
13928           /* sethi with constant value.  */
13929           if (h->times < 3)
13930             return TRUE;
13931
13932           ptr = (struct elf_nds32_insn_times_entry *)
13933             bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13934           ptr->times = h->times;
13935           ptr->string = h->root.string;
13936           ptr->m_list = NULL;
13937           ptr->sec = NULL;
13938           ptr->irel = NULL;
13939           ptr->rel_backup = h->rel_backup;
13940           nds32_elf_ex9_insert_entry (ptr);
13941         }
13942     }
13943   return TRUE;
13944 }
13945
13946 /* Count each insn times in hash table.
13947    Handle multi-link hash entry.  */
13948
13949 static int
13950 nds32_elf_count_insn_times (struct elf_nds32_code_hash_entry *h)
13951 {
13952   int reservation, times;
13953   unsigned long relocation, min_relocation;
13954   struct elf_nds32_insn_times_entry *ptr;
13955
13956   if (h->m_list == NULL)
13957     {
13958       /* Local symbol insn or insn without relocation.  */
13959       if (h->times < 3)
13960         return TRUE;
13961       ptr = (struct elf_nds32_insn_times_entry *)
13962         bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13963       ptr->times = h->times;
13964       ptr->string = h->root.string;
13965       ptr->m_list = NULL;
13966       ptr->sec = h->sec;
13967       ptr->irel = h->irel;
13968       ptr->rel_backup = h->rel_backup;
13969       nds32_elf_ex9_insert_entry (ptr);
13970     }
13971   else
13972     {
13973       /* Global symbol insn.  */
13974       /* Only sethi insn has multiple m_list.  */
13975       struct elf_link_hash_entry_mul_list *m_list = h->m_list;
13976
13977       if (ELF32_R_TYPE (m_list->rel_backup.r_info) == R_NDS32_HI20_RELA
13978           && m_list->next != NULL)
13979         {
13980           /* Sethi insn has different symbol or addend but has same hi20.  */
13981           times = 0;
13982           reservation = 1;
13983           relocation = 0;
13984           min_relocation = 0xffffffff;
13985           while (m_list)
13986             {
13987               /* Get the minimum sethi address
13988                  and calculate how many entry the sethi-list have to use.  */
13989               if ((m_list->h_list->h->root.type == bfd_link_hash_defined
13990                    || m_list->h_list->h->root.type == bfd_link_hash_defweak)
13991                   && (m_list->h_list->h->root.u.def.section != NULL
13992                       && m_list->h_list->h->root.u.def.section->output_section != NULL))
13993                 {
13994                   relocation = (m_list->h_list->h->root.u.def.value +
13995                                 m_list->h_list->h->root.u.def.section->output_section->vma +
13996                                 m_list->h_list->h->root.u.def.section->output_offset);
13997                   relocation += m_list->irel->r_addend;
13998                 }
13999               else
14000                 relocation = 0;
14001               if (relocation < min_relocation)
14002                 min_relocation = relocation;
14003               times += m_list->times;
14004               m_list = m_list->next;
14005             }
14006           if (min_relocation < ex9_relax_size)
14007             reservation = (min_relocation >> 12) + 1;
14008           else
14009             reservation = (min_relocation >> 12)
14010                           - ((min_relocation - ex9_relax_size) >> 12) + 1;
14011           if (reservation < (times / 3))
14012             {
14013               /* Efficient enough to use ex9.  */
14014               int i;
14015
14016               for (i = reservation ; i > 0; i--)
14017                 {
14018                   /* Allocate number of reservation ex9 entry.  */
14019                   ptr = (struct elf_nds32_insn_times_entry *)
14020                     bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
14021                   ptr->times = h->m_list->times / reservation;
14022                   ptr->string = h->root.string;
14023                   ptr->m_list = h->m_list;
14024                   ptr->sec = h->sec;
14025                   ptr->irel = h->m_list->irel;
14026                   ptr->rel_backup = h->m_list->rel_backup;
14027                   nds32_elf_ex9_insert_entry (ptr);
14028                 }
14029             }
14030         }
14031       else
14032         {
14033           /* Normal global symbol that means no different address symbol
14034              using same ex9 entry.  */
14035           if (m_list->times >= 3)
14036             {
14037               ptr = (struct elf_nds32_insn_times_entry *)
14038                 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
14039               ptr->times = m_list->times;
14040               ptr->string = h->root.string;
14041               ptr->m_list = h->m_list;
14042               ptr->sec = h->sec;
14043               ptr->irel = h->m_list->irel;
14044               ptr->rel_backup = h->m_list->rel_backup;
14045               nds32_elf_ex9_insert_entry (ptr);
14046             }
14047         }
14048
14049       if (h->const_insn == 1)
14050         {
14051           /* sethi with constant value.  */
14052           if (h->times < 3)
14053             return TRUE;
14054
14055           ptr = (struct elf_nds32_insn_times_entry *)
14056             bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
14057           ptr->times = h->times;
14058           ptr->string = h->root.string;
14059           ptr->m_list = NULL;
14060           ptr->sec = NULL;
14061           ptr->irel = NULL;
14062           ptr->rel_backup = h->rel_backup;
14063           nds32_elf_ex9_insert_entry (ptr);
14064         }
14065     }
14066
14067   return TRUE;
14068 }
14069
14070 /* Hash table traverse function.  */
14071
14072 static void
14073 nds32_elf_code_hash_traverse (int (*func) (struct elf_nds32_code_hash_entry*))
14074 {
14075   unsigned int i;
14076
14077   ex9_code_table.frozen = 1;
14078   for (i = 0; i < ex9_code_table.size; i++)
14079     {
14080       struct bfd_hash_entry *p;
14081
14082       for (p = ex9_code_table.table[i]; p != NULL; p = p->next)
14083         if (!func ((struct elf_nds32_code_hash_entry *) p))
14084           goto out;
14085     }
14086 out:
14087   ex9_code_table.frozen = 0;
14088 }
14089
14090
14091 /* Give order number to insn list.  */
14092
14093 static void
14094 nds32_elf_order_insn_times (struct bfd_link_info *info)
14095 {
14096   struct elf_nds32_insn_times_entry *ex9_insn;
14097   struct elf_nds32_insn_times_entry *temp = NULL;
14098   struct elf_nds32_link_hash_table *table;
14099   int ex9_limit;
14100   int number = 0;
14101
14102   if (ex9_insn_head == NULL)
14103     return;
14104
14105 /* The max number of entries is 512.  */
14106   ex9_insn = ex9_insn_head;
14107   table = nds32_elf_hash_table (info);
14108   ex9_limit = table->ex9_limit;
14109
14110   ex9_insn = ex9_insn_head;
14111
14112   while (ex9_insn != NULL && number < ex9_limit)
14113     {
14114       ex9_insn->order = number;
14115       number++;
14116       temp = ex9_insn;
14117       ex9_insn = ex9_insn->next;
14118     }
14119
14120   if (ex9_insn && temp)
14121     temp->next = NULL;
14122
14123   while (ex9_insn != NULL)
14124     {
14125       /* Free useless entry.  */
14126       temp = ex9_insn;
14127       ex9_insn = ex9_insn->next;
14128       free (temp);
14129     }
14130 }
14131
14132 /* Build .ex9.itable section.  */
14133
14134 static void
14135 nds32_elf_ex9_build_itable (struct bfd_link_info *link_info)
14136 {
14137   asection *table_sec;
14138   struct elf_nds32_insn_times_entry *ptr;
14139   bfd *it_abfd;
14140   int number = 0;
14141   bfd_byte *contents = NULL;
14142
14143   for (it_abfd = link_info->input_bfds; it_abfd != NULL;
14144        it_abfd = it_abfd->link.next)
14145     {
14146       /* Find the section .ex9.itable, and put all entries into it.  */
14147       table_sec = bfd_get_section_by_name (it_abfd, ".ex9.itable");
14148       if (table_sec != NULL)
14149         {
14150           if (!nds32_get_section_contents (it_abfd, table_sec, &contents, TRUE))
14151             return;
14152
14153           for (ptr = ex9_insn_head; ptr !=NULL ; ptr = ptr->next)
14154             number++;
14155
14156           table_sec->size = number * 4;
14157
14158           if (number == 0)
14159             return;
14160
14161           elf_elfheader (link_info->output_bfd)->e_flags |= E_NDS32_HAS_EX9_INST;
14162           number = 0;
14163           for (ptr = ex9_insn_head; ptr !=NULL ; ptr = ptr->next)
14164             {
14165               long val;
14166
14167               val = strtol (ptr->string, NULL, 16);
14168               bfd_putb32 ((bfd_vma) val, (char *) contents + (number * 4));
14169               number++;
14170             }
14171           break;
14172         }
14173     }
14174 }
14175
14176 /* Get insn with regs according to relocation type.  */
14177
14178 static void
14179 nds32_elf_get_insn_with_reg (Elf_Internal_Rela *irel,
14180                              uint32_t insn, uint32_t *insn_with_reg)
14181 {
14182   reloc_howto_type *howto = NULL;
14183
14184   if (irel == NULL
14185       || (ELF32_R_TYPE (irel->r_info) >= (int) ARRAY_SIZE (nds32_elf_howto_table)
14186           && (ELF32_R_TYPE (irel->r_info) - R_NDS32_RELAX_ENTRY)
14187              >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table)))
14188     {
14189       *insn_with_reg = insn;
14190       return;
14191     }
14192
14193   howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
14194   *insn_with_reg = insn & (0xffffffff ^ howto->dst_mask);
14195 }
14196
14197 /* Mask number of address bits according to relocation.  */
14198
14199 static unsigned long
14200 nds32_elf_irel_mask (Elf_Internal_Rela *irel)
14201 {
14202   reloc_howto_type *howto = NULL;
14203
14204   if (irel == NULL
14205       || (ELF32_R_TYPE (irel->r_info) >= (int) ARRAY_SIZE (nds32_elf_howto_table)
14206           && (ELF32_R_TYPE (irel->r_info) - R_NDS32_RELAX_ENTRY)
14207              >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table)))
14208     return 0;
14209
14210   howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
14211   return howto->dst_mask;
14212 }
14213
14214 static void
14215 nds32_elf_insert_irel_entry (struct elf_nds32_irel_entry **irel_list,
14216                              struct elf_nds32_irel_entry *irel_ptr)
14217 {
14218   if (*irel_list == NULL)
14219     {
14220       *irel_list = irel_ptr;
14221       irel_ptr->next = NULL;
14222     }
14223   else
14224     {
14225       irel_ptr->next = *irel_list;
14226       *irel_list = irel_ptr;
14227     }
14228 }
14229
14230 static void
14231 nds32_elf_ex9_insert_fix (asection * sec, Elf_Internal_Rela * irel,
14232                           struct elf_link_hash_entry *h, int order)
14233 {
14234   struct elf_nds32_ex9_refix *ptr;
14235
14236   ptr = bfd_malloc (sizeof (struct elf_nds32_ex9_refix));
14237   ptr->sec = sec;
14238   ptr->irel = irel;
14239   ptr->h = h;
14240   ptr->order = order;
14241   ptr->next = NULL;
14242
14243   if (ex9_refix_head == NULL)
14244     ex9_refix_head = ptr;
14245   else
14246     {
14247       struct elf_nds32_ex9_refix *temp = ex9_refix_head;
14248
14249       while (temp->next != NULL)
14250         temp = temp->next;
14251       temp->next = ptr;
14252     }
14253 }
14254
14255 enum
14256 {
14257   DATA_EXIST = 1,
14258   CLEAN_PRE = 1 << 1,
14259   PUSH_PRE = 1 << 2
14260 };
14261
14262 /* Check relocation type if supporting for ex9.  */
14263
14264 static int
14265 nds32_elf_ex9_relocation_check (struct bfd_link_info *info,
14266                                 Elf_Internal_Rela **irel,
14267                                 Elf_Internal_Rela *irelend,
14268                                 nds32_elf_blank_t *relax_blank_list,
14269                                 asection *sec,bfd_vma *off,
14270                                 bfd_byte *contents)
14271 {
14272   /* Suppress ex9 if `.no_relax ex9' or inner loop.  */
14273   bfd_boolean nested_ex9, nested_loop;
14274   bfd_boolean ex9_loop_aware;
14275   /* We use the highest 1 byte of result to record
14276      how many bytes location counter has to move.  */
14277   int result = 0;
14278   Elf_Internal_Rela *irel_save = NULL;
14279   struct elf_nds32_link_hash_table *table;
14280
14281   table = nds32_elf_hash_table (info);
14282   ex9_loop_aware = table->ex9_loop_aware;
14283
14284   while ((*irel) != NULL && (*irel) < irelend && *off == (*irel)->r_offset)
14285     {
14286       switch (ELF32_R_TYPE ((*irel)->r_info))
14287         {
14288         case R_NDS32_RELAX_REGION_BEGIN:
14289           /* Ignore code block.  */
14290           nested_ex9 = FALSE;
14291           nested_loop = FALSE;
14292           if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG)
14293               || (ex9_loop_aware
14294                   && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG)))
14295             {
14296               /* Check the region if loop or not.  If it is true and
14297                  ex9-loop-aware is true, ignore the region till region end.  */
14298               /* To save the status for in .no_relax ex9 region and
14299                  loop region to conform the block can do ex9 relaxation.  */
14300               nested_ex9 = ((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG);
14301               nested_loop = (ex9_loop_aware
14302                              && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG));
14303               while ((*irel) && (*irel) < irelend && (nested_ex9 || nested_loop))
14304                 {
14305                   (*irel)++;
14306                   if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_BEGIN)
14307                     {
14308                       /* There may be nested region.  */
14309                       if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG) != 0)
14310                         nested_ex9 = TRUE;
14311                       else if (ex9_loop_aware
14312                                && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))
14313                         nested_loop = TRUE;
14314                     }
14315                   else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_END)
14316                     {
14317                       /* The end of region.  */
14318                       if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG) != 0)
14319                         nested_ex9 = FALSE;
14320                       else if (ex9_loop_aware
14321                                && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))
14322                         nested_loop = FALSE;
14323                     }
14324                   else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_LABEL
14325                            && ((*irel)->r_addend & 0x1f) == 2)
14326                     {
14327                       /* Alignment exist in the region.  */
14328                       result |= CLEAN_PRE;
14329                       if (((*irel)->r_offset -
14330                            get_nds32_elf_blank_total (&relax_blank_list,
14331                                                       (*irel)->r_offset, 0)) & 0x02)
14332                         result |= PUSH_PRE;
14333                     }
14334                 }
14335               if ((*irel) >= irelend)
14336                 *off = sec->size;
14337               else
14338                 *off = (*irel)->r_offset;
14339
14340               /* The final instruction in the region, regard this one as data to ignore it.  */
14341               result |= DATA_EXIST;
14342               return result;
14343             }
14344           break;
14345
14346         case R_NDS32_LABEL:
14347           if (((*irel)->r_addend & 0x1f) == 2)
14348             {
14349               /* Check this point is align and decide to do ex9 or not.  */
14350               result |= CLEAN_PRE;
14351               if (((*irel)->r_offset -
14352                    get_nds32_elf_blank_total (&relax_blank_list,
14353                                               (*irel)->r_offset, 0)) & 0x02)
14354                 result |= PUSH_PRE;
14355             }
14356           break;
14357         case R_NDS32_32_RELA:
14358           /* Data.  */
14359           result |= (4 << 24);
14360           result |= DATA_EXIST;
14361           break;
14362         case R_NDS32_16_RELA:
14363           /* Data.  */
14364           result |= (2 << 24);
14365           result |= DATA_EXIST;
14366           break;
14367         case R_NDS32_DATA:
14368           /* Data.  */
14369           /* The least code alignment is 2.  If the data is only one byte,
14370              we have to shift one more byte.  */
14371           if ((*irel)->r_addend == 1)
14372             result |= ((*irel)->r_addend << 25) ;
14373           else
14374             result |= ((*irel)->r_addend << 24) ;
14375
14376           result |= DATA_EXIST;
14377           break;
14378
14379         case R_NDS32_25_PCREL_RELA:
14380         case R_NDS32_SDA16S3_RELA:
14381         case R_NDS32_SDA15S3_RELA:
14382         case R_NDS32_SDA15S3:
14383         case R_NDS32_SDA17S2_RELA:
14384         case R_NDS32_SDA15S2_RELA:
14385         case R_NDS32_SDA12S2_SP_RELA:
14386         case R_NDS32_SDA12S2_DP_RELA:
14387         case R_NDS32_SDA15S2:
14388         case R_NDS32_SDA18S1_RELA:
14389         case R_NDS32_SDA15S1_RELA:
14390         case R_NDS32_SDA15S1:
14391         case R_NDS32_SDA19S0_RELA:
14392         case R_NDS32_SDA15S0_RELA:
14393         case R_NDS32_SDA15S0:
14394         case R_NDS32_HI20_RELA:
14395         case R_NDS32_LO12S0_ORI_RELA:
14396         case R_NDS32_LO12S0_RELA:
14397         case R_NDS32_LO12S1_RELA:
14398         case R_NDS32_LO12S2_RELA:
14399           /* These relocation is supported ex9 relaxation currently.  */
14400           /* We have to save the relocation for using later, since we have
14401              to check there is any alignment in the same address.  */
14402           irel_save = *irel;
14403           break;
14404         default:
14405           /* Not support relocations.  */
14406           if (ELF32_R_TYPE ((*irel)->r_info) < ARRAY_SIZE (nds32_elf_howto_table)
14407               && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_NONE
14408               && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_INSN16)
14409             {
14410               /* Note: To optimize aggressively, it maybe can ignore R_NDS32_INSN16 here.
14411                  But we have to consider if there is any side-effect.  */
14412               if (!(result & DATA_EXIST))
14413                 {
14414                   /* We have to confirm there is no data relocation in the
14415                      same address.  In general case, this won't happen.  */
14416                   /* We have to do ex9 conservative, for those relocation not
14417                      considerd we ignore instruction.  */
14418                   result |= DATA_EXIST;
14419                   if (*(contents + *off) & 0x80)
14420                     result |= (2 << 24);
14421                   else
14422                     result |= (4 << 24);
14423                   break;
14424                 }
14425             }
14426         }
14427       if ((*irel) < irelend
14428           && ((*irel) + 1) < irelend
14429           && (*irel)->r_offset == ((*irel) + 1)->r_offset)
14430         /* There are relocations pointing to the same address, we have to
14431            check all of them.  */
14432         (*irel)++;
14433       else
14434         {
14435           if (irel_save)
14436             *irel = irel_save;
14437           return result;
14438         }
14439     }
14440   return result;
14441 }
14442
14443 /* Replace with ex9 instruction.  */
14444
14445 static bfd_boolean
14446 nds32_elf_ex9_push_insn (uint16_t insn16, bfd_byte *contents, bfd_vma pre_off,
14447                          nds32_elf_blank_t **relax_blank_list,
14448                          struct elf_nds32_irel_entry *pre_irel_ptr,
14449                          struct elf_nds32_irel_entry **irel_list)
14450 {
14451   if (insn16 != 0)
14452     {
14453       /* Implement the ex9 relaxation.  */
14454       bfd_putb16 (insn16, contents + pre_off);
14455       if (!insert_nds32_elf_blank_recalc_total (relax_blank_list,
14456                                                 pre_off + 2, 2))
14457         return FALSE;
14458       if (pre_irel_ptr != NULL)
14459         nds32_elf_insert_irel_entry (irel_list, pre_irel_ptr);
14460     }
14461   return TRUE;
14462 }
14463
14464 /* Replace input file instruction which is in ex9 itable.  */
14465
14466 static bfd_boolean
14467 nds32_elf_ex9_replace_instruction (struct bfd_link_info *info, bfd *abfd, asection *sec)
14468 {
14469   struct elf_nds32_insn_times_entry *ex9_insn = ex9_insn_head;
14470   bfd_byte *contents = NULL;
14471   bfd_vma off;
14472   uint16_t insn16, insn_ex9;
14473   /* `pre_*' are used to track previous instruction that can use ex9.it.  */
14474   bfd_vma pre_off = -1;
14475   uint16_t pre_insn16 = 0;
14476   struct elf_nds32_irel_entry *pre_irel_ptr = NULL;
14477   Elf_Internal_Rela *internal_relocs;
14478   Elf_Internal_Rela *irel;
14479   Elf_Internal_Rela *irelend;
14480   Elf_Internal_Shdr *symtab_hdr;
14481   Elf_Internal_Sym *isym = NULL;
14482   nds32_elf_blank_t *relax_blank_list = NULL;
14483   uint32_t insn = 0;
14484   uint32_t insn_with_reg = 0;
14485   uint32_t it_insn;
14486   uint32_t it_insn_with_reg;
14487   unsigned long r_symndx;
14488   asection *isec;
14489   struct elf_nds32_irel_entry *irel_list = NULL;
14490   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
14491   int data_flag, do_replace, save_irel;
14492   struct elf_link_hash_entry_list *h_list;
14493
14494
14495   /* Load section instructions, relocations, and symbol table.  */
14496   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
14497       || !nds32_get_local_syms (abfd, sec, &isym))
14498     return FALSE;
14499   internal_relocs =
14500     _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, TRUE /* keep_memory */);
14501   irelend = internal_relocs + sec->reloc_count;
14502   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
14503
14504   off = 0;
14505
14506   /* Check if the object enable ex9.  */
14507   irel = find_relocs_at_address (internal_relocs, internal_relocs,
14508                                  irelend, R_NDS32_RELAX_ENTRY);
14509
14510   /* Check this section trigger ex9 relaxation.  */
14511   if (irel == NULL
14512       || irel >= irelend
14513       || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
14514       || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
14515           && !(irel->r_addend & R_NDS32_RELAX_ENTRY_EX9_FLAG)))
14516     return TRUE;
14517
14518   irel = internal_relocs;
14519
14520   /* Check alignment and fetch proper relocation.  */
14521   while (off < sec->size)
14522     {
14523       struct elf_link_hash_entry *h = NULL;
14524       struct elf_nds32_irel_entry *irel_ptr = NULL;
14525
14526       /* Syn the instruction and the relocation.  */
14527       while (irel != NULL && irel < irelend && irel->r_offset < off)
14528         irel++;
14529
14530       data_flag = nds32_elf_ex9_relocation_check (info, &irel, irelend,
14531                                                   relax_blank_list, sec,
14532                                                   &off, contents);
14533       if (data_flag & PUSH_PRE)
14534         if (!nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
14535                                       &relax_blank_list, pre_irel_ptr,
14536                                       &irel_list))
14537           return FALSE;
14538
14539       if (data_flag & CLEAN_PRE)
14540         {
14541           pre_off = 0;
14542           pre_insn16 = 0;
14543           pre_irel_ptr = NULL;
14544         }
14545       if (data_flag & DATA_EXIST)
14546         {
14547           /* We save the move offset in the highest byte.  */
14548           off += (data_flag >> 24);
14549           continue;
14550         }
14551
14552       if (*(contents + off) & 0x80)
14553         {
14554           /* 2-byte instruction.  */
14555           off += 2;
14556           continue;
14557         }
14558
14559       /* Load the instruction and its opcode with register for comparing.  */
14560       ex9_insn = ex9_insn_head;
14561       insn = bfd_getb32 (contents + off);
14562       insn_with_reg = 0;
14563       while (ex9_insn)
14564         {
14565           it_insn = strtol (ex9_insn->string, NULL, 16);
14566           it_insn_with_reg = 0;
14567           do_replace = 0;
14568           save_irel = 0;
14569
14570           if (irel != NULL && irel < irelend && irel->r_offset == off)
14571             {
14572               /* Insn with relocation.  */
14573               nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
14574
14575               if (ex9_insn->irel != NULL)
14576                 nds32_elf_get_insn_with_reg (ex9_insn->irel, it_insn,
14577                                              &it_insn_with_reg);
14578
14579               if (ex9_insn->irel != NULL
14580                   && (ELF32_R_TYPE (irel->r_info) ==
14581                       ELF32_R_TYPE (ex9_insn->irel->r_info))
14582                   && (insn_with_reg == it_insn_with_reg))
14583                 {
14584                   /* Insn relocation and format is the same as table entry.  */
14585
14586                   if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA
14587                       || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_ORI_RELA
14588                       || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_RELA
14589                       || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S1_RELA
14590                       || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_RELA
14591                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
14592                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
14593                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
14594                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
14595                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
14596                           && ELF32_R_TYPE (irel->r_info) <=
14597                           R_NDS32_SDA12S2_SP_RELA)
14598                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
14599                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))
14600                     {
14601                       r_symndx = ELF32_R_SYM (irel->r_info);
14602                       if (r_symndx < symtab_hdr->sh_info)
14603                         {
14604                           /* Local symbol.  */
14605                           int shndx = isym[r_symndx].st_shndx;
14606
14607                           isec = elf_elfsections (abfd)[shndx]->bfd_section;
14608                           if (ex9_insn->sec == isec
14609                               && ex9_insn->irel->r_addend == irel->r_addend
14610                               && ex9_insn->irel->r_info == irel->r_info)
14611                             {
14612                               do_replace = 1;
14613                               save_irel = 1;
14614                             }
14615                         }
14616                       else
14617                         {
14618                           /* External symbol.  */
14619                           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
14620                           if (ex9_insn->m_list)
14621                             {
14622                               h_list = ex9_insn->m_list->h_list;
14623                               while (h_list)
14624                                 {
14625                                   if (h == h_list->h
14626                                       && (ex9_insn->m_list->irel->r_addend ==
14627                                           irel->r_addend))
14628                                     {
14629                                       do_replace = 1;
14630                                       save_irel = 1;
14631                                       break;
14632                                     }
14633                                   h_list = h_list->next;
14634                                 }
14635                             }
14636                         }
14637                     }
14638                   else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_HI20_RELA)
14639                     {
14640                       r_symndx = ELF32_R_SYM (irel->r_info);
14641                       if (r_symndx < symtab_hdr->sh_info)
14642                         {
14643                           /* Local symbols.  Compare its base symbol and offset.  */
14644                           int shndx = isym[r_symndx].st_shndx;
14645
14646                           isec = elf_elfsections (abfd)[shndx]->bfd_section;
14647                           if (ex9_insn->sec == isec
14648                               && ex9_insn->irel->r_addend == irel->r_addend
14649                               && ex9_insn->irel->r_info == irel->r_info)
14650                             {
14651                               do_replace = 1;
14652                               save_irel = 1;
14653                             }
14654                         }
14655                       else
14656                         {
14657                           /* External symbol.  */
14658                           struct elf_link_hash_entry_mul_list *m_list;
14659
14660                           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
14661                           m_list = ex9_insn->m_list;
14662
14663                           while (m_list)
14664                             {
14665                               h_list = m_list->h_list;
14666
14667                               while (h_list)
14668                                 {
14669                                   if (h == h_list->h
14670                                       && (m_list->irel->r_addend
14671                                           == irel->r_addend))
14672                                     {
14673                                       do_replace = 1;
14674                                       save_irel = 1;
14675                                       if (ex9_insn->next
14676                                           && ex9_insn->m_list
14677                                           && ex9_insn->m_list == ex9_insn->next->m_list)
14678                                         {
14679                                           /* sethi multiple entry must be fixed */
14680                                           nds32_elf_ex9_insert_fix (sec, irel,
14681                                                                     h, ex9_insn->order);
14682                                         }
14683                                       break;
14684                                     }
14685                                   h_list = h_list->next;
14686                                 }
14687                               m_list = m_list->next;
14688                             }
14689                         }
14690                     }
14691                 }
14692
14693               /* Import table: Check the symbol hash table and the
14694                  jump target.  Only R_NDS32_25_PCREL_RELA now.  */
14695               else if (ex9_insn->times == -1
14696                        && ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA)
14697                 {
14698                   nds32_elf_get_insn_with_reg (irel, it_insn, &it_insn_with_reg);
14699                   if (insn_with_reg == it_insn_with_reg)
14700                     {
14701                       char code[10];
14702                       bfd_vma relocation;
14703
14704                       r_symndx = ELF32_R_SYM (irel->r_info);
14705                       if (r_symndx >= symtab_hdr->sh_info)
14706                         {
14707                           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
14708                           if ((h->root.type == bfd_link_hash_defined
14709                                || h->root.type == bfd_link_hash_defweak)
14710                               && h->root.u.def.section != NULL
14711                               && h->root.u.def.section->output_section != NULL
14712                               && h->root.u.def.section->gc_mark == 1
14713                               && bfd_is_abs_section (h->root.u.def.section)
14714                               && h->root.u.def.value > sec->size)
14715                             {
14716                               relocation = h->root.u.def.value +
14717                                 h->root.u.def.section->output_section->vma +
14718                                 h->root.u.def.section->output_offset;
14719                               relocation += irel->r_addend;
14720                               insn = insn_with_reg
14721                                 | ((relocation >> 1) & 0xffffff);
14722                               snprintf (code, sizeof (code), "%08x", insn);
14723                               if (strcmp (code, ex9_insn->string) == 0)
14724                                 {
14725                                   do_replace = 1;
14726                                   save_irel = 1;
14727                                 }
14728                             }
14729                         }
14730                     }
14731                 }
14732               else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
14733                        || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
14734                        || ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
14735                 {
14736                   /* These relocations do not have to relocate contens, so it can
14737                      be regard as instruction without relocation.  */
14738                   if (insn == it_insn && ex9_insn->irel == NULL)
14739                     do_replace = 1;
14740                 }
14741             }
14742           else
14743             {
14744               /* Instruction without relocation, we only
14745                  have to compare their byte code.  */
14746               if (insn == it_insn && ex9_insn->irel == NULL)
14747                 do_replace = 1;
14748             }
14749
14750           /* Insntruction match so replacing the code here.  */
14751           if (do_replace == 1)
14752             {
14753               /* There are two formats of ex9 instruction.  */
14754               if (ex9_insn->order < 32)
14755                 insn_ex9 = INSN_EX9_IT_2;
14756               else
14757                 insn_ex9 = INSN_EX9_IT_1;
14758               insn16 = insn_ex9 | ex9_insn->order;
14759
14760               /* Insert ex9 instruction.  */
14761               nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
14762                                        &relax_blank_list, pre_irel_ptr,
14763                                        &irel_list);
14764               pre_off = off;
14765               pre_insn16 = insn16;
14766
14767               if (save_irel)
14768                 {
14769                   /* For instuction with relocation do relax.  */
14770                   irel_ptr = (struct elf_nds32_irel_entry *)
14771                     bfd_malloc (sizeof (struct elf_nds32_irel_entry));
14772                   irel_ptr->irel = irel;
14773                   irel_ptr->next = NULL;
14774                   pre_irel_ptr = irel_ptr;
14775                 }
14776               else
14777                 pre_irel_ptr = NULL;
14778               break;
14779             }
14780           ex9_insn = ex9_insn->next;
14781         }
14782       off += 4;
14783     }
14784
14785   /* Insert ex9 instruction.  */
14786   nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
14787                            &relax_blank_list, pre_irel_ptr,
14788                            &irel_list);
14789
14790   /* Delete the redundant code.  */
14791   if (relax_blank_list)
14792     {
14793       nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
14794       relax_blank_list = NULL;
14795     }
14796
14797   /* Clear the relocation that is replaced by ex9.  */
14798   while (irel_list)
14799     {
14800       struct elf_nds32_irel_entry *irel_ptr;
14801
14802       irel_ptr = irel_list;
14803       irel_list = irel_ptr->next;
14804       irel_ptr->irel->r_info =
14805         ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info), R_NDS32_TRAN);
14806       free (irel_ptr);
14807     }
14808   return TRUE;
14809 }
14810
14811 /* Initialize ex9 hash table.  */
14812
14813 int
14814 nds32_elf_ex9_init (void)
14815 {
14816   if (!bfd_hash_table_init_n (&ex9_code_table, nds32_elf_code_hash_newfunc,
14817                               sizeof (struct elf_nds32_code_hash_entry),
14818                               1023))
14819     {
14820       _bfd_error_handler (_("Linker: cannot init ex9 hash table error \n"));
14821       return FALSE;
14822     }
14823   return TRUE;
14824 }
14825
14826 /* Predict how many bytes will be relaxed with ex9 and ifc.  */
14827
14828 static void
14829 nds32_elf_ex9_total_relax (struct bfd_link_info *info)
14830 {
14831   struct elf_nds32_insn_times_entry *ex9_insn;
14832   struct elf_nds32_insn_times_entry *temp;
14833   int target_optimize;
14834   struct elf_nds32_link_hash_table *table;
14835
14836   if (ex9_insn_head == NULL)
14837     return;
14838
14839   table = nds32_elf_hash_table (info);
14840   target_optimize  = table->target_optimize;
14841   ex9_insn = ex9_insn_head;
14842   while (ex9_insn)
14843     {
14844       ex9_relax_size = ex9_insn->times * 2 + ex9_relax_size;
14845       temp = ex9_insn;
14846       ex9_insn = ex9_insn->next;
14847       free (temp);
14848     }
14849   ex9_insn_head = NULL;
14850
14851   if ((target_optimize & NDS32_RELAX_JUMP_IFC_ON))
14852     {
14853       /* Examine ifc reduce size.  */
14854       struct elf_nds32_ifc_symbol_entry *ifc_ent = ifc_symbol_head;
14855       struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
14856       int size = 0;
14857
14858       while (ifc_ent)
14859         {
14860           if (ifc_ent->enable == 0)
14861             {
14862               /* Not ifc yet.  */
14863               irel_ptr = ifc_ent->irel_head;
14864               while (irel_ptr)
14865                 {
14866                   size += 2;
14867                   irel_ptr = irel_ptr->next;
14868                 }
14869             }
14870           size -= 2;
14871           ifc_ent = ifc_ent->next;
14872         }
14873       ex9_relax_size += size;
14874     }
14875 }
14876
14877 /* Finish ex9 table.  */
14878
14879 void
14880 nds32_elf_ex9_finish (struct bfd_link_info *link_info)
14881 {
14882   nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times);
14883   nds32_elf_order_insn_times (link_info);
14884   nds32_elf_ex9_total_relax (link_info);
14885   /* Traverse the hash table and count its times.  */
14886   nds32_elf_code_hash_traverse (nds32_elf_count_insn_times);
14887   nds32_elf_order_insn_times (link_info);
14888   nds32_elf_ex9_build_itable (link_info);
14889 }
14890
14891 /* Relocate the entries in ex9 table.  */
14892
14893 static bfd_vma
14894 nds32_elf_ex9_reloc_insn (struct elf_nds32_insn_times_entry *ptr,
14895                           struct bfd_link_info *link_info)
14896 {
14897   Elf_Internal_Sym *isym = NULL;
14898   bfd_vma relocation = -1;
14899   struct elf_link_hash_entry *h;
14900
14901   if (ptr->m_list != NULL)
14902     {
14903       /* Global symbol.  */
14904       h = ptr->m_list->h_list->h;
14905       if ((h->root.type == bfd_link_hash_defined
14906            || h->root.type == bfd_link_hash_defweak)
14907           && h->root.u.def.section != NULL
14908           && h->root.u.def.section->output_section != NULL)
14909         {
14910
14911           relocation = h->root.u.def.value +
14912             h->root.u.def.section->output_section->vma +
14913             h->root.u.def.section->output_offset;
14914           relocation += ptr->m_list->irel->r_addend;
14915         }
14916       else
14917         relocation = 0;
14918     }
14919   else if (ptr->sec !=NULL)
14920     {
14921       /* Local symbol.  */
14922       Elf_Internal_Sym sym;
14923       asection *sec = NULL;
14924       asection isec;
14925       asection *isec_ptr = &isec;
14926       Elf_Internal_Rela irel_backup = *(ptr->irel);
14927       asection *sec_backup = ptr->sec;
14928       bfd *abfd = ptr->sec->owner;
14929
14930       if (!nds32_get_local_syms (abfd, sec, &isym))
14931         return FALSE;
14932       isym = isym + ELF32_R_SYM (ptr->irel->r_info);
14933
14934       sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
14935       if (sec != NULL)
14936         *isec_ptr = *sec;
14937       sym = *isym;
14938
14939       /* The purpose is same as elf_link_input_bfd.  */
14940       if (isec_ptr != NULL
14941           && isec_ptr->sec_info_type == SEC_INFO_TYPE_MERGE
14942           && ELF_ST_TYPE (isym->st_info) != STT_SECTION)
14943         {
14944           sym.st_value =
14945             _bfd_merged_section_offset (ptr->sec->output_section->owner, &isec_ptr,
14946                                         elf_section_data (isec_ptr)->sec_info,
14947                                         isym->st_value);
14948         }
14949       relocation = _bfd_elf_rela_local_sym (link_info->output_bfd, &sym,
14950                                             &ptr->sec, ptr->irel);
14951       if (ptr->irel != NULL)
14952         relocation += ptr->irel->r_addend;
14953
14954       /* Restore origin value since there may be some insntructions that
14955          could not be replaced with ex9.it.  */
14956       *(ptr->irel) = irel_backup;
14957       ptr->sec = sec_backup;
14958     }
14959
14960   return relocation;
14961 }
14962
14963 /* Import ex9 table and build list.  */
14964
14965 void
14966 nds32_elf_ex9_import_table (struct bfd_link_info *info)
14967 {
14968   int num = 0;
14969   bfd_byte *contents;
14970   unsigned long insn;
14971   FILE *ex9_import_file;
14972   int update_ex9_table;
14973   struct elf_nds32_link_hash_table *table;
14974
14975   table = nds32_elf_hash_table (info);
14976   ex9_import_file = table->ex9_import_file;
14977   rewind (table->ex9_import_file);
14978
14979   contents = bfd_malloc (sizeof (bfd_byte) * 4);
14980
14981   /* Read instructions from the input file and build the list.  */
14982   while (!feof (ex9_import_file))
14983     {
14984       char *code;
14985       struct elf_nds32_insn_times_entry *ptr;
14986       size_t nread;
14987
14988       nread = fread (contents, sizeof (bfd_byte) * 4, 1, ex9_import_file);
14989       /* Ignore the final byte 0x0a.  */
14990       if (nread < 1)
14991         break;
14992       insn = bfd_getb32 (contents);
14993       code = bfd_malloc (sizeof (char) * 9);
14994       snprintf (code, 9, "%08lx", insn);
14995       ptr = bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
14996       ptr->string = code;
14997       ptr->order = num;
14998       ptr->times = -1;
14999       ptr->sec = NULL;
15000       ptr->m_list = NULL;
15001       ptr->rel_backup.r_offset = 0;
15002       ptr->rel_backup.r_info = 0;
15003       ptr->rel_backup.r_addend = 0;
15004       ptr->irel = NULL;
15005       ptr->next = NULL;
15006       nds32_elf_ex9_insert_entry (ptr);
15007       num++;
15008     }
15009
15010   update_ex9_table = table->update_ex9_table;
15011   if (update_ex9_table == 1)
15012     {
15013       /* It has to consider of sethi need to use multiple page
15014          but it not be done yet.  */
15015       nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times);
15016       nds32_elf_order_insn_times (info);
15017     }
15018 }
15019
15020 /* Export ex9 table.  */
15021
15022 static void
15023 nds32_elf_ex9_export (struct bfd_link_info *info,
15024                       bfd_byte *contents, int size)
15025 {
15026   FILE *ex9_export_file;
15027   struct elf_nds32_link_hash_table *table;
15028
15029   table = nds32_elf_hash_table (info);
15030   ex9_export_file = table->ex9_export_file;
15031   fwrite (contents, sizeof (bfd_byte), size, ex9_export_file);
15032   fclose (ex9_export_file);
15033 }
15034
15035 /* Adjust relocations of J and JAL in ex9.itable.
15036    Export ex9 table.  */
15037
15038 static void
15039 nds32_elf_ex9_reloc_jmp (struct bfd_link_info *link_info)
15040 {
15041   asection *table_sec = NULL;
15042   struct elf_nds32_insn_times_entry *ex9_insn = ex9_insn_head;
15043   struct elf_nds32_insn_times_entry *temp_ptr, *temp_ptr2;
15044   bfd *it_abfd;
15045   uint32_t insn, insn_with_reg, source_insn;
15046   bfd_byte *contents = NULL, *source_contents = NULL;
15047   int size = 0;
15048   bfd_vma gp;
15049   int shift, update_ex9_table, offset = 0;
15050   reloc_howto_type *howto = NULL;
15051   Elf_Internal_Rela rel_backup;
15052   unsigned short insn_ex9;
15053   struct elf_nds32_link_hash_table *table;
15054   FILE *ex9_export_file;
15055   static bfd_boolean done = FALSE;
15056
15057   if (done)
15058     return;
15059
15060   done = TRUE;
15061
15062   table = nds32_elf_hash_table (link_info);
15063   if (table)
15064     table->relax_status |= NDS32_RELAX_EX9_DONE;
15065
15066
15067   update_ex9_table = table->update_ex9_table;
15068   /* Generated ex9.itable exactly.  */
15069   if (update_ex9_table == 0)
15070     {
15071       for (it_abfd = link_info->input_bfds; it_abfd != NULL;
15072            it_abfd = it_abfd->link.next)
15073         {
15074           table_sec = bfd_get_section_by_name (it_abfd, ".ex9.itable");
15075           if (table_sec != NULL)
15076             break;
15077         }
15078
15079       if (table_sec != NULL)
15080         {
15081           bfd *output_bfd;
15082
15083           output_bfd = table_sec->output_section->owner;
15084           nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
15085           if (table_sec->size == 0)
15086             return;
15087
15088           if (!nds32_get_section_contents (it_abfd, table_sec, &contents, TRUE))
15089             return;
15090         }
15091     }
15092   else
15093     {
15094       /* Set gp.  */
15095       bfd *output_bfd;
15096
15097       output_bfd = link_info->input_bfds->sections->output_section->owner;
15098       nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
15099       contents = bfd_malloc (sizeof (bfd_byte) * 2048);
15100     }
15101
15102   /* Relocate instruction.  */
15103   while (ex9_insn)
15104     {
15105       bfd_vma relocation, min_relocation = 0xffffffff;
15106
15107       insn = strtol (ex9_insn->string, NULL, 16);
15108       insn_with_reg = 0;
15109       if (ex9_insn->m_list != NULL || ex9_insn->sec != NULL)
15110         {
15111           if (ex9_insn->m_list)
15112             rel_backup = ex9_insn->m_list->rel_backup;
15113           else
15114             rel_backup = ex9_insn->rel_backup;
15115
15116           nds32_elf_get_insn_with_reg (&rel_backup, insn, &insn_with_reg);
15117           howto =
15118             bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE
15119                                                    (rel_backup.r_info));
15120           shift = howto->rightshift;
15121           if (ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_25_PCREL_RELA
15122               || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S0_ORI_RELA
15123               || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S0_RELA
15124               || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S1_RELA
15125               || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S2_RELA)
15126             {
15127               relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
15128               insn =
15129                 insn_with_reg | ((relocation >> shift) &
15130                                  nds32_elf_irel_mask (&rel_backup));
15131               bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15132             }
15133           else if ((ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA15S3
15134                     && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA15S0)
15135                    || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA15S3_RELA
15136                        && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA15S0_RELA)
15137                    || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA12S2_DP_RELA
15138                        && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA12S2_SP_RELA)
15139                    || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA16S3_RELA
15140                        && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA19S0_RELA))
15141             {
15142               relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
15143               insn =
15144                 insn_with_reg | (((relocation - gp) >> shift) &
15145                                  nds32_elf_irel_mask (&rel_backup));
15146               bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15147             }
15148           else if (ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_HI20_RELA)
15149             {
15150               /* Sethi may be multiple entry for one insn.  */
15151               if (ex9_insn->next && ex9_insn->m_list
15152                   && ex9_insn->m_list == ex9_insn->next->m_list)
15153                 {
15154                   struct elf_link_hash_entry_mul_list *m_list;
15155                   struct elf_nds32_ex9_refix *fix_ptr;
15156                   struct elf_link_hash_entry *h;
15157
15158                   temp_ptr = ex9_insn;
15159                   temp_ptr2 = ex9_insn;
15160                   m_list = ex9_insn->m_list;
15161                   while (m_list)
15162                     {
15163                       h = m_list->h_list->h;
15164                       relocation = h->root.u.def.value +
15165                         h->root.u.def.section->output_section->vma +
15166                         h->root.u.def.section->output_offset;
15167                       relocation += m_list->irel->r_addend;
15168
15169                       if (relocation < min_relocation)
15170                         min_relocation = relocation;
15171                       m_list = m_list->next;
15172                     }
15173                   relocation = min_relocation;
15174
15175                   /* Put insntruction into ex9 table.  */
15176                   insn = insn_with_reg
15177                     | ((relocation >> shift) & nds32_elf_irel_mask (&rel_backup));
15178                   bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15179                   relocation = relocation + 0x1000;     /* hi20 */
15180
15181                   while (ex9_insn->next && ex9_insn->m_list
15182                          && ex9_insn->m_list == ex9_insn->next->m_list)
15183                     {
15184                       /* Multiple sethi.  */
15185                       ex9_insn = ex9_insn->next;
15186                       size += 4;
15187                       insn =
15188                         insn_with_reg | ((relocation >> shift) &
15189                                          nds32_elf_irel_mask (&rel_backup));
15190                       bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15191                       relocation = relocation + 0x1000; /* hi20 */
15192                     }
15193
15194                   fix_ptr = ex9_refix_head;
15195                   while (fix_ptr)
15196                     {
15197                       /* Fix ex9 insn.  */
15198                       /* temp_ptr2 points to the head of multiple sethi.  */
15199                       temp_ptr = temp_ptr2;
15200                       while (fix_ptr->order != temp_ptr->order && fix_ptr->next)
15201                         {
15202                           fix_ptr = fix_ptr->next;
15203                         }
15204                       if (fix_ptr->order != temp_ptr->order)
15205                         break;
15206
15207                       /* Set source insn.  */
15208                       relocation =
15209                         fix_ptr->h->root.u.def.value +
15210                         fix_ptr->h->root.u.def.section->output_section->vma +
15211                         fix_ptr->h->root.u.def.section->output_offset;
15212                       relocation += fix_ptr->irel->r_addend;
15213                       /* sethi imm is imm20s.  */
15214                       source_insn = insn_with_reg | ((relocation >> shift) & 0xfffff);
15215
15216                       while (temp_ptr)
15217                         {
15218                           /* Match entry and source code.  */
15219                           insn = bfd_getb32 (contents + (temp_ptr->order) * 4 + offset);
15220                           if (insn == source_insn)
15221                             {
15222                               /* Fix the ex9 insn.  */
15223                               if (temp_ptr->order != fix_ptr->order)
15224                                 {
15225                                   if (!nds32_get_section_contents
15226                                          (fix_ptr->sec->owner, fix_ptr->sec,
15227                                           &source_contents, TRUE))
15228                                     _bfd_error_handler
15229                                       (_("Linker: error cannot fixed ex9 relocation \n"));
15230                                   if (temp_ptr->order < 32)
15231                                     insn_ex9 = INSN_EX9_IT_2;
15232                                   else
15233                                     insn_ex9 = INSN_EX9_IT_1;
15234                                   insn_ex9 = insn_ex9 | temp_ptr->order;
15235                                   bfd_putb16 (insn_ex9, source_contents + fix_ptr->irel->r_offset);
15236                                 }
15237                                 break;
15238                             }
15239                           else
15240                             {
15241                               if (!temp_ptr->next || temp_ptr->m_list != temp_ptr->next->m_list)
15242                                 _bfd_error_handler
15243                                   (_("Linker: error cannot fixed ex9 relocation \n"));
15244                               else
15245                                 temp_ptr = temp_ptr->next;
15246                             }
15247                         }
15248                       fix_ptr = fix_ptr->next;
15249                     }
15250                 }
15251               else
15252                 {
15253                   relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
15254                   insn = insn_with_reg
15255                          | ((relocation >> shift) & nds32_elf_irel_mask (&rel_backup));
15256                   bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15257                 }
15258             }
15259         }
15260       else
15261         {
15262           /* Insn without relocation does not have to be fixed
15263              if need to update export table.  */
15264           if (update_ex9_table == 1)
15265             bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15266         }
15267       ex9_insn = ex9_insn->next;
15268       size += 4;
15269     }
15270
15271   ex9_export_file = table->ex9_export_file;
15272   if (ex9_export_file != NULL)
15273     nds32_elf_ex9_export (link_info, contents, table_sec->size);
15274   else if (update_ex9_table == 1)
15275     {
15276       table->ex9_export_file = table->ex9_import_file;
15277       rewind (table->ex9_export_file);
15278       nds32_elf_ex9_export (link_info, contents, size);
15279     }
15280 }
15281
15282 /* Generate ex9 hash table.  */
15283
15284 static bfd_boolean
15285 nds32_elf_ex9_build_hash_table (bfd *abfd, asection *sec,
15286                                 struct bfd_link_info *link_info)
15287 {
15288   Elf_Internal_Rela *internal_relocs;
15289   Elf_Internal_Rela *irelend;
15290   Elf_Internal_Rela *irel;
15291   Elf_Internal_Rela *jrel;
15292   Elf_Internal_Rela rel_backup;
15293   Elf_Internal_Shdr *symtab_hdr;
15294   Elf_Internal_Sym *isym = NULL;
15295   asection *isec;
15296   struct elf_link_hash_entry **sym_hashes;
15297   bfd_byte *contents = NULL;
15298   bfd_vma off = 0;
15299   unsigned long r_symndx;
15300   uint32_t insn, insn_with_reg;
15301   struct elf_link_hash_entry *h;
15302   int data_flag, shift, align;
15303   bfd_vma relocation;
15304   /* Suppress ex9 if `.no_relax ex9' or inner loop.  */
15305   reloc_howto_type *howto = NULL;
15306
15307   sym_hashes = elf_sym_hashes (abfd);
15308   /* Load section instructions, relocations, and symbol table.  */
15309   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
15310     return FALSE;
15311
15312   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
15313                                                TRUE /* keep_memory */);
15314   irelend = internal_relocs + sec->reloc_count;
15315   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
15316   if (!nds32_get_local_syms (abfd, sec, &isym))
15317     return FALSE;
15318
15319   /* Check the object if enable ex9.  */
15320   irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend,
15321                                  R_NDS32_RELAX_ENTRY);
15322
15323   /* Check this section trigger ex9 relaxation.  */
15324   if (irel == NULL
15325       || irel >= irelend
15326       || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
15327       || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
15328           && !(irel->r_addend & R_NDS32_RELAX_ENTRY_EX9_FLAG)))
15329     return TRUE;
15330
15331   irel = internal_relocs;
15332
15333   /* Push each insn into hash table.  */
15334   while (off < sec->size)
15335     {
15336       char code[10];
15337       struct elf_nds32_code_hash_entry *entry;
15338
15339       while (irel != NULL && irel < irelend && irel->r_offset < off)
15340         irel++;
15341
15342       data_flag = nds32_elf_ex9_relocation_check (link_info, &irel, irelend,
15343                                                   NULL, sec, &off, contents);
15344       if (data_flag & DATA_EXIST)
15345         {
15346           /* We save the move offset in the highest byte.  */
15347           off += (data_flag >> 24);
15348           continue;
15349         }
15350
15351       if (*(contents + off) & 0x80)
15352         {
15353           off += 2;
15354         }
15355       else
15356         {
15357           h = NULL;
15358           isec = NULL;
15359           jrel = NULL;
15360           rel_backup.r_info = 0;
15361           rel_backup.r_offset = 0;
15362           rel_backup.r_addend = 0;
15363           /* Load the instruction and its opcode with register for comparing.  */
15364           insn = bfd_getb32 (contents + off);
15365           insn_with_reg = 0;
15366           if (irel != NULL && irel < irelend && irel->r_offset == off)
15367             {
15368               nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
15369               howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
15370               shift = howto->rightshift;
15371               align = (1 << shift) - 1;
15372               if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA
15373                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_HI20_RELA
15374                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_ORI_RELA
15375                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_RELA
15376                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S1_RELA
15377                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_RELA
15378                   ||(ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
15379                      && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
15380                   || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
15381                       && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
15382                   || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
15383                       && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA)
15384                   || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
15385                       && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))
15386                 {
15387                   r_symndx = ELF32_R_SYM (irel->r_info);
15388                   jrel = irel;
15389                   rel_backup = *irel;
15390                   if (r_symndx < symtab_hdr->sh_info)
15391                     {
15392                       /* Local symbol.  */
15393                       int shndx = isym[r_symndx].st_shndx;
15394
15395                       bfd_vma st_value = (isym + r_symndx)->st_value;
15396                       isec = elf_elfsections (abfd)[shndx]->bfd_section;
15397                       relocation = (isec->output_section->vma + isec->output_offset
15398                                     + st_value + irel->r_addend);
15399                     }
15400                   else
15401                     {
15402                       /* External symbol.  */
15403                       bfd_boolean warned ATTRIBUTE_UNUSED;
15404                       bfd_boolean ignored ATTRIBUTE_UNUSED;
15405                       bfd_boolean unresolved_reloc ATTRIBUTE_UNUSED;
15406                       asection *sym_sec;
15407
15408                       /* Maybe there is a better way to get h and relocation */
15409                       RELOC_FOR_GLOBAL_SYMBOL (link_info, abfd, sec, irel,
15410                                                r_symndx, symtab_hdr, sym_hashes,
15411                                                h, sym_sec, relocation,
15412                                                unresolved_reloc, warned, ignored);
15413                       relocation += irel->r_addend;
15414                       if ((h->root.type != bfd_link_hash_defined
15415                            && h->root.type != bfd_link_hash_defweak)
15416                           || strcmp (h->root.root.string, "_FP_BASE_") == 0)
15417                         {
15418                           off += 4;
15419                           continue;
15420                         }
15421                     }
15422
15423                   /* Check for gp relative instruction alignment.  */
15424                   if ((ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
15425                        && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
15426                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
15427                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
15428                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
15429                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA)
15430                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
15431                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))
15432                     {
15433                       bfd_vma gp;
15434                       bfd *output_bfd = sec->output_section->owner;
15435                       bfd_reloc_status_type r;
15436
15437                       /* If the symbol is in the abs section, the out_bfd will be null.
15438                          This happens when the relocation has a symbol@GOTOFF.  */
15439                       r = nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
15440                       if (r != bfd_reloc_ok)
15441                         {
15442                           off += 4;
15443                           continue;
15444                         }
15445
15446                       relocation -= gp;
15447
15448                       /* Make sure alignment is correct.  */
15449                       if (relocation & align)
15450                         {
15451                           /* Incorrect alignment.  */
15452                           _bfd_error_handler
15453                             /* xgettext:c-format */
15454                             (_("%s: warning: unaligned small data access. "
15455                                "For entry: {%d, %d, %d}, addr = 0x%x, align = 0x%x."),
15456                              bfd_get_filename (abfd), irel->r_offset,
15457                              irel->r_info, irel->r_addend, relocation, align);
15458                           off += 4;
15459                           continue;
15460                         }
15461                     }
15462
15463                   insn = insn_with_reg
15464                     | ((relocation >> shift) & nds32_elf_irel_mask (irel));
15465                 }
15466               else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
15467                        || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
15468                        || ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
15469                 {
15470                   /* These relocations do not have to relocate contens, so it can
15471                      be regard as instruction without relocation.  */
15472                 }
15473               else
15474                 {
15475                   off += 4;
15476                   continue;
15477                 }
15478             }
15479
15480           snprintf (code, sizeof (code), "%08x", insn);
15481           /* Copy "code".  */
15482           entry = (struct elf_nds32_code_hash_entry*)
15483             bfd_hash_lookup (&ex9_code_table, code, TRUE, TRUE);
15484           if (entry == NULL)
15485             {
15486               _bfd_error_handler
15487                 (_("%P%F: failed creating ex9.it %s hash table: %E\n"), code);
15488               return FALSE;
15489             }
15490           if (h)
15491             {
15492               if (h->root.type == bfd_link_hash_undefined)
15493                 return TRUE;
15494               /* Global symbol.  */
15495               /* In order to do sethi with different symbol but same value.  */
15496               if (entry->m_list == NULL)
15497                 {
15498                   struct elf_link_hash_entry_mul_list *m_list_new;
15499                   struct elf_link_hash_entry_list *h_list_new;
15500
15501                   m_list_new = (struct elf_link_hash_entry_mul_list *)
15502                     bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list));
15503                   h_list_new = (struct elf_link_hash_entry_list *)
15504                     bfd_malloc (sizeof (struct elf_link_hash_entry_list));
15505                   entry->m_list = m_list_new;
15506                   m_list_new->h_list = h_list_new;
15507                   m_list_new->rel_backup = rel_backup;
15508                   m_list_new->times = 1;
15509                   m_list_new->irel = jrel;
15510                   m_list_new->next = NULL;
15511                   h_list_new->h = h;
15512                   h_list_new->next = NULL;
15513                 }
15514               else
15515                 {
15516                   struct elf_link_hash_entry_mul_list *m_list = entry->m_list;
15517                   struct elf_link_hash_entry_list *h_list;
15518
15519                   while (m_list)
15520                     {
15521                       /* Build the different symbols that point to the same address.  */
15522                       h_list = m_list->h_list;
15523                       if (h_list->h->root.u.def.value == h->root.u.def.value
15524                           && h_list->h->root.u.def.section->output_section->vma
15525                              == h->root.u.def.section->output_section->vma
15526                           && h_list->h->root.u.def.section->output_offset
15527                              == h->root.u.def.section->output_offset
15528                           && m_list->rel_backup.r_addend == rel_backup.r_addend)
15529                         {
15530                           m_list->times++;
15531                           m_list->irel = jrel;
15532                           while (h_list->h != h && h_list->next)
15533                             h_list = h_list->next;
15534                           if (h_list->h != h)
15535                             {
15536                               struct elf_link_hash_entry_list *h_list_new;
15537
15538                               h_list_new = (struct elf_link_hash_entry_list *)
15539                                 bfd_malloc (sizeof (struct elf_link_hash_entry_list));
15540                               h_list->next = h_list_new;
15541                               h_list_new->h = h;
15542                               h_list_new->next = NULL;
15543                             }
15544                           break;
15545                         }
15546                       /* The sethi case may have different address but the
15547                          hi20 is the same.  */
15548                       else if (ELF32_R_TYPE (jrel->r_info) == R_NDS32_HI20_RELA
15549                                && m_list->next == NULL)
15550                         {
15551                           struct elf_link_hash_entry_mul_list *m_list_new;
15552                           struct elf_link_hash_entry_list *h_list_new;
15553
15554                           m_list_new = (struct elf_link_hash_entry_mul_list *)
15555                             bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list));
15556                           h_list_new = (struct elf_link_hash_entry_list *)
15557                             bfd_malloc (sizeof (struct elf_link_hash_entry_list));
15558                           m_list->next = m_list_new;
15559                           m_list_new->h_list = h_list_new;
15560                           m_list_new->rel_backup = rel_backup;
15561                           m_list_new->times = 1;
15562                           m_list_new->irel = jrel;
15563                           m_list_new->next = NULL;
15564                           h_list_new->h = h;
15565                           h_list_new->next = NULL;
15566                           break;
15567                         }
15568                       m_list = m_list->next;
15569                     }
15570                   if (!m_list)
15571                     {
15572                       off += 4;
15573                       continue;
15574                     }
15575                 }
15576             }
15577           else
15578             {
15579               /* Local symbol and insn without relocation*/
15580               entry->times++;
15581               entry->rel_backup = rel_backup;
15582             }
15583
15584           /* Use in sethi insn with constant and global symbol in same format.  */
15585           if (!jrel)
15586             entry->const_insn = 1;
15587           else
15588             entry->irel = jrel;
15589           entry->sec = isec;
15590           off += 4;
15591         }
15592     }
15593   return TRUE;
15594 }
15595
15596 /* Set the _ITB_BASE, and point it to ex9 table.  */
15597
15598 bfd_boolean
15599 nds32_elf_ex9_itb_base (struct bfd_link_info *link_info)
15600 {
15601   bfd *abfd;
15602   asection *sec;
15603   bfd *output_bfd = NULL;
15604   struct bfd_link_hash_entry *bh = NULL;
15605
15606   if (is_ITB_BASE_set == 1)
15607     return TRUE;
15608
15609   is_ITB_BASE_set = 1;
15610
15611   bh = bfd_link_hash_lookup (link_info->hash, "_ITB_BASE_", FALSE, FALSE, TRUE);
15612
15613   if (bh && (bh->type == bfd_link_hash_defined
15614              || bh->type == bfd_link_hash_defweak))
15615     return TRUE;
15616
15617   for (abfd = link_info->input_bfds; abfd != NULL;
15618        abfd = abfd->link.next)
15619     {
15620       sec = bfd_get_section_by_name (abfd, ".ex9.itable");
15621       if (sec != NULL)
15622         {
15623           output_bfd = sec->output_section->owner;
15624           break;
15625         }
15626     }
15627   if (output_bfd == NULL)
15628     {
15629       output_bfd = link_info->output_bfd;
15630       if (output_bfd->sections == NULL)
15631         return TRUE;
15632       else
15633         sec = bfd_abs_section_ptr;
15634     }
15635   bh = bfd_link_hash_lookup (link_info->hash, "_ITB_BASE_",
15636                              FALSE, FALSE, TRUE);
15637   return (_bfd_generic_link_add_one_symbol
15638           (link_info, output_bfd, "_ITB_BASE_",
15639            BSF_GLOBAL | BSF_WEAK, sec, 0,
15640            (const char *) NULL, FALSE, get_elf_backend_data
15641            (output_bfd)->collect, &bh));
15642 } /* End EX9.IT  */
15643 \f
15644
15645 #define ELF_ARCH                                bfd_arch_nds32
15646 #define ELF_MACHINE_CODE                        EM_NDS32
15647 #define ELF_MAXPAGESIZE                         0x1000
15648 #define ELF_TARGET_ID                           NDS32_ELF_DATA
15649
15650 #define TARGET_BIG_SYM                          nds32_elf32_be_vec
15651 #define TARGET_BIG_NAME                         "elf32-nds32be"
15652 #define TARGET_LITTLE_SYM                       nds32_elf32_le_vec
15653 #define TARGET_LITTLE_NAME                      "elf32-nds32le"
15654
15655 #define elf_info_to_howto                       nds32_info_to_howto
15656 #define elf_info_to_howto_rel                   nds32_info_to_howto_rel
15657
15658 #define bfd_elf32_bfd_link_hash_table_create    nds32_elf_link_hash_table_create
15659 #define bfd_elf32_bfd_merge_private_bfd_data    nds32_elf_merge_private_bfd_data
15660 #define bfd_elf32_bfd_print_private_bfd_data    nds32_elf_print_private_bfd_data
15661 #define bfd_elf32_bfd_relax_section             nds32_elf_relax_section
15662 #define bfd_elf32_bfd_set_private_flags         nds32_elf_set_private_flags
15663
15664 #define bfd_elf32_mkobject                      nds32_elf_mkobject
15665 #define elf_backend_action_discarded            nds32_elf_action_discarded
15666 #define elf_backend_add_symbol_hook             nds32_elf_add_symbol_hook
15667 #define elf_backend_check_relocs                nds32_elf_check_relocs
15668 #define elf_backend_adjust_dynamic_symbol       nds32_elf_adjust_dynamic_symbol
15669 #define elf_backend_create_dynamic_sections     nds32_elf_create_dynamic_sections
15670 #define elf_backend_finish_dynamic_sections     nds32_elf_finish_dynamic_sections
15671 #define elf_backend_finish_dynamic_symbol       nds32_elf_finish_dynamic_symbol
15672 #define elf_backend_size_dynamic_sections       nds32_elf_size_dynamic_sections
15673 #define elf_backend_relocate_section            nds32_elf_relocate_section
15674 #define elf_backend_gc_mark_hook                nds32_elf_gc_mark_hook
15675 #define elf_backend_gc_sweep_hook               nds32_elf_gc_sweep_hook
15676 #define elf_backend_grok_prstatus               nds32_elf_grok_prstatus
15677 #define elf_backend_grok_psinfo                 nds32_elf_grok_psinfo
15678 #define elf_backend_reloc_type_class            nds32_elf_reloc_type_class
15679 #define elf_backend_copy_indirect_symbol        nds32_elf_copy_indirect_symbol
15680 #define elf_backend_link_output_symbol_hook     nds32_elf_output_symbol_hook
15681 #define elf_backend_output_arch_syms            nds32_elf_output_arch_syms
15682 #define elf_backend_object_p                    nds32_elf_object_p
15683 #define elf_backend_final_write_processing      nds32_elf_final_write_processing
15684 #define elf_backend_special_sections            nds32_elf_special_sections
15685 #define bfd_elf32_bfd_get_relocated_section_contents \
15686                                 nds32_elf_get_relocated_section_contents
15687
15688 #define elf_backend_can_gc_sections             1
15689 #define elf_backend_can_refcount                1
15690 #define elf_backend_want_got_plt                1
15691 #define elf_backend_plt_readonly                1
15692 #define elf_backend_want_plt_sym                0
15693 #define elf_backend_got_header_size             12
15694 #define elf_backend_may_use_rel_p               1
15695 #define elf_backend_default_use_rela_p          1
15696 #define elf_backend_may_use_rela_p              1
15697
15698 #include "elf32-target.h"
15699
15700 #undef ELF_MAXPAGESIZE
15701 #define ELF_MAXPAGESIZE                         0x2000
15702
15703 #undef TARGET_BIG_SYM
15704 #define TARGET_BIG_SYM                          nds32_elf32_linux_be_vec
15705 #undef TARGET_BIG_NAME
15706 #define TARGET_BIG_NAME                         "elf32-nds32be-linux"
15707 #undef TARGET_LITTLE_SYM
15708 #define TARGET_LITTLE_SYM                       nds32_elf32_linux_le_vec
15709 #undef TARGET_LITTLE_NAME
15710 #define TARGET_LITTLE_NAME                      "elf32-nds32le-linux"
15711 #undef elf32_bed
15712 #define elf32_bed                               elf32_nds32_lin_bed
15713
15714 #include "elf32-target.h"