Update year range in copyright notice of all files.
[external/binutils.git] / bfd / elf32-nds32.c
1 /* NDS32-specific support for 32-bit ELF.
2    Copyright (C) 2012-2017 Free Software Foundation, Inc.
3    Contributed by Andes Technology Corporation.
4
5    This file is part of BFD, the Binary File Descriptor library.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
20    02110-1301, USA.  */
21
22
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "bfd_stdint.h"
26 #include "bfdlink.h"
27 #include "libbfd.h"
28 #include "elf-bfd.h"
29 #include "libiberty.h"
30 #include "bfd_stdint.h"
31 #include "elf/nds32.h"
32 #include "opcode/nds32.h"
33 #include "elf32-nds32.h"
34 #include "opcode/cgen.h"
35 #include "../opcodes/nds32-opc.h"
36
37 /* Relocation HOWTO functions.  */
38 static bfd_reloc_status_type nds32_elf_ignore_reloc
39   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
40 static bfd_reloc_status_type nds32_elf_9_pcrel_reloc
41   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42 static bfd_reloc_status_type nds32_elf_hi20_reloc
43   (bfd *, arelent *, asymbol *, void *,
44    asection *, bfd *, char **);
45 static bfd_reloc_status_type nds32_elf_lo12_reloc
46   (bfd *, arelent *, asymbol *, void *,
47    asection *, bfd *, char **);
48 static bfd_reloc_status_type nds32_elf_generic_reloc
49   (bfd *, arelent *, asymbol *, void *,
50    asection *, bfd *, char **);
51 static bfd_reloc_status_type nds32_elf_sda15_reloc
52   (bfd *, arelent *, asymbol *, void *,
53    asection *, bfd *, char **);
54
55 /* Helper functions for HOWTO.  */
56 static bfd_reloc_status_type nds32_elf_do_9_pcrel_reloc
57   (bfd *, reloc_howto_type *, asection *, bfd_byte *, bfd_vma,
58    asection *, bfd_vma, bfd_vma);
59 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         }
5690
5691       /* Fill in the first entry in the procedure linkage table.  */
5692       splt = htab->root.splt;
5693       if (splt && splt->size > 0)
5694         {
5695           if (bfd_link_pic (info))
5696             {
5697               unsigned long insn;
5698               long offset;
5699
5700               /* FIXME, sda_base is 65536, it will damage opcode.  */
5701               /* insn = PLT_PIC_ENTRY_WORD0 + (((got_offset - sda_base) >> 2) & 0x7fff); */
5702               offset = sgot->output_section->vma + sgot->output_offset + 4
5703                        - elf_gp (output_bfd);
5704               insn = PLT0_PIC_ENTRY_WORD0 | ((offset >> 12) & 0xfffff);
5705               bfd_putb32 (insn, splt->contents);
5706
5707               /* insn = PLT0_PIC_ENTRY_WORD0 | (((8 - sda_base) >> 2) & 0x7fff) ; */
5708               /* here has a typo?  */
5709               insn = PLT0_PIC_ENTRY_WORD1 | (offset & 0xfff);
5710               bfd_putb32 (insn, splt->contents + 4);
5711
5712               insn = PLT0_PIC_ENTRY_WORD2;
5713               bfd_putb32 (insn, splt->contents + 8);
5714
5715               insn = PLT0_PIC_ENTRY_WORD3;
5716               bfd_putb32 (insn, splt->contents + 12);
5717
5718               insn = PLT0_PIC_ENTRY_WORD4;
5719               bfd_putb32 (insn, splt->contents + 16);
5720
5721               insn = PLT0_PIC_ENTRY_WORD5;
5722               bfd_putb32 (insn, splt->contents + 20);
5723             }
5724           else
5725             {
5726               unsigned long insn;
5727               unsigned long addr;
5728
5729               /* addr = .got + 4 */
5730               addr = sgot->output_section->vma + sgot->output_offset + 4;
5731               insn = PLT0_ENTRY_WORD0 | ((addr >> 12) & 0xfffff);
5732               bfd_putb32 (insn, splt->contents);
5733
5734               insn = PLT0_ENTRY_WORD1 | (addr & 0x0fff);
5735               bfd_putb32 (insn, splt->contents + 4);
5736
5737               insn = PLT0_ENTRY_WORD2;
5738               bfd_putb32 (insn, splt->contents + 8);
5739
5740               insn = PLT0_ENTRY_WORD3;
5741               bfd_putb32 (insn, splt->contents + 12);
5742
5743               insn = PLT0_ENTRY_WORD4;
5744               bfd_putb32 (insn, splt->contents + 16);
5745             }
5746
5747           elf_section_data (splt->output_section)->this_hdr.sh_entsize =
5748             PLT_ENTRY_SIZE;
5749         }
5750     }
5751
5752   /* Fill in the first three entries in the global offset table.  */
5753   if (sgot && sgot->size > 0)
5754     {
5755       if (sdyn == NULL)
5756         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
5757       else
5758         bfd_put_32 (output_bfd,
5759                     sdyn->output_section->vma + sdyn->output_offset,
5760                     sgot->contents);
5761       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
5762       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
5763
5764       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
5765     }
5766
5767   return TRUE;
5768 }
5769 \f
5770
5771 /* Set the right machine number.  */
5772
5773 static bfd_boolean
5774 nds32_elf_object_p (bfd *abfd)
5775 {
5776   static unsigned int cur_arch = 0;
5777
5778   if (E_N1_ARCH != (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH))
5779     {
5780       /* E_N1_ARCH is a wild card, so it is set only when no others exist.  */
5781       cur_arch = (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH);
5782     }
5783
5784   switch (cur_arch)
5785     {
5786     default:
5787     case E_N1_ARCH:
5788       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1);
5789       break;
5790     case E_N1H_ARCH:
5791       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h);
5792       break;
5793     case E_NDS_ARCH_STAR_V2_0:
5794       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v2);
5795       break;
5796     case E_NDS_ARCH_STAR_V3_0:
5797       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3);
5798       break;
5799     case E_NDS_ARCH_STAR_V3_M:
5800       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3m);
5801       break;
5802     }
5803
5804   return TRUE;
5805 }
5806
5807 /* Store the machine number in the flags field.  */
5808
5809 static void
5810 nds32_elf_final_write_processing (bfd *abfd,
5811                                   bfd_boolean linker ATTRIBUTE_UNUSED)
5812 {
5813   unsigned long val;
5814   static unsigned int cur_mach = 0;
5815
5816   if (bfd_mach_n1 != bfd_get_mach (abfd))
5817     {
5818       cur_mach = bfd_get_mach (abfd);
5819     }
5820
5821   switch (cur_mach)
5822     {
5823     case bfd_mach_n1:
5824       /* Only happen when object is empty, since the case is abandon.  */
5825       val = E_N1_ARCH;
5826       val |= E_NDS_ABI_AABI;
5827       val |= E_NDS32_ELF_VER_1_4;
5828       break;
5829     case bfd_mach_n1h:
5830       val = E_N1H_ARCH;
5831       break;
5832     case bfd_mach_n1h_v2:
5833       val = E_NDS_ARCH_STAR_V2_0;
5834       break;
5835     case bfd_mach_n1h_v3:
5836       val = E_NDS_ARCH_STAR_V3_0;
5837       break;
5838     case bfd_mach_n1h_v3m:
5839       val = E_NDS_ARCH_STAR_V3_M;
5840       break;
5841     default:
5842       val = 0;
5843       break;
5844     }
5845
5846   elf_elfheader (abfd)->e_flags &= ~EF_NDS_ARCH;
5847   elf_elfheader (abfd)->e_flags |= val;
5848 }
5849
5850 /* Function to keep NDS32 specific file flags.  */
5851
5852 static bfd_boolean
5853 nds32_elf_set_private_flags (bfd *abfd, flagword flags)
5854 {
5855   BFD_ASSERT (!elf_flags_init (abfd)
5856               || elf_elfheader (abfd)->e_flags == flags);
5857
5858   elf_elfheader (abfd)->e_flags = flags;
5859   elf_flags_init (abfd) = TRUE;
5860   return TRUE;
5861 }
5862
5863 static unsigned int
5864 convert_e_flags (unsigned int e_flags, unsigned int arch)
5865 {
5866   if ((e_flags & EF_NDS_ARCH) == E_NDS_ARCH_STAR_V0_9)
5867     {
5868       /* From 0.9 to 1.0.  */
5869       e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V1_0;
5870
5871       /* Invert E_NDS32_HAS_NO_MAC_INST.  */
5872       e_flags ^= E_NDS32_HAS_NO_MAC_INST;
5873       if (arch == E_NDS_ARCH_STAR_V1_0)
5874         {
5875           /* Done.  */
5876           return e_flags;
5877         }
5878     }
5879
5880   /* From 1.0 to 2.0.  */
5881   e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V2_0;
5882
5883   /* Clear E_NDS32_HAS_MFUSR_PC_INST.  */
5884   e_flags &= ~E_NDS32_HAS_MFUSR_PC_INST;
5885
5886   /* Invert E_NDS32_HAS_NO_MAC_INST.  */
5887   e_flags ^= E_NDS32_HAS_NO_MAC_INST;
5888   return e_flags;
5889 }
5890
5891 static bfd_boolean
5892 nds32_check_vec_size (bfd *ibfd)
5893 {
5894   static unsigned int nds32_vec_size = 0;
5895
5896   asection *sec_t = NULL;
5897   bfd_byte *contents = NULL;
5898
5899   sec_t = bfd_get_section_by_name (ibfd, ".nds32_e_flags");
5900
5901   if (sec_t && sec_t->size >= 4)
5902     {
5903       /* Get vec_size in file.  */
5904       unsigned int flag_t;
5905
5906       nds32_get_section_contents (ibfd, sec_t, &contents, TRUE);
5907       flag_t = bfd_get_32 (ibfd, contents);
5908
5909       /* The value could only be 4 or 16.  */
5910
5911       if (!nds32_vec_size)
5912         /* Set if not set yet.  */
5913         nds32_vec_size = (flag_t & 0x3);
5914       else if (nds32_vec_size != (flag_t & 0x3))
5915         {
5916           _bfd_error_handler
5917             /* xgettext:c-format */
5918             (_("%B: ISR vector size mismatch"
5919                " with previous modules, previous %u-byte, current %u-byte"),
5920              ibfd,
5921              nds32_vec_size == 1 ? 4 : nds32_vec_size == 2 ? 16 : 0xffffffff,
5922              (flag_t & 0x3) == 1 ? 4 : (flag_t & 0x3) == 2 ? 16 : 0xffffffff);
5923           return FALSE;
5924         }
5925       else
5926         /* Only keep the first vec_size section.  */
5927         sec_t->flags |= SEC_EXCLUDE;
5928     }
5929
5930   return TRUE;
5931 }
5932
5933 /* Merge backend specific data from an object file to the output
5934    object file when linking.  */
5935
5936 static bfd_boolean
5937 nds32_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
5938 {
5939   bfd *obfd = info->output_bfd;
5940   flagword out_flags;
5941   flagword in_flags;
5942   flagword out_16regs;
5943   flagword in_no_mac;
5944   flagword out_no_mac;
5945   flagword in_16regs;
5946   flagword out_version;
5947   flagword in_version;
5948   flagword out_fpu_config;
5949   flagword in_fpu_config;
5950
5951   /* TODO: Revise to use object-attributes instead.  */
5952   if (!nds32_check_vec_size (ibfd))
5953     return FALSE;
5954
5955   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
5956       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
5957     return TRUE;
5958
5959   if (bfd_little_endian (ibfd) != bfd_little_endian (obfd))
5960     {
5961       _bfd_error_handler
5962         (_("%B: warning: Endian mismatch with previous modules."), ibfd);
5963
5964       bfd_set_error (bfd_error_bad_value);
5965       return FALSE;
5966     }
5967
5968   in_version = elf_elfheader (ibfd)->e_flags & EF_NDS32_ELF_VERSION;
5969   if (in_version == E_NDS32_ELF_VER_1_2)
5970     {
5971       _bfd_error_handler
5972         (_("%B: warning: Older version of object file encountered, "
5973            "Please recompile with current tool chain."), ibfd);
5974     }
5975
5976   /* We may need to merge V1 and V2 arch object files to V2.  */
5977   if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
5978       != (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
5979     {
5980       /* Need to convert version.  */
5981       if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
5982           == E_NDS_ARCH_STAR_RESERVED)
5983         {
5984           elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
5985         }
5986       else if ((elf_elfheader (obfd)->e_flags & EF_NDS_ARCH) == E_NDS_ARCH_STAR_V0_9
5987                || (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
5988                   > (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
5989         {
5990           elf_elfheader (obfd)->e_flags =
5991             convert_e_flags (elf_elfheader (obfd)->e_flags,
5992                              (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH));
5993         }
5994       else
5995         {
5996           elf_elfheader (ibfd)->e_flags =
5997             convert_e_flags (elf_elfheader (ibfd)->e_flags,
5998                              (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH));
5999         }
6000     }
6001
6002   /* Extract some flags.  */
6003   in_flags = elf_elfheader (ibfd)->e_flags
6004              & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
6005                   | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
6006
6007   /* The following flags need special treatment.  */
6008   in_16regs = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
6009   in_no_mac = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
6010   in_fpu_config = elf_elfheader (ibfd)->e_flags & E_NDS32_FPU_REG_CONF;
6011
6012   /* Extract some flags.  */
6013   out_flags = elf_elfheader (obfd)->e_flags
6014               & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
6015                    | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
6016
6017   /* The following flags need special treatment.  */
6018   out_16regs = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
6019   out_no_mac = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
6020   out_fpu_config = elf_elfheader (obfd)->e_flags & E_NDS32_FPU_REG_CONF;
6021   out_version = elf_elfheader (obfd)->e_flags & EF_NDS32_ELF_VERSION;
6022   if (!elf_flags_init (obfd))
6023     {
6024       /* If the input is the default architecture then do not
6025          bother setting the flags for the output architecture,
6026          instead allow future merges to do this.  If no future
6027          merges ever set these flags then they will retain their
6028          unitialised values, which surprise surprise, correspond
6029          to the default values.  */
6030       if (bfd_get_arch_info (ibfd)->the_default)
6031         return TRUE;
6032
6033       elf_flags_init (obfd) = TRUE;
6034       elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
6035
6036       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
6037           && bfd_get_arch_info (obfd)->the_default)
6038         {
6039           return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
6040                                     bfd_get_mach (ibfd));
6041         }
6042
6043       return TRUE;
6044     }
6045
6046   /* Check flag compatibility.  */
6047   if ((in_flags & EF_NDS_ABI) != (out_flags & EF_NDS_ABI))
6048     {
6049       _bfd_error_handler
6050         (_("%B: error: ABI mismatch with previous modules."), ibfd);
6051
6052       bfd_set_error (bfd_error_bad_value);
6053       return FALSE;
6054     }
6055
6056   if ((in_flags & EF_NDS_ARCH) != (out_flags & EF_NDS_ARCH))
6057     {
6058       if (((in_flags & EF_NDS_ARCH) != E_N1_ARCH))
6059         {
6060           _bfd_error_handler
6061             (_("%B: error: Instruction set mismatch with previous modules."), ibfd);
6062
6063           bfd_set_error (bfd_error_bad_value);
6064           return FALSE;
6065         }
6066     }
6067
6068   /* When linking with V1.2 and V1.3 objects together the output is V1.2.
6069      and perf ext1 and DIV are mergerd to perf ext1.  */
6070   if (in_version == E_NDS32_ELF_VER_1_2 || out_version == E_NDS32_ELF_VER_1_2)
6071     {
6072       elf_elfheader (obfd)->e_flags =
6073         (in_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6074         | (out_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6075         | (((in_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6076            ?  E_NDS32_HAS_EXT_INST : 0)
6077         | (((out_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6078            ?  E_NDS32_HAS_EXT_INST : 0)
6079         | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
6080         | ((in_version > out_version) ? out_version : in_version);
6081     }
6082   else
6083     {
6084       if (in_version != out_version)
6085         _bfd_error_handler
6086           /* xgettext:c-format */
6087           (_("%B: warning: Incompatible elf-versions %s and  %s."),
6088            ibfd, nds32_elfver_strtab[out_version],
6089            nds32_elfver_strtab[in_version]);
6090
6091       elf_elfheader (obfd)->e_flags = in_flags | out_flags
6092         | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
6093         | (in_fpu_config > out_fpu_config ? in_fpu_config : out_fpu_config)
6094         | (in_version > out_version ?  out_version : in_version);
6095     }
6096
6097   return TRUE;
6098 }
6099
6100 /* Display the flags field.  */
6101
6102 static bfd_boolean
6103 nds32_elf_print_private_bfd_data (bfd *abfd, void *ptr)
6104 {
6105   FILE *file = (FILE *) ptr;
6106
6107   BFD_ASSERT (abfd != NULL && ptr != NULL);
6108
6109   _bfd_elf_print_private_bfd_data (abfd, ptr);
6110
6111   fprintf (file, _("private flags = %lx"), elf_elfheader (abfd)->e_flags);
6112
6113   switch (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH)
6114     {
6115     default:
6116     case E_N1_ARCH:
6117       fprintf (file, _(": n1 instructions"));
6118       break;
6119     case E_N1H_ARCH:
6120       fprintf (file, _(": n1h instructions"));
6121       break;
6122     }
6123
6124   fputc ('\n', file);
6125
6126   return TRUE;
6127 }
6128
6129 static unsigned int
6130 nds32_elf_action_discarded (asection *sec)
6131 {
6132
6133   if (strncmp
6134       (".gcc_except_table", sec->name, sizeof (".gcc_except_table") - 1) == 0)
6135     return 0;
6136
6137   return _bfd_elf_default_action_discarded (sec);
6138 }
6139
6140 static asection *
6141 nds32_elf_gc_mark_hook (asection *sec, struct bfd_link_info *info,
6142                         Elf_Internal_Rela *rel, struct elf_link_hash_entry *h,
6143                         Elf_Internal_Sym *sym)
6144 {
6145   if (h != NULL)
6146     switch (ELF32_R_TYPE (rel->r_info))
6147       {
6148       case R_NDS32_GNU_VTINHERIT:
6149       case R_NDS32_GNU_VTENTRY:
6150       case R_NDS32_RELA_GNU_VTINHERIT:
6151       case R_NDS32_RELA_GNU_VTENTRY:
6152         return NULL;
6153       }
6154
6155   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6156 }
6157
6158 static bfd_boolean
6159 nds32_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, asection *sec,
6160                          const Elf_Internal_Rela *relocs)
6161 {
6162   /* Update the got entry reference counts for the section being removed.  */
6163   Elf_Internal_Shdr *symtab_hdr;
6164   struct elf_link_hash_entry **sym_hashes;
6165   bfd_signed_vma *local_got_refcounts;
6166   const Elf_Internal_Rela *rel, *relend;
6167
6168   elf_section_data (sec)->local_dynrel = NULL;
6169
6170   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6171   sym_hashes = elf_sym_hashes (abfd);
6172   local_got_refcounts = elf_local_got_refcounts (abfd);
6173
6174   relend = relocs + sec->reloc_count;
6175   for (rel = relocs; rel < relend; rel++)
6176     {
6177       unsigned long r_symndx;
6178       struct elf_link_hash_entry *h = NULL;
6179
6180       r_symndx = ELF32_R_SYM (rel->r_info);
6181       if (r_symndx >= symtab_hdr->sh_info)
6182         {
6183           /* External symbol.  */
6184           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6185           while (h->root.type == bfd_link_hash_indirect
6186                  || h->root.type == bfd_link_hash_warning)
6187             h = (struct elf_link_hash_entry *) h->root.u.i.link;
6188         }
6189
6190       switch (ELF32_R_TYPE (rel->r_info))
6191         {
6192         case R_NDS32_GOT_HI20:
6193         case R_NDS32_GOT_LO12:
6194         case R_NDS32_GOT_LO15:
6195         case R_NDS32_GOT_LO19:
6196         case R_NDS32_GOT17S2_RELA:
6197         case R_NDS32_GOT15S2_RELA:
6198         case R_NDS32_GOTOFF:
6199         case R_NDS32_GOTOFF_HI20:
6200         case R_NDS32_GOTOFF_LO12:
6201         case R_NDS32_GOTOFF_LO15:
6202         case R_NDS32_GOTOFF_LO19:
6203         case R_NDS32_GOT20:
6204         case R_NDS32_GOTPC_HI20:
6205         case R_NDS32_GOTPC_LO12:
6206         case R_NDS32_GOTPC20:
6207           if (h != NULL)
6208             {
6209               if (h->got.refcount > 0)
6210                 h->got.refcount--;
6211             }
6212           else
6213             {
6214               if (local_got_refcounts && local_got_refcounts[r_symndx] > 0)
6215                 local_got_refcounts[r_symndx]--;
6216             }
6217           break;
6218
6219         case R_NDS32_16_RELA:
6220         case R_NDS32_20_RELA:
6221         case R_NDS32_5_RELA:
6222         case R_NDS32_32_RELA:
6223         case R_NDS32_HI20_RELA:
6224         case R_NDS32_LO12S3_RELA:
6225         case R_NDS32_LO12S2_RELA:
6226         case R_NDS32_LO12S2_DP_RELA:
6227         case R_NDS32_LO12S2_SP_RELA:
6228         case R_NDS32_LO12S1_RELA:
6229         case R_NDS32_LO12S0_RELA:
6230         case R_NDS32_LO12S0_ORI_RELA:
6231         case R_NDS32_SDA16S3_RELA:
6232         case R_NDS32_SDA17S2_RELA:
6233         case R_NDS32_SDA18S1_RELA:
6234         case R_NDS32_SDA19S0_RELA:
6235         case R_NDS32_SDA15S3_RELA:
6236         case R_NDS32_SDA15S2_RELA:
6237         case R_NDS32_SDA12S2_DP_RELA:
6238         case R_NDS32_SDA12S2_SP_RELA:
6239         case R_NDS32_SDA15S1_RELA:
6240         case R_NDS32_SDA15S0_RELA:
6241         case R_NDS32_SDA_FP7U2_RELA:
6242         case R_NDS32_15_PCREL_RELA:
6243         case R_NDS32_17_PCREL_RELA:
6244         case R_NDS32_25_PCREL_RELA:
6245           if (h != NULL)
6246             {
6247               struct elf_nds32_link_hash_entry *eh;
6248               struct elf_nds32_dyn_relocs **pp;
6249               struct elf_nds32_dyn_relocs *p;
6250
6251               if (!bfd_link_pic (info) && h->plt.refcount > 0)
6252                 h->plt.refcount -= 1;
6253
6254               eh = (struct elf_nds32_link_hash_entry *) h;
6255
6256               for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
6257                 if (p->sec == sec)
6258                   {
6259                     if (ELF32_R_TYPE (rel->r_info) == R_NDS32_15_PCREL_RELA
6260                         || ELF32_R_TYPE (rel->r_info) == R_NDS32_17_PCREL_RELA
6261                         || ELF32_R_TYPE (rel->r_info) == R_NDS32_25_PCREL_RELA)
6262                       p->pc_count -= 1;
6263                     p->count -= 1;
6264                     if (p->count == 0)
6265                       *pp = p->next;
6266                     break;
6267                   }
6268             }
6269           break;
6270
6271         case R_NDS32_9_PLTREL:
6272         case R_NDS32_25_PLTREL:
6273           if (h != NULL)
6274             {
6275               if (h->plt.refcount > 0)
6276                 h->plt.refcount--;
6277             }
6278           break;
6279
6280         default:
6281           break;
6282         }
6283     }
6284
6285   return TRUE;
6286 }
6287
6288 /* Look through the relocs for a section during the first phase.
6289    Since we don't do .gots or .plts, we just need to consider the
6290    virtual table relocs for gc.  */
6291
6292 static bfd_boolean
6293 nds32_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
6294                         asection *sec, const Elf_Internal_Rela *relocs)
6295 {
6296   Elf_Internal_Shdr *symtab_hdr;
6297   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
6298   const Elf_Internal_Rela *rel;
6299   const Elf_Internal_Rela *rel_end;
6300   struct elf_nds32_link_hash_table *htab;
6301   bfd *dynobj;
6302   asection *sreloc = NULL;
6303
6304   if (bfd_link_relocatable (info))
6305     return TRUE;
6306
6307   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6308   sym_hashes = elf_sym_hashes (abfd);
6309   sym_hashes_end =
6310     sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
6311   if (!elf_bad_symtab (abfd))
6312     sym_hashes_end -= symtab_hdr->sh_info;
6313
6314   htab = nds32_elf_hash_table (info);
6315   dynobj = htab->root.dynobj;
6316
6317   rel_end = relocs + sec->reloc_count;
6318   for (rel = relocs; rel < rel_end; rel++)
6319     {
6320       enum elf_nds32_reloc_type r_type;
6321       struct elf_link_hash_entry *h;
6322       unsigned long r_symndx;
6323       int tls_type, old_tls_type;
6324
6325       r_symndx = ELF32_R_SYM (rel->r_info);
6326       r_type = ELF32_R_TYPE (rel->r_info);
6327       if (r_symndx < symtab_hdr->sh_info)
6328         h = NULL;
6329       else
6330         {
6331           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6332           while (h->root.type == bfd_link_hash_indirect
6333                  || h->root.type == bfd_link_hash_warning)
6334             h = (struct elf_link_hash_entry *) h->root.u.i.link;
6335         }
6336
6337       /* Some relocs require a global offset table.  We create
6338          got section here, since these relocation need got section
6339          and it is not created yet.  */
6340       if (htab->root.sgot == NULL)
6341         {
6342           switch (r_type)
6343             {
6344             case R_NDS32_GOT_HI20:
6345             case R_NDS32_GOT_LO12:
6346             case R_NDS32_GOT_LO15:
6347             case R_NDS32_GOT_LO19:
6348             case R_NDS32_GOT17S2_RELA:
6349             case R_NDS32_GOT15S2_RELA:
6350             case R_NDS32_GOTOFF:
6351             case R_NDS32_GOTOFF_HI20:
6352             case R_NDS32_GOTOFF_LO12:
6353             case R_NDS32_GOTOFF_LO15:
6354             case R_NDS32_GOTOFF_LO19:
6355             case R_NDS32_GOTPC20:
6356             case R_NDS32_GOTPC_HI20:
6357             case R_NDS32_GOTPC_LO12:
6358             case R_NDS32_GOT20:
6359             case R_NDS32_TLS_IE_HI20:
6360             case R_NDS32_TLS_IE_LO12S2:
6361               if (dynobj == NULL)
6362                 htab->root.dynobj = dynobj = abfd;
6363               if (!_bfd_elf_create_got_section (dynobj, info))
6364                 return FALSE;
6365               break;
6366
6367             default:
6368               break;
6369             }
6370         }
6371
6372       switch ((int) r_type)
6373         {
6374         case R_NDS32_GOT_HI20:
6375         case R_NDS32_GOT_LO12:
6376         case R_NDS32_GOT_LO15:
6377         case R_NDS32_GOT_LO19:
6378         case R_NDS32_GOT20:
6379         case R_NDS32_TLS_IE_HI20:
6380         case R_NDS32_TLS_IE_LO12S2:
6381           switch (r_type)
6382             {
6383             case R_NDS32_TLS_IE_HI20:
6384             case R_NDS32_TLS_IE_LO12S2:
6385               tls_type = GOT_TLS_IE;
6386               break;
6387             default:
6388               tls_type = GOT_NORMAL;
6389               break;
6390             }
6391           if (h != NULL)
6392             {
6393               old_tls_type = elf32_nds32_hash_entry (h)->tls_type;
6394               h->got.refcount += 1;
6395             }
6396           else
6397             {
6398               bfd_signed_vma *local_got_refcounts;
6399
6400               /* This is a global offset table entry for a local
6401                  symbol.  */
6402               local_got_refcounts = elf_local_got_refcounts (abfd);
6403               if (local_got_refcounts == NULL)
6404                 {
6405                   bfd_size_type size;
6406
6407                   size = symtab_hdr->sh_info;
6408                   size *= sizeof (bfd_signed_vma);
6409                   local_got_refcounts = (bfd_signed_vma *) bfd_zalloc (abfd, size);
6410                   if (local_got_refcounts == NULL)
6411                     return FALSE;
6412                   elf_local_got_refcounts (abfd) = local_got_refcounts;
6413                 }
6414               local_got_refcounts[r_symndx] += 1;
6415               old_tls_type = elf32_nds32_local_got_tls_type (abfd)[r_symndx];
6416             }
6417
6418           /* We will already have issued an error message if there
6419              is a TLS/non-TLS mismatch, based on the symbol
6420              type.  So just combine any TLS types needed.  */
6421           if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
6422               && tls_type != GOT_NORMAL)
6423             tls_type |= old_tls_type;
6424
6425           if (old_tls_type != tls_type)
6426             {
6427               if (h != NULL)
6428                 elf32_nds32_hash_entry (h)->tls_type = tls_type;
6429               else
6430                 elf32_nds32_local_got_tls_type (abfd)[r_symndx] = tls_type;
6431             }
6432           break;
6433         case R_NDS32_9_PLTREL:
6434         case R_NDS32_25_PLTREL:
6435         case R_NDS32_PLTREL_HI20:
6436         case R_NDS32_PLTREL_LO12:
6437         case R_NDS32_PLT_GOTREL_HI20:
6438         case R_NDS32_PLT_GOTREL_LO12:
6439         case R_NDS32_PLT_GOTREL_LO15:
6440         case R_NDS32_PLT_GOTREL_LO19:
6441         case R_NDS32_PLT_GOTREL_LO20:
6442
6443           /* This symbol requires a procedure linkage table entry.  We
6444              actually build the entry in adjust_dynamic_symbol,
6445              because this might be a case of linking PIC code without
6446              linking in any dynamic objects, in which case we don't
6447              need to generate a procedure linkage table after all.  */
6448
6449           /* If this is a local symbol, we resolve it directly without
6450              creating a procedure linkage table entry.  */
6451           if (h == NULL)
6452             continue;
6453
6454           if (h->forced_local)
6455             break;
6456
6457           elf32_nds32_hash_entry (h)->tls_type = GOT_NORMAL;
6458           h->needs_plt = 1;
6459           h->plt.refcount += 1;
6460           break;
6461
6462         case R_NDS32_16_RELA:
6463         case R_NDS32_20_RELA:
6464         case R_NDS32_5_RELA:
6465         case R_NDS32_32_RELA:
6466         case R_NDS32_HI20_RELA:
6467         case R_NDS32_LO12S3_RELA:
6468         case R_NDS32_LO12S2_RELA:
6469         case R_NDS32_LO12S2_DP_RELA:
6470         case R_NDS32_LO12S2_SP_RELA:
6471         case R_NDS32_LO12S1_RELA:
6472         case R_NDS32_LO12S0_RELA:
6473         case R_NDS32_LO12S0_ORI_RELA:
6474         case R_NDS32_SDA16S3_RELA:
6475         case R_NDS32_SDA17S2_RELA:
6476         case R_NDS32_SDA18S1_RELA:
6477         case R_NDS32_SDA19S0_RELA:
6478         case R_NDS32_SDA15S3_RELA:
6479         case R_NDS32_SDA15S2_RELA:
6480         case R_NDS32_SDA12S2_DP_RELA:
6481         case R_NDS32_SDA12S2_SP_RELA:
6482         case R_NDS32_SDA15S1_RELA:
6483         case R_NDS32_SDA15S0_RELA:
6484         case R_NDS32_SDA_FP7U2_RELA:
6485         case R_NDS32_15_PCREL_RELA:
6486         case R_NDS32_17_PCREL_RELA:
6487         case R_NDS32_25_PCREL_RELA:
6488
6489           if (h != NULL && !bfd_link_pic (info))
6490             {
6491               h->non_got_ref = 1;
6492               h->plt.refcount += 1;
6493             }
6494
6495           /* If we are creating a shared library, and this is a reloc against
6496              a global symbol, or a non PC relative reloc against a local
6497              symbol, then we need to copy the reloc into the shared library.
6498              However, if we are linking with -Bsymbolic, we do not need to
6499              copy a reloc against a global symbol which is defined in an
6500              object we are including in the link (i.e., DEF_REGULAR is set).
6501              At this point we have not seen all the input files, so it is
6502              possible that DEF_REGULAR is not set now but will be set later
6503              (it is never cleared).  We account for that possibility below by
6504              storing information in the dyn_relocs field of the hash table
6505              entry.  A similar situation occurs when creating shared libraries
6506              and symbol visibility changes render the symbol local.
6507
6508              If on the other hand, we are creating an executable, we may need
6509              to keep relocations for symbols satisfied by a dynamic library
6510              if we manage to avoid copy relocs for the symbol.  */
6511           if ((bfd_link_pic (info)
6512                && (sec->flags & SEC_ALLOC) != 0
6513                && ((r_type != R_NDS32_25_PCREL_RELA
6514                     && r_type != R_NDS32_15_PCREL_RELA
6515                     && r_type != R_NDS32_17_PCREL_RELA
6516                     && !(r_type == R_NDS32_32_RELA
6517                          && strcmp (sec->name, ".eh_frame") == 0))
6518                    || (h != NULL
6519                        && (!info->symbolic
6520                            || h->root.type == bfd_link_hash_defweak
6521                            || !h->def_regular))))
6522               || (!bfd_link_pic (info)
6523                   && (sec->flags & SEC_ALLOC) != 0
6524                   && h != NULL
6525                   && (h->root.type == bfd_link_hash_defweak
6526                       || !h->def_regular)))
6527             {
6528               struct elf_nds32_dyn_relocs *p;
6529               struct elf_nds32_dyn_relocs **head;
6530
6531               if (dynobj == NULL)
6532                 htab->root.dynobj = dynobj = abfd;
6533
6534               /* When creating a shared object, we must copy these
6535                  relocs into the output file.  We create a reloc
6536                  section in dynobj and make room for the reloc.  */
6537               if (sreloc == NULL)
6538                 {
6539                   const char *name;
6540
6541                   name = bfd_elf_string_from_elf_section
6542                     (abfd, elf_elfheader (abfd)->e_shstrndx,
6543                      elf_section_data (sec)->rela.hdr->sh_name);
6544                   if (name == NULL)
6545                     return FALSE;
6546
6547                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
6548                               && strcmp (bfd_get_section_name (abfd, sec),
6549                                          name + 5) == 0);
6550
6551                   sreloc = bfd_get_section_by_name (dynobj, name);
6552                   if (sreloc == NULL)
6553                     {
6554                       flagword flags;
6555
6556                       sreloc = bfd_make_section (dynobj, name);
6557                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
6558                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
6559                       if ((sec->flags & SEC_ALLOC) != 0)
6560                         flags |= SEC_ALLOC | SEC_LOAD;
6561                       if (sreloc == NULL
6562                           || !bfd_set_section_flags (dynobj, sreloc, flags)
6563                           || !bfd_set_section_alignment (dynobj, sreloc, 2))
6564                         return FALSE;
6565
6566                       elf_section_type (sreloc) = SHT_RELA;
6567                     }
6568                   elf_section_data (sec)->sreloc = sreloc;
6569                 }
6570
6571               /* If this is a global symbol, we count the number of
6572                  relocations we need for this symbol.  */
6573               if (h != NULL)
6574                 head = &((struct elf_nds32_link_hash_entry *) h)->dyn_relocs;
6575               else
6576                 {
6577                   asection *s;
6578                   void *vpp;
6579
6580                   Elf_Internal_Sym *isym;
6581                   isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx);
6582                   if (isym == NULL)
6583                     return FALSE;
6584
6585                   /* Track dynamic relocs needed for local syms too.  */
6586                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
6587                   if (s == NULL)
6588                     return FALSE;
6589
6590                   vpp = &elf_section_data (s)->local_dynrel;
6591                   head = (struct elf_nds32_dyn_relocs **) vpp;
6592                 }
6593
6594               p = *head;
6595               if (p == NULL || p->sec != sec)
6596                 {
6597                   bfd_size_type amt = sizeof (*p);
6598                   p = (struct elf_nds32_dyn_relocs *) bfd_alloc (dynobj, amt);
6599                   if (p == NULL)
6600                     return FALSE;
6601                   p->next = *head;
6602                   *head = p;
6603                   p->sec = sec;
6604                   p->count = 0;
6605                   p->pc_count = 0;
6606                 }
6607
6608               p->count += 1;
6609               if (ELF32_R_TYPE (rel->r_info) == R_NDS32_25_PCREL_RELA
6610                   || ELF32_R_TYPE (rel->r_info) == R_NDS32_15_PCREL_RELA
6611                   || ELF32_R_TYPE (rel->r_info) == R_NDS32_17_PCREL_RELA)
6612                 p->pc_count += 1;
6613             }
6614           break;
6615
6616           /* This relocation describes the C++ object vtable hierarchy.
6617              Reconstruct it for later use during GC.  */
6618         case R_NDS32_RELA_GNU_VTINHERIT:
6619         case R_NDS32_GNU_VTINHERIT:
6620           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
6621             return FALSE;
6622           break;
6623
6624           /* This relocation describes which C++ vtable entries are actually
6625              used.  Record for later use during GC.  */
6626         case R_NDS32_GNU_VTENTRY:
6627           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
6628             return FALSE;
6629           break;
6630         case R_NDS32_RELA_GNU_VTENTRY:
6631           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
6632             return FALSE;
6633           break;
6634         }
6635     }
6636
6637   return TRUE;
6638 }
6639
6640 /* Write VAL in uleb128 format to P, returning a pointer to the
6641    following byte.
6642    This code is copied from elf-attr.c.  */
6643
6644 static bfd_byte *
6645 write_uleb128 (bfd_byte *p, unsigned int val)
6646 {
6647   bfd_byte c;
6648   do
6649     {
6650       c = val & 0x7f;
6651       val >>= 7;
6652       if (val)
6653         c |= 0x80;
6654       *(p++) = c;
6655     }
6656   while (val);
6657   return p;
6658 }
6659
6660 static bfd_signed_vma
6661 calculate_offset (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
6662                   Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr,
6663                   int *pic_ext_target)
6664 {
6665   bfd_signed_vma foff;
6666   bfd_vma symval, addend;
6667   asection *sym_sec;
6668
6669   /* Get the value of the symbol referred to by the reloc.  */
6670   if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
6671     {
6672       Elf_Internal_Sym *isym;
6673
6674       /* A local symbol.  */
6675       isym = isymbuf + ELF32_R_SYM (irel->r_info);
6676
6677       if (isym->st_shndx == SHN_UNDEF)
6678         sym_sec = bfd_und_section_ptr;
6679       else if (isym->st_shndx == SHN_ABS)
6680         sym_sec = bfd_abs_section_ptr;
6681       else if (isym->st_shndx == SHN_COMMON)
6682         sym_sec = bfd_com_section_ptr;
6683       else
6684         sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
6685       symval = isym->st_value + sym_sec->output_section->vma
6686                + sym_sec->output_offset;
6687     }
6688   else
6689     {
6690       unsigned long indx;
6691       struct elf_link_hash_entry *h;
6692       bfd *owner;
6693
6694       /* An external symbol.  */
6695       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
6696       h = elf_sym_hashes (abfd)[indx];
6697       BFD_ASSERT (h != NULL);
6698
6699       if (h->root.type != bfd_link_hash_defined
6700           && h->root.type != bfd_link_hash_defweak)
6701         /* This appears to be a reference to an undefined
6702            symbol.  Just ignore it--it will be caught by the
6703            regular reloc processing.  */
6704         return 0;
6705       owner = h->root.u.def.section->owner;
6706       if (owner && (elf_elfheader (owner)->e_flags & E_NDS32_HAS_PIC))
6707         *pic_ext_target = 1;
6708
6709       if (h->root.u.def.section->flags & SEC_MERGE)
6710         {
6711           sym_sec = h->root.u.def.section;
6712           symval = _bfd_merged_section_offset (abfd, &sym_sec,
6713                                                elf_section_data (sym_sec)->sec_info,
6714                                                h->root.u.def.value);
6715           symval = symval + sym_sec->output_section->vma
6716                    + sym_sec->output_offset;
6717         }
6718       else
6719         symval = (h->root.u.def.value
6720                   + h->root.u.def.section->output_section->vma
6721                   + h->root.u.def.section->output_offset);
6722     }
6723
6724   addend = irel->r_addend;
6725
6726   foff = (symval + addend
6727           - (irel->r_offset + sec->output_section->vma + sec->output_offset));
6728   return foff;
6729 }
6730
6731 static bfd_vma
6732 calculate_plt_memory_address (bfd *abfd, struct bfd_link_info *link_info,
6733                               Elf_Internal_Sym *isymbuf,
6734                               Elf_Internal_Rela *irel,
6735                               Elf_Internal_Shdr *symtab_hdr)
6736 {
6737   bfd_vma symval;
6738
6739   if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
6740     {
6741       Elf_Internal_Sym *isym;
6742       asection *sym_sec;
6743       /* A local symbol.  */
6744       isym = isymbuf + ELF32_R_SYM (irel->r_info);
6745
6746       if (isym->st_shndx == SHN_UNDEF)
6747         sym_sec = bfd_und_section_ptr;
6748       else if (isym->st_shndx == SHN_ABS)
6749         sym_sec = bfd_abs_section_ptr;
6750       else if (isym->st_shndx == SHN_COMMON)
6751         sym_sec = bfd_com_section_ptr;
6752       else
6753         sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
6754       symval = isym->st_value + sym_sec->output_section->vma
6755                + sym_sec->output_offset;
6756     }
6757   else
6758     {
6759       unsigned long indx;
6760       struct elf_link_hash_entry *h;
6761       struct elf_nds32_link_hash_table *htab;
6762       asection *splt;
6763
6764       /* An external symbol.  */
6765       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
6766       h = elf_sym_hashes (abfd)[indx];
6767       BFD_ASSERT (h != NULL);
6768       htab = nds32_elf_hash_table (link_info);
6769       splt = htab->root.splt;
6770
6771       while (h->root.type == bfd_link_hash_indirect
6772              || h->root.type == bfd_link_hash_warning)
6773         h = (struct elf_link_hash_entry *) h->root.u.i.link;
6774
6775       if (h->plt.offset == (bfd_vma) - 1)
6776         {
6777           if (h->root.type != bfd_link_hash_defined
6778               && h->root.type != bfd_link_hash_defweak)
6779             /* This appears to be a reference to an undefined
6780              * symbol.  Just ignore it--it will be caught by the
6781              * regular reloc processing.  */
6782             return 0;
6783           symval = (h->root.u.def.value
6784                     + h->root.u.def.section->output_section->vma
6785                     + h->root.u.def.section->output_offset);
6786         }
6787       else
6788         symval = splt->output_section->vma + h->plt.offset;
6789     }
6790
6791   return symval;
6792 }
6793
6794 static bfd_signed_vma
6795 calculate_plt_offset (bfd *abfd, asection *sec, struct bfd_link_info *link_info,
6796                       Elf_Internal_Sym *isymbuf, Elf_Internal_Rela *irel,
6797                       Elf_Internal_Shdr *symtab_hdr)
6798 {
6799   bfd_vma foff;
6800   if ((foff = calculate_plt_memory_address (abfd, link_info, isymbuf, irel,
6801                                             symtab_hdr)) == 0)
6802     return 0;
6803   else
6804     return foff - (irel->r_offset
6805                    + sec->output_section->vma + sec->output_offset);
6806 }
6807 \f
6808 /* Convert a 32-bit instruction to 16-bit one.
6809    INSN is the input 32-bit instruction, INSN16 is the output 16-bit
6810    instruction.  If INSN_TYPE is not NULL, it the CGEN instruction
6811    type of INSN16.  Return 1 if successful.  */
6812
6813 static int
6814 nds32_convert_32_to_16_alu1 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
6815                              int *pinsn_type)
6816 {
6817   uint16_t insn16 = 0;
6818   int insn_type = 0;
6819   unsigned long mach = bfd_get_mach (abfd);
6820
6821   if (N32_SH5 (insn) != 0)
6822     return 0;
6823
6824   switch (N32_SUB5 (insn))
6825     {
6826     case N32_ALU1_ADD_SLLI:
6827     case N32_ALU1_ADD_SRLI:
6828       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
6829         {
6830           insn16 = N16_TYPE333 (ADD333, N32_RT5 (insn), N32_RA5 (insn),
6831                                 N32_RB5 (insn));
6832           insn_type = NDS32_INSN_ADD333;
6833         }
6834       else if (N32_IS_RT4 (insn))
6835         {
6836           if (N32_RT5 (insn) == N32_RA5 (insn))
6837             insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RB5 (insn));
6838           else if (N32_RT5 (insn) == N32_RB5 (insn))
6839             insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RA5 (insn));
6840           insn_type = NDS32_INSN_ADD45;
6841         }
6842       break;
6843
6844     case N32_ALU1_SUB_SLLI:
6845     case N32_ALU1_SUB_SRLI:
6846       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
6847         {
6848           insn16 = N16_TYPE333 (SUB333, N32_RT5 (insn), N32_RA5 (insn),
6849                                 N32_RB5 (insn));
6850           insn_type = NDS32_INSN_SUB333;
6851         }
6852       else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
6853         {
6854           insn16 = N16_TYPE45 (SUB45, N32_RT54 (insn), N32_RB5 (insn));
6855           insn_type = NDS32_INSN_SUB45;
6856         }
6857       break;
6858
6859     case N32_ALU1_AND_SLLI:
6860     case N32_ALU1_AND_SRLI:
6861       /* and $rt, $rt, $rb -> and33 for v3, v3m.  */
6862       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
6863           && N32_IS_RB3 (insn))
6864         {
6865           if (N32_RT5 (insn) == N32_RA5 (insn))
6866             insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RB5 (insn));
6867           else if (N32_RT5 (insn) == N32_RB5 (insn))
6868             insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RA5 (insn));
6869           if (insn16)
6870             insn_type = NDS32_INSN_AND33;
6871         }
6872       break;
6873
6874     case N32_ALU1_XOR_SLLI:
6875     case N32_ALU1_XOR_SRLI:
6876       /* xor $rt, $rt, $rb -> xor33 for v3, v3m.  */
6877       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
6878           && N32_IS_RB3 (insn))
6879         {
6880           if (N32_RT5 (insn) == N32_RA5 (insn))
6881             insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RB5 (insn));
6882           else if (N32_RT5 (insn) == N32_RB5 (insn))
6883             insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RA5 (insn));
6884           if (insn16)
6885             insn_type = NDS32_INSN_XOR33;
6886         }
6887       break;
6888
6889     case N32_ALU1_OR_SLLI:
6890     case N32_ALU1_OR_SRLI:
6891       /* or $rt, $rt, $rb -> or33 for v3, v3m.  */
6892       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
6893           && N32_IS_RB3 (insn))
6894         {
6895           if (N32_RT5 (insn) == N32_RA5 (insn))
6896             insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RB5 (insn));
6897           else if (N32_RT5 (insn) == N32_RB5 (insn))
6898             insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RA5 (insn));
6899           if (insn16)
6900             insn_type = NDS32_INSN_OR33;
6901         }
6902       break;
6903     case N32_ALU1_NOR:
6904       /* nor $rt, $ra, $ra -> not33 for v3, v3m.  */
6905       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RB3 (insn)
6906           && N32_RA5 (insn) == N32_RB5 (insn))
6907         {
6908           insn16 = N16_MISC33 (NOT33, N32_RT5 (insn), N32_RA5 (insn));
6909           insn_type = NDS32_INSN_NOT33;
6910         }
6911       break;
6912     case N32_ALU1_SRAI:
6913       if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
6914         {
6915           insn16 = N16_TYPE45 (SRAI45, N32_RT54 (insn), N32_UB5 (insn));
6916           insn_type = NDS32_INSN_SRAI45;
6917         }
6918       break;
6919
6920     case N32_ALU1_SRLI:
6921       if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
6922         {
6923           insn16 = N16_TYPE45 (SRLI45, N32_RT54 (insn), N32_UB5 (insn));
6924           insn_type = NDS32_INSN_SRLI45;
6925         }
6926       break;
6927
6928     case N32_ALU1_SLLI:
6929       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_UB5 (insn) < 8)
6930         {
6931           insn16 = N16_TYPE333 (SLLI333, N32_RT5 (insn), N32_RA5 (insn),
6932                                 N32_UB5 (insn));
6933           insn_type = NDS32_INSN_SLLI333;
6934         }
6935       break;
6936
6937     case N32_ALU1_ZEH:
6938       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
6939         {
6940           insn16 = N16_BFMI333 (ZEH33, N32_RT5 (insn), N32_RA5 (insn));
6941           insn_type = NDS32_INSN_ZEH33;
6942         }
6943       break;
6944
6945     case N32_ALU1_SEB:
6946       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
6947         {
6948           insn16 = N16_BFMI333 (SEB33, N32_RT5 (insn), N32_RA5 (insn));
6949           insn_type = NDS32_INSN_SEB33;
6950         }
6951       break;
6952
6953     case N32_ALU1_SEH:
6954       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
6955         {
6956           insn16 = N16_BFMI333 (SEH33, N32_RT5 (insn), N32_RA5 (insn));
6957           insn_type = NDS32_INSN_SEH33;
6958         }
6959       break;
6960
6961     case N32_ALU1_SLT:
6962       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
6963         {
6964           /* Implicit r15.  */
6965           insn16 = N16_TYPE45 (SLT45, N32_RA54 (insn), N32_RB5 (insn));
6966           insn_type = NDS32_INSN_SLT45;
6967         }
6968       break;
6969
6970     case N32_ALU1_SLTS:
6971       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
6972         {
6973           /* Implicit r15.  */
6974           insn16 = N16_TYPE45 (SLTS45, N32_RA54 (insn), N32_RB5 (insn));
6975           insn_type = NDS32_INSN_SLTS45;
6976         }
6977       break;
6978     }
6979
6980   if ((insn16 & 0x8000) == 0)
6981     return 0;
6982
6983   if (pinsn16)
6984     *pinsn16 = insn16;
6985   if (pinsn_type)
6986     *pinsn_type = insn_type;
6987   return 1;
6988 }
6989
6990 static int
6991 nds32_convert_32_to_16_alu2 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
6992                              int *pinsn_type)
6993 {
6994   uint16_t insn16 = 0;
6995   int insn_type;
6996   unsigned long mach = bfd_get_mach (abfd);
6997
6998   /* TODO: bset, bclr, btgl, btst.  */
6999   if (__GF (insn, 6, 4) != 0)
7000     return 0;
7001
7002   switch (N32_IMMU (insn, 6))
7003     {
7004     case N32_ALU2_MUL:
7005       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7006           && N32_IS_RB3 (insn))
7007         {
7008           if (N32_RT5 (insn) == N32_RA5 (insn))
7009             insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RB5 (insn));
7010           else if (N32_RT5 (insn) == N32_RB5 (insn))
7011             insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RA5 (insn));
7012           if (insn16)
7013             insn_type = NDS32_INSN_MUL33;
7014         }
7015     }
7016
7017   if ((insn16 & 0x8000) == 0)
7018     return 0;
7019
7020   if (pinsn16)
7021     *pinsn16 = insn16;
7022   if (pinsn_type)
7023     *pinsn_type = insn_type;
7024   return 1;
7025 }
7026
7027 int
7028 nds32_convert_32_to_16 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
7029                         int *pinsn_type)
7030 {
7031   int op6;
7032   uint16_t insn16 = 0;
7033   int insn_type;
7034   unsigned long mach = bfd_get_mach (abfd);
7035
7036   /* Decode 32-bit instruction.  */
7037   if (insn & 0x80000000)
7038     {
7039       /* Not 32-bit insn.  */
7040       return 0;
7041     }
7042
7043   op6 = N32_OP6 (insn);
7044
7045   /* Convert it to 16-bit instruction.  */
7046   switch (op6)
7047     {
7048     case N32_OP6_MOVI:
7049       if (IS_WITHIN_S (N32_IMM20S (insn), 5))
7050         {
7051           insn16 = N16_TYPE55 (MOVI55, N32_RT5 (insn), N32_IMM20S (insn));
7052           insn_type = NDS32_INSN_MOVI55;
7053         }
7054       else if (mach >= MACH_V3 && N32_IMM20S (insn) >= 16
7055                && N32_IMM20S (insn) < 48 && N32_IS_RT4 (insn))
7056         {
7057           insn16 = N16_TYPE45 (MOVPI45, N32_RT54 (insn),
7058                                N32_IMM20S (insn) - 16);
7059           insn_type = NDS32_INSN_MOVPI45;
7060         }
7061       break;
7062
7063     case N32_OP6_ADDI:
7064       if (N32_IMM15S (insn) == 0)
7065         {
7066           /* Do not convert `addi $sp, $sp, 0' to `mov55 $sp, $sp',
7067              because `mov55 $sp, $sp' is ifret16 in V3 ISA.  */
7068           if (mach <= MACH_V2
7069               || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
7070             {
7071               insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
7072               insn_type = NDS32_INSN_MOV55;
7073             }
7074         }
7075       else if (N32_IMM15S (insn) > 0)
7076         {
7077           if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) < 8)
7078             {
7079               insn16 = N16_TYPE333 (ADDI333, N32_RT5 (insn), N32_RA5 (insn),
7080                                     N32_IMM15S (insn));
7081               insn_type = NDS32_INSN_ADDI333;
7082             }
7083           else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
7084                    && N32_IMM15S (insn) < 32)
7085             {
7086               insn16 = N16_TYPE45 (ADDI45, N32_RT54 (insn), N32_IMM15S (insn));
7087               insn_type = NDS32_INSN_ADDI45;
7088             }
7089           else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
7090                    && N32_RT5 (insn) == N32_RA5 (insn)
7091                    && N32_IMM15S (insn) < 512)
7092             {
7093               insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
7094               insn_type = NDS32_INSN_ADDI10_SP;
7095             }
7096           else if (mach >= MACH_V3 && N32_IS_RT3 (insn)
7097                    && N32_RA5 (insn) == REG_SP && N32_IMM15S (insn) < 256
7098                    && (N32_IMM15S (insn) % 4 == 0))
7099             {
7100               insn16 = N16_TYPE36 (ADDRI36_SP, N32_RT5 (insn),
7101                                    N32_IMM15S (insn) >> 2);
7102               insn_type = NDS32_INSN_ADDRI36_SP;
7103             }
7104         }
7105       else
7106         {
7107           /* Less than 0.  */
7108           if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) > -8)
7109             {
7110               insn16 = N16_TYPE333 (SUBI333, N32_RT5 (insn), N32_RA5 (insn),
7111                                     0 - N32_IMM15S (insn));
7112               insn_type = NDS32_INSN_SUBI333;
7113             }
7114           else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
7115                    && N32_IMM15S (insn) > -32)
7116             {
7117               insn16 = N16_TYPE45 (SUBI45, N32_RT54 (insn),
7118                                    0 - N32_IMM15S (insn));
7119               insn_type = NDS32_INSN_SUBI45;
7120             }
7121           else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
7122                    && N32_RT5 (insn) == N32_RA5 (insn)
7123                    && N32_IMM15S (insn) >= -512)
7124             {
7125               insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
7126               insn_type = NDS32_INSN_ADDI10_SP;
7127             }
7128         }
7129       break;
7130
7131     case N32_OP6_ORI:
7132       if (N32_IMM15S (insn) == 0)
7133         {
7134           /* Do not convert `ori $sp, $sp, 0' to `mov55 $sp, $sp',
7135              because `mov55 $sp, $sp' is ifret16 in V3 ISA.  */
7136           if (mach <= MACH_V2
7137               || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
7138             {
7139               insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
7140               insn_type = NDS32_INSN_MOV55;
7141             }
7142         }
7143       break;
7144
7145     case N32_OP6_SUBRI:
7146       if (mach >= MACH_V3 && N32_IS_RT3 (insn)
7147           && N32_IS_RA3 (insn) && N32_IMM15S (insn) == 0)
7148         {
7149           insn16 = N16_MISC33 (NEG33, N32_RT5 (insn), N32_RA5 (insn));
7150           insn_type = NDS32_INSN_NEG33;
7151         }
7152       break;
7153
7154     case N32_OP6_ANDI:
7155       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
7156         {
7157           if (N32_IMM15U (insn) == 1)
7158             {
7159               insn16 = N16_BFMI333 (XLSB33, N32_RT5 (insn), N32_RA5 (insn));
7160               insn_type = NDS32_INSN_XLSB33;
7161             }
7162           else if (N32_IMM15U (insn) == 0x7ff)
7163             {
7164               insn16 = N16_BFMI333 (X11B33, N32_RT5 (insn), N32_RA5 (insn));
7165               insn_type = NDS32_INSN_X11B33;
7166             }
7167           else if (N32_IMM15U (insn) == 0xff)
7168             {
7169               insn16 = N16_BFMI333 (ZEB33, N32_RT5 (insn), N32_RA5 (insn));
7170               insn_type = NDS32_INSN_ZEB33;
7171             }
7172           else if (mach >= MACH_V3 && N32_RT5 (insn) == N32_RA5 (insn)
7173                    && N32_IMM15U (insn) < 256)
7174             {
7175               int imm15u = N32_IMM15U (insn);
7176
7177               if (__builtin_popcount (imm15u) == 1)
7178                 {
7179                   /* BMSKI33 */
7180                   int imm3u = __builtin_ctz (imm15u);
7181
7182                   insn16 = N16_BFMI333 (BMSKI33, N32_RT5 (insn), imm3u);
7183                   insn_type = NDS32_INSN_BMSKI33;
7184                 }
7185               else if (imm15u != 0 && __builtin_popcount (imm15u + 1) == 1)
7186                 {
7187                   /* FEXTI33 */
7188                   int imm3u = __builtin_ctz (imm15u + 1) - 1;
7189
7190                   insn16 = N16_BFMI333 (FEXTI33, N32_RT5 (insn), imm3u);
7191                   insn_type = NDS32_INSN_FEXTI33;
7192                 }
7193             }
7194         }
7195       break;
7196
7197     case N32_OP6_SLTI:
7198       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
7199           && IS_WITHIN_U (N32_IMM15S (insn), 5))
7200         {
7201           insn16 = N16_TYPE45 (SLTI45, N32_RA54 (insn), N32_IMM15S (insn));
7202           insn_type = NDS32_INSN_SLTI45;
7203         }
7204       break;
7205
7206     case N32_OP6_SLTSI:
7207       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
7208           && IS_WITHIN_U (N32_IMM15S (insn), 5))
7209         {
7210           insn16 = N16_TYPE45 (SLTSI45, N32_RA54 (insn), N32_IMM15S (insn));
7211           insn_type = NDS32_INSN_SLTSI45;
7212         }
7213       break;
7214
7215     case N32_OP6_LWI:
7216       if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
7217         {
7218           insn16 = N16_TYPE45 (LWI450, N32_RT54 (insn), N32_RA5 (insn));
7219           insn_type = NDS32_INSN_LWI450;
7220         }
7221       else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7222                && IS_WITHIN_U (N32_IMM15S (insn), 3))
7223         {
7224           insn16 = N16_TYPE333 (LWI333, N32_RT5 (insn), N32_RA5 (insn),
7225                                 N32_IMM15S (insn));
7226           insn_type = NDS32_INSN_LWI333;
7227         }
7228       else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
7229                && IS_WITHIN_U (N32_IMM15S (insn), 7))
7230         {
7231           insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
7232           insn_type = NDS32_INSN_LWI37;
7233         }
7234       else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
7235                && IS_WITHIN_U (N32_IMM15S (insn), 7))
7236         {
7237           insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 0, N32_IMM15S (insn));
7238           insn_type = NDS32_INSN_LWI37_SP;
7239         }
7240       else if (mach >= MACH_V2 && N32_IS_RT4 (insn) && N32_RA5 (insn) == REG_R8
7241                && -32 <= N32_IMM15S (insn) && N32_IMM15S (insn) < 0)
7242         {
7243           insn16 = N16_TYPE45 (LWI45_FE, N32_RT54 (insn),
7244                                N32_IMM15S (insn) + 32);
7245           insn_type = NDS32_INSN_LWI45_FE;
7246         }
7247       break;
7248
7249     case N32_OP6_SWI:
7250       if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
7251         {
7252           insn16 = N16_TYPE45 (SWI450, N32_RT54 (insn), N32_RA5 (insn));
7253           insn_type = NDS32_INSN_SWI450;
7254         }
7255       else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7256                && IS_WITHIN_U (N32_IMM15S (insn), 3))
7257         {
7258           insn16 = N16_TYPE333 (SWI333, N32_RT5 (insn), N32_RA5 (insn),
7259                                 N32_IMM15S (insn));
7260           insn_type = NDS32_INSN_SWI333;
7261         }
7262       else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
7263                && IS_WITHIN_U (N32_IMM15S (insn), 7))
7264         {
7265           insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
7266           insn_type = NDS32_INSN_SWI37;
7267         }
7268       else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
7269                && IS_WITHIN_U (N32_IMM15S (insn), 7))
7270         {
7271           insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 1, N32_IMM15S (insn));
7272           insn_type = NDS32_INSN_SWI37_SP;
7273         }
7274       break;
7275
7276     case N32_OP6_LWI_BI:
7277       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7278           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7279         {
7280           insn16 = N16_TYPE333 (LWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
7281                                 N32_IMM15S (insn));
7282           insn_type = NDS32_INSN_LWI333_BI;
7283         }
7284       break;
7285
7286     case N32_OP6_SWI_BI:
7287       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7288           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7289         {
7290           insn16 = N16_TYPE333 (SWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
7291                                 N32_IMM15S (insn));
7292           insn_type = NDS32_INSN_SWI333_BI;
7293         }
7294       break;
7295
7296     case N32_OP6_LHI:
7297       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7298           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7299         {
7300           insn16 = N16_TYPE333 (LHI333, N32_RT5 (insn), N32_RA5 (insn),
7301                                 N32_IMM15S (insn));
7302           insn_type = NDS32_INSN_LHI333;
7303         }
7304       break;
7305
7306     case N32_OP6_SHI:
7307       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7308           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7309         {
7310           insn16 = N16_TYPE333 (SHI333, N32_RT5 (insn), N32_RA5 (insn),
7311                                 N32_IMM15S (insn));
7312           insn_type = NDS32_INSN_SHI333;
7313         }
7314       break;
7315
7316     case N32_OP6_LBI:
7317       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7318           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7319         {
7320           insn16 = N16_TYPE333 (LBI333, N32_RT5 (insn), N32_RA5 (insn),
7321                                 N32_IMM15S (insn));
7322           insn_type = NDS32_INSN_LBI333;
7323         }
7324       break;
7325
7326     case N32_OP6_SBI:
7327       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7328           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7329         {
7330           insn16 = N16_TYPE333 (SBI333, N32_RT5 (insn), N32_RA5 (insn),
7331                                 N32_IMM15S (insn));
7332           insn_type = NDS32_INSN_SBI333;
7333         }
7334       break;
7335
7336     case N32_OP6_ALU1:
7337       return nds32_convert_32_to_16_alu1 (abfd, insn, pinsn16, pinsn_type);
7338
7339     case N32_OP6_ALU2:
7340       return nds32_convert_32_to_16_alu2 (abfd, insn, pinsn16, pinsn_type);
7341
7342     case N32_OP6_BR1:
7343       if (!IS_WITHIN_S (N32_IMM14S (insn), 8))
7344         goto done;
7345
7346       if ((insn & __BIT (14)) == 0)
7347         {
7348           /* N32_BR1_BEQ */
7349           if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
7350               && N32_RT5 (insn) != REG_R5)
7351             insn16 = N16_TYPE38 (BEQS38, N32_RT5 (insn), N32_IMM14S (insn));
7352           else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
7353                    && N32_RA5 (insn) != REG_R5)
7354             insn16 = N16_TYPE38 (BEQS38, N32_RA5 (insn), N32_IMM14S (insn));
7355           insn_type = NDS32_INSN_BEQS38;
7356           break;
7357         }
7358       else
7359         {
7360           /* N32_BR1_BNE */
7361           if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
7362               && N32_RT5 (insn) != REG_R5)
7363             insn16 = N16_TYPE38 (BNES38, N32_RT5 (insn), N32_IMM14S (insn));
7364           else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
7365                    && N32_RA5 (insn) != REG_R5)
7366             insn16 = N16_TYPE38 (BNES38, N32_RA5 (insn), N32_IMM14S (insn));
7367           insn_type = NDS32_INSN_BNES38;
7368           break;
7369         }
7370       break;
7371
7372     case N32_OP6_BR2:
7373       switch (N32_BR2_SUB (insn))
7374         {
7375         case N32_BR2_BEQZ:
7376           if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
7377             {
7378               insn16 = N16_TYPE38 (BEQZ38, N32_RT5 (insn), N32_IMM16S (insn));
7379               insn_type = NDS32_INSN_BEQZ38;
7380             }
7381           else if (N32_RT5 (insn) == REG_R15
7382                    && IS_WITHIN_S (N32_IMM16S (insn), 8))
7383             {
7384               insn16 = N16_TYPE8 (BEQZS8, N32_IMM16S (insn));
7385               insn_type = NDS32_INSN_BEQZS8;
7386             }
7387           break;
7388
7389         case N32_BR2_BNEZ:
7390           if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
7391             {
7392               insn16 = N16_TYPE38 (BNEZ38, N32_RT5 (insn), N32_IMM16S (insn));
7393               insn_type = NDS32_INSN_BNEZ38;
7394             }
7395           else if (N32_RT5 (insn) == REG_R15
7396                    && IS_WITHIN_S (N32_IMM16S (insn), 8))
7397             {
7398               insn16 = N16_TYPE8 (BNEZS8, N32_IMM16S (insn));
7399               insn_type = NDS32_INSN_BNEZS8;
7400             }
7401           break;
7402
7403         case N32_BR2_IFCALL:
7404           if (IS_WITHIN_U (N32_IMM16S (insn), 9))
7405             {
7406               insn16 = N16_TYPE9 (IFCALL9, N32_IMM16S (insn));
7407               insn_type = NDS32_INSN_IFCALL9;
7408             }
7409           break;
7410         }
7411       break;
7412
7413     case N32_OP6_JI:
7414       if ((insn & __BIT (24)) == 0)
7415         {
7416           /* N32_JI_J */
7417           if (IS_WITHIN_S (N32_IMM24S (insn), 8))
7418             {
7419               insn16 = N16_TYPE8 (J8, N32_IMM24S (insn));
7420               insn_type = NDS32_INSN_J8;
7421             }
7422         }
7423       break;
7424
7425     case N32_OP6_JREG:
7426       if (__GF (insn, 8, 2) != 0)
7427         goto done;
7428
7429       switch (N32_IMMU (insn, 5))
7430         {
7431         case N32_JREG_JR:
7432           if (N32_JREG_HINT (insn) == 0)
7433             {
7434               /* jr */
7435               insn16 = N16_TYPE5 (JR5, N32_RB5 (insn));
7436               insn_type = NDS32_INSN_JR5;
7437             }
7438           else if (N32_JREG_HINT (insn) == 1)
7439             {
7440               /* ret */
7441               insn16 = N16_TYPE5 (RET5, N32_RB5 (insn));
7442               insn_type = NDS32_INSN_RET5;
7443             }
7444           else if (N32_JREG_HINT (insn) == 3)
7445             {
7446               /* ifret = mov55 $sp, $sp */
7447               insn16 = N16_TYPE55 (MOV55, REG_SP, REG_SP);
7448               insn_type = NDS32_INSN_IFRET;
7449             }
7450           break;
7451
7452         case N32_JREG_JRAL:
7453           /* It's convertible when return rt5 is $lp and address
7454              translation is kept.  */
7455           if (N32_RT5 (insn) == REG_LP && N32_JREG_HINT (insn) == 0)
7456             {
7457               insn16 = N16_TYPE5 (JRAL5, N32_RB5 (insn));
7458               insn_type = NDS32_INSN_JRAL5;
7459             }
7460           break;
7461         }
7462       break;
7463
7464     case N32_OP6_MISC:
7465       if (N32_SUB5 (insn) == N32_MISC_BREAK && N32_SWID (insn) < 32)
7466         {
7467           /* For v3, swid above 31 are used for ex9.it.  */
7468           insn16 = N16_TYPE5 (BREAK16, N32_SWID (insn));
7469           insn_type = NDS32_INSN_BREAK16;
7470         }
7471       break;
7472
7473     default:
7474       /* This instruction has no 16-bit variant.  */
7475       goto done;
7476     }
7477
7478 done:
7479   /* Bit-15 of insn16 should be set for a valid instruction.  */
7480   if ((insn16 & 0x8000) == 0)
7481     return 0;
7482
7483   if (pinsn16)
7484     *pinsn16 = insn16;
7485   if (pinsn_type)
7486     *pinsn_type = insn_type;
7487   return 1;
7488 }
7489
7490 static int
7491 special_convert_32_to_16 (unsigned long insn, uint16_t *pinsn16,
7492                           Elf_Internal_Rela *reloc)
7493 {
7494   uint16_t insn16 = 0;
7495
7496   if ((reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG) == 0
7497       || (ELF32_R_TYPE (reloc->r_info) != R_NDS32_INSN16))
7498     return 0;
7499
7500   if (!N32_IS_RT3 (insn))
7501     return 0;
7502
7503   switch (N32_OP6 (insn))
7504     {
7505     case N32_OP6_LWI:
7506       if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
7507         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
7508       break;
7509     case N32_OP6_SWI:
7510       if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
7511         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
7512       break;
7513     case N32_OP6_HWGP:
7514       if (!IS_WITHIN_U (N32_IMM17S (insn), 7))
7515         break;
7516
7517       if (__GF (insn, 17, 3) == 6)
7518         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM17S (insn));
7519       else if (__GF (insn, 17, 3) == 7)
7520         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM17S (insn));
7521       break;
7522     }
7523
7524   if ((insn16 & 0x8000) == 0)
7525     return 0;
7526
7527   *pinsn16 = insn16;
7528   return 1;
7529 }
7530
7531 /* Convert a 16-bit instruction to 32-bit one.
7532    INSN16 it the input and PINSN it the point to output.
7533    Return non-zero on successful.  Otherwise 0 is returned.  */
7534
7535 int
7536 nds32_convert_16_to_32 (bfd *abfd, uint16_t insn16, uint32_t *pinsn)
7537 {
7538   uint32_t insn = 0xffffffff;
7539   unsigned long mach = bfd_get_mach (abfd);
7540
7541   /* NOTE: push25, pop25 and movd44 do not have 32-bit variants.  */
7542
7543   switch (__GF (insn16, 9, 6))
7544     {
7545     case 0x4:                   /* add45 */
7546       insn = N32_ALU1 (ADD, N16_RT4 (insn16), N16_RT4 (insn16),
7547                        N16_RA5 (insn16));
7548       goto done;
7549     case 0x5:                   /* sub45 */
7550       insn = N32_ALU1 (SUB, N16_RT4 (insn16), N16_RT4 (insn16),
7551                        N16_RA5 (insn16));
7552       goto done;
7553     case 0x6:                   /* addi45 */
7554       insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16),
7555                         N16_IMM5U (insn16));
7556       goto done;
7557     case 0x7:                   /* subi45 */
7558       insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16),
7559                         -N16_IMM5U (insn16));
7560       goto done;
7561     case 0x8:                   /* srai45 */
7562       insn = N32_ALU1 (SRAI, N16_RT4 (insn16), N16_RT4 (insn16),
7563                        N16_IMM5U (insn16));
7564       goto done;
7565     case 0x9:                   /* srli45 */
7566       insn = N32_ALU1 (SRLI, N16_RT4 (insn16), N16_RT4 (insn16),
7567                        N16_IMM5U (insn16));
7568       goto done;
7569     case 0xa:                   /* slli333 */
7570       insn = N32_ALU1 (SLLI, N16_RT3 (insn16), N16_RA3 (insn16),
7571                        N16_IMM3U (insn16));
7572       goto done;
7573     case 0xc:                   /* add333 */
7574       insn = N32_ALU1 (ADD, N16_RT3 (insn16), N16_RA3 (insn16),
7575                        N16_RB3 (insn16));
7576       goto done;
7577     case 0xd:                   /* sub333 */
7578       insn = N32_ALU1 (SUB, N16_RT3 (insn16), N16_RA3 (insn16),
7579                        N16_RB3 (insn16));
7580       goto done;
7581     case 0xe:                   /* addi333 */
7582       insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16),
7583                         N16_IMM3U (insn16));
7584       goto done;
7585     case 0xf:                   /* subi333 */
7586       insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16),
7587                         -N16_IMM3U (insn16));
7588       goto done;
7589     case 0x10:                  /* lwi333 */
7590       insn = N32_TYPE2 (LWI, N16_RT3 (insn16), N16_RA3 (insn16),
7591                         N16_IMM3U (insn16));
7592       goto done;
7593     case 0x12:                  /* lhi333 */
7594       insn = N32_TYPE2 (LHI, N16_RT3 (insn16), N16_RA3 (insn16),
7595                         N16_IMM3U (insn16));
7596       goto done;
7597     case 0x13:                  /* lbi333 */
7598       insn = N32_TYPE2 (LBI, N16_RT3 (insn16), N16_RA3 (insn16),
7599                         N16_IMM3U (insn16));
7600       goto done;
7601     case 0x11:                  /* lwi333.bi */
7602       insn = N32_TYPE2 (LWI_BI, N16_RT3 (insn16), N16_RA3 (insn16),
7603                         N16_IMM3U (insn16));
7604       goto done;
7605     case 0x14:                  /* swi333 */
7606       insn = N32_TYPE2 (SWI, N16_RT3 (insn16), N16_RA3 (insn16),
7607                         N16_IMM3U (insn16));
7608       goto done;
7609     case 0x16:                  /* shi333 */
7610       insn = N32_TYPE2 (SHI, N16_RT3 (insn16), N16_RA3 (insn16),
7611                         N16_IMM3U (insn16));
7612       goto done;
7613     case 0x17:                  /* sbi333 */
7614       insn = N32_TYPE2 (SBI, N16_RT3 (insn16), N16_RA3 (insn16),
7615                         N16_IMM3U (insn16));
7616       goto done;
7617     case 0x15:                  /* swi333.bi */
7618       insn = N32_TYPE2 (SWI_BI, N16_RT3 (insn16), N16_RA3 (insn16),
7619                         N16_IMM3U (insn16));
7620       goto done;
7621     case 0x18:                  /* addri36.sp */
7622       insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), REG_SP,
7623                         N16_IMM6U (insn16) << 2);
7624       goto done;
7625     case 0x19:                  /* lwi45.fe */
7626       insn = N32_TYPE2 (LWI, N16_RT4 (insn16), REG_R8,
7627                         (N16_IMM5U (insn16) - 32));
7628       goto done;
7629     case 0x1a:                  /* lwi450 */
7630       insn = N32_TYPE2 (LWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
7631       goto done;
7632     case 0x1b:                  /* swi450 */
7633       insn = N32_TYPE2 (SWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
7634       goto done;
7635
7636       /* These are r15 implied instructions.  */
7637     case 0x30:                  /* slts45 */
7638       insn = N32_ALU1 (SLTS, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
7639       goto done;
7640     case 0x31:                  /* slt45 */
7641       insn = N32_ALU1 (SLT, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
7642       goto done;
7643     case 0x32:                  /* sltsi45 */
7644       insn = N32_TYPE2 (SLTSI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
7645       goto done;
7646     case 0x33:                  /* slti45 */
7647       insn = N32_TYPE2 (SLTI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
7648       goto done;
7649     case 0x34:                  /* beqzs8, bnezs8 */
7650       if (insn16 & __BIT (8))
7651         insn = N32_BR2 (BNEZ, REG_TA, N16_IMM8S (insn16));
7652       else
7653         insn = N32_BR2 (BEQZ, REG_TA, N16_IMM8S (insn16));
7654       goto done;
7655
7656     case 0x35:                  /* break16, ex9.it */
7657       /* Only consider range of v3 break16.  */
7658       insn = N32_TYPE0 (MISC, (N16_IMM5U (insn16) << 5) | N32_MISC_BREAK);
7659       goto done;
7660
7661     case 0x3c:                  /* ifcall9 */
7662       insn = N32_BR2 (IFCALL, 0, N16_IMM9U (insn16));
7663       goto done;
7664     case 0x3d:                  /* movpi45 */
7665       insn = N32_TYPE1 (MOVI, N16_RT4 (insn16), N16_IMM5U (insn16) + 16);
7666       goto done;
7667
7668     case 0x3f:                  /* MISC33 */
7669       switch (insn16 & 0x7)
7670         {
7671         case 2:                 /* neg33 */
7672           insn = N32_TYPE2 (SUBRI, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7673           break;
7674         case 3:                 /* not33 */
7675           insn = N32_ALU1 (NOR, N16_RT3 (insn16), N16_RA3 (insn16),
7676                            N16_RA3 (insn16));
7677           break;
7678         case 4:                 /* mul33 */
7679           insn = N32_ALU2 (MUL, N16_RT3 (insn16), N16_RT3 (insn16),
7680                            N16_RA3 (insn16));
7681           break;
7682         case 5:                 /* xor33 */
7683           insn = N32_ALU1 (XOR, N16_RT3 (insn16), N16_RT3 (insn16),
7684                            N16_RA3 (insn16));
7685           break;
7686         case 6:                 /* and33 */
7687           insn = N32_ALU1 (AND, N16_RT3 (insn16), N16_RT3 (insn16),
7688                            N16_RA3 (insn16));
7689           break;
7690         case 7:                 /* or33 */
7691           insn = N32_ALU1 (OR, N16_RT3 (insn16), N16_RT3 (insn16),
7692                            N16_RA3 (insn16));
7693           break;
7694         }
7695       goto done;
7696
7697     case 0xb:
7698       switch (insn16 & 0x7)
7699         {
7700         case 0:                 /* zeb33 */
7701           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0xff);
7702           break;
7703         case 1:                 /* zeh33 */
7704           insn = N32_ALU1 (ZEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7705           break;
7706         case 2:                 /* seb33 */
7707           insn = N32_ALU1 (SEB, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7708           break;
7709         case 3:                 /* seh33 */
7710           insn = N32_ALU1 (SEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7711           break;
7712         case 4:                 /* xlsb33 */
7713           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 1);
7714           break;
7715         case 5:                 /* x11b33 */
7716           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0x7ff);
7717           break;
7718         case 6:                 /* bmski33 */
7719           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
7720                             1 << __GF (insn16, 3, 3));
7721           break;
7722         case 7:                 /* fexti33 */
7723           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
7724                             (1 << (__GF (insn16, 3, 3) + 1)) - 1);
7725           break;
7726         }
7727       goto done;
7728     }
7729
7730   switch (__GF (insn16, 10, 5))
7731     {
7732     case 0x0:                   /* mov55 or ifret16 */
7733       if (mach >= MACH_V3 && N16_RT5 (insn16) == REG_SP
7734           && N16_RT5 (insn16) == N16_RA5 (insn16))
7735         insn = N32_JREG (JR, 0, 0, 0, 3);
7736       else
7737         insn = N32_TYPE2 (ADDI, N16_RT5 (insn16), N16_RA5 (insn16), 0);
7738       goto done;
7739     case 0x1:                   /* movi55 */
7740       insn = N32_TYPE1 (MOVI, N16_RT5 (insn16), N16_IMM5S (insn16));
7741       goto done;
7742     case 0x1b:                  /* addi10s (V2) */
7743       insn = N32_TYPE2 (ADDI, REG_SP, REG_SP, N16_IMM10S (insn16));
7744       goto done;
7745     }
7746
7747   switch (__GF (insn16, 11, 4))
7748     {
7749     case 0x7:                   /* lwi37.fp/swi37.fp */
7750       if (insn16 & __BIT (7))   /* swi37.fp */
7751         insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
7752       else                      /* lwi37.fp */
7753         insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
7754       goto done;
7755     case 0x8:                   /* beqz38 */
7756       insn = N32_BR2 (BEQZ, N16_RT38 (insn16), N16_IMM8S (insn16));
7757       goto done;
7758     case 0x9:                   /* bnez38 */
7759       insn = N32_BR2 (BNEZ, N16_RT38 (insn16), N16_IMM8S (insn16));
7760       goto done;
7761     case 0xa:                   /* beqs38/j8, implied r5 */
7762       if (N16_RT38 (insn16) == 5)
7763         insn = N32_JI (J, N16_IMM8S (insn16));
7764       else
7765         insn = N32_BR1 (BEQ, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
7766       goto done;
7767     case 0xb:                   /* bnes38 and others */
7768       if (N16_RT38 (insn16) == 5)
7769         {
7770           switch (__GF (insn16, 5, 3))
7771             {
7772             case 0:             /* jr5 */
7773               insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 0);
7774               break;
7775             case 4:             /* ret5 */
7776               insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 1);
7777               break;
7778             case 1:             /* jral5 */
7779               insn = N32_JREG (JRAL, REG_LP, N16_RA5 (insn16), 0, 0);
7780               break;
7781             case 2:             /* ex9.it imm5 */
7782               /* ex9.it had no 32-bit variantl.  */
7783               break;
7784             case 5:             /* add5.pc */
7785               /* add5.pc had no 32-bit variantl.  */
7786               break;
7787             }
7788         }
7789       else                      /* bnes38 */
7790         insn = N32_BR1 (BNE, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
7791       goto done;
7792     case 0xe:                   /* lwi37/swi37 */
7793       if (insn16 & (1 << 7))    /* swi37.sp */
7794         insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
7795       else                      /* lwi37.sp */
7796         insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
7797       goto done;
7798     }
7799
7800 done:
7801   if (insn & 0x80000000)
7802     return 0;
7803
7804   if (pinsn)
7805     *pinsn = insn;
7806   return 1;
7807 }
7808 \f
7809 static bfd_boolean
7810 is_sda_access_insn (unsigned long insn)
7811 {
7812   switch (N32_OP6 (insn))
7813     {
7814     case N32_OP6_LWI:
7815     case N32_OP6_LHI:
7816     case N32_OP6_LHSI:
7817     case N32_OP6_LBI:
7818     case N32_OP6_LBSI:
7819     case N32_OP6_SWI:
7820     case N32_OP6_SHI:
7821     case N32_OP6_SBI:
7822     case N32_OP6_LWC:
7823     case N32_OP6_LDC:
7824     case N32_OP6_SWC:
7825     case N32_OP6_SDC:
7826       return TRUE;
7827     default:
7828       ;
7829     }
7830   return FALSE;
7831 }
7832
7833 static unsigned long
7834 turn_insn_to_sda_access (uint32_t insn, bfd_signed_vma type, uint32_t *pinsn)
7835 {
7836   uint32_t oinsn = 0;
7837
7838   switch (type)
7839     {
7840     case R_NDS32_GOT_LO12:
7841     case R_NDS32_GOTOFF_LO12:
7842     case R_NDS32_PLTREL_LO12:
7843     case R_NDS32_PLT_GOTREL_LO12:
7844     case R_NDS32_LO12S0_RELA:
7845       switch (N32_OP6 (insn))
7846         {
7847         case N32_OP6_LBI:
7848           /* lbi.gp */
7849           oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0);
7850           break;
7851         case N32_OP6_LBSI:
7852           /* lbsi.gp */
7853           oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), __BIT (19));
7854           break;
7855         case N32_OP6_SBI:
7856           /* sbi.gp */
7857           oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0);
7858           break;
7859         case N32_OP6_ORI:
7860           /* addi.gp */
7861           oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19));
7862           break;
7863         }
7864       break;
7865
7866     case R_NDS32_LO12S1_RELA:
7867       switch (N32_OP6 (insn))
7868         {
7869         case N32_OP6_LHI:
7870           /* lhi.gp */
7871           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0);
7872           break;
7873         case N32_OP6_LHSI:
7874           /* lhsi.gp */
7875           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (18));
7876           break;
7877         case N32_OP6_SHI:
7878           /* shi.gp */
7879           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (19));
7880           break;
7881         }
7882       break;
7883
7884     case R_NDS32_LO12S2_RELA:
7885       switch (N32_OP6 (insn))
7886         {
7887         case N32_OP6_LWI:
7888           /* lwi.gp */
7889           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
7890           break;
7891         case N32_OP6_SWI:
7892           /* swi.gp */
7893           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3));
7894           break;
7895         }
7896       break;
7897
7898     case R_NDS32_LO12S2_DP_RELA:
7899     case R_NDS32_LO12S2_SP_RELA:
7900       oinsn = (insn & 0x7ff07000) | (REG_GP << 15);
7901       break;
7902     }
7903
7904   if (oinsn)
7905     *pinsn = oinsn;
7906
7907   return oinsn != 0;
7908 }
7909
7910 /* Linker hasn't found the correct merge section for non-section symbol
7911    in relax time, this work is left to the function elf_link_input_bfd().
7912    So for non-section symbol, _bfd_merged_section_offset is also needed
7913    to find the correct symbol address.  */
7914
7915 static bfd_vma
7916 nds32_elf_rela_local_sym (bfd *abfd, Elf_Internal_Sym *sym,
7917                           asection **psec, Elf_Internal_Rela *rel)
7918 {
7919   asection *sec = *psec;
7920   bfd_vma relocation;
7921
7922   relocation = (sec->output_section->vma
7923                 + sec->output_offset + sym->st_value);
7924   if ((sec->flags & SEC_MERGE) && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
7925     {
7926       if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
7927         rel->r_addend =
7928           _bfd_merged_section_offset (abfd, psec,
7929                                       elf_section_data (sec)->sec_info,
7930                                       sym->st_value + rel->r_addend);
7931       else
7932         rel->r_addend =
7933           _bfd_merged_section_offset (abfd, psec,
7934                                       elf_section_data (sec)->sec_info,
7935                                       sym->st_value) + rel->r_addend;
7936
7937       if (sec != *psec)
7938         {
7939           /* If we have changed the section, and our original section is
7940              marked with SEC_EXCLUDE, it means that the original
7941              SEC_MERGE section has been completely subsumed in some
7942              other SEC_MERGE section.  In this case, we need to leave
7943              some info around for --emit-relocs.  */
7944           if ((sec->flags & SEC_EXCLUDE) != 0)
7945             sec->kept_section = *psec;
7946           sec = *psec;
7947         }
7948       rel->r_addend -= relocation;
7949       rel->r_addend += sec->output_section->vma + sec->output_offset;
7950     }
7951   return relocation;
7952 }
7953
7954 static bfd_vma
7955 calculate_memory_address (bfd *abfd, Elf_Internal_Rela *irel,
7956                           Elf_Internal_Sym *isymbuf,
7957                           Elf_Internal_Shdr *symtab_hdr)
7958 {
7959   bfd_signed_vma foff;
7960   bfd_vma symval, addend;
7961   Elf_Internal_Rela irel_fn;
7962   Elf_Internal_Sym *isym;
7963   asection *sym_sec;
7964
7965   /* Get the value of the symbol referred to by the reloc.  */
7966   if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
7967     {
7968       /* A local symbol.  */
7969       isym = isymbuf + ELF32_R_SYM (irel->r_info);
7970
7971       if (isym->st_shndx == SHN_UNDEF)
7972         sym_sec = bfd_und_section_ptr;
7973       else if (isym->st_shndx == SHN_ABS)
7974         sym_sec = bfd_abs_section_ptr;
7975       else if (isym->st_shndx == SHN_COMMON)
7976         sym_sec = bfd_com_section_ptr;
7977       else
7978         sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
7979       memcpy (&irel_fn, irel, sizeof (Elf_Internal_Rela));
7980       symval = nds32_elf_rela_local_sym (abfd, isym, &sym_sec, &irel_fn);
7981       addend = irel_fn.r_addend;
7982     }
7983   else
7984     {
7985       unsigned long indx;
7986       struct elf_link_hash_entry *h;
7987
7988       /* An external symbol.  */
7989       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
7990       h = elf_sym_hashes (abfd)[indx];
7991       BFD_ASSERT (h != NULL);
7992
7993       while (h->root.type == bfd_link_hash_indirect
7994              || h->root.type == bfd_link_hash_warning)
7995         h = (struct elf_link_hash_entry *) h->root.u.i.link;
7996
7997       if (h->root.type != bfd_link_hash_defined
7998           && h->root.type != bfd_link_hash_defweak)
7999         /* This appears to be a reference to an undefined
8000            symbol.  Just ignore it--it will be caught by the
8001            regular reloc processing.  */
8002         return 0;
8003
8004       if (h->root.u.def.section->flags & SEC_MERGE)
8005         {
8006           sym_sec = h->root.u.def.section;
8007           symval = _bfd_merged_section_offset (abfd, &sym_sec, elf_section_data
8008                                                (sym_sec)->sec_info, h->root.u.def.value);
8009           symval = symval + sym_sec->output_section->vma
8010                    + sym_sec->output_offset;
8011         }
8012       else
8013         symval = (h->root.u.def.value
8014                   + h->root.u.def.section->output_section->vma
8015                   + h->root.u.def.section->output_offset);
8016       addend = irel->r_addend;
8017     }
8018
8019   foff = symval + addend;
8020
8021   return foff;
8022 }
8023
8024 static bfd_vma
8025 calculate_got_memory_address (bfd *abfd, struct bfd_link_info *link_info,
8026                               Elf_Internal_Rela *irel,
8027                               Elf_Internal_Shdr *symtab_hdr)
8028 {
8029   int symndx;
8030   bfd_vma *local_got_offsets;
8031   /* Get the value of the symbol referred to by the reloc.  */
8032   struct elf_link_hash_entry *h;
8033   struct elf_nds32_link_hash_table *htab = nds32_elf_hash_table (link_info);
8034
8035   /* An external symbol.  */
8036   symndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
8037   h = elf_sym_hashes (abfd)[symndx];
8038   while (h->root.type == bfd_link_hash_indirect
8039          || h->root.type == bfd_link_hash_warning)
8040     h = (struct elf_link_hash_entry *) h->root.u.i.link;
8041
8042   if (symndx >= 0)
8043     {
8044       BFD_ASSERT (h != NULL);
8045       return (htab->root.sgot->output_section->vma
8046               + htab->root.sgot->output_offset
8047               + h->got.offset);
8048     }
8049   else
8050     {
8051       local_got_offsets = elf_local_got_offsets (abfd);
8052       BFD_ASSERT (local_got_offsets != NULL);
8053       return (htab->root.sgot->output_section->vma
8054               + htab->root.sgot->output_offset
8055               + local_got_offsets[ELF32_R_SYM (irel->r_info)]);
8056     }
8057
8058   /* The _GLOBAL_OFFSET_TABLE_ may be undefweak(or should be?).  */
8059   /* The check of h->root.type is passed.  */
8060 }
8061
8062 static int
8063 is_16bit_NOP (bfd *abfd ATTRIBUTE_UNUSED,
8064               asection *sec, Elf_Internal_Rela *rel)
8065 {
8066   bfd_byte *contents;
8067   unsigned short insn16;
8068
8069   if (!(rel->r_addend & R_NDS32_INSN16_CONVERT_FLAG))
8070     return FALSE;
8071   contents = elf_section_data (sec)->this_hdr.contents;
8072   insn16 = bfd_getb16 (contents + rel->r_offset);
8073   if (insn16 == NDS32_NOP16)
8074     return TRUE;
8075   return FALSE;
8076 }
8077
8078 /* It checks whether the instruction could be converted to
8079    16-bit form and returns the converted one.
8080
8081    `internal_relocs' is supposed to be sorted.  */
8082
8083 static int
8084 is_convert_32_to_16 (bfd *abfd, asection *sec,
8085                      Elf_Internal_Rela *reloc,
8086                      Elf_Internal_Rela *internal_relocs,
8087                      Elf_Internal_Rela *irelend,
8088                      uint16_t *insn16)
8089 {
8090 #define NORMAL_32_TO_16 (1 << 0)
8091 #define SPECIAL_32_TO_16 (1 << 1)
8092   bfd_byte *contents = NULL;
8093   bfd_signed_vma off;
8094   bfd_vma mem_addr;
8095   uint32_t insn = 0;
8096   Elf_Internal_Rela *pc_rel;
8097   int pic_ext_target = 0;
8098   Elf_Internal_Shdr *symtab_hdr;
8099   Elf_Internal_Sym *isymbuf = NULL;
8100   int convert_type;
8101   bfd_vma offset;
8102
8103   if (reloc->r_offset + 4 > sec->size)
8104     return FALSE;
8105
8106   offset = reloc->r_offset;
8107
8108   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
8109     return FALSE;
8110   insn = bfd_getb32 (contents + offset);
8111
8112   if (nds32_convert_32_to_16 (abfd, insn, insn16, NULL))
8113     convert_type = NORMAL_32_TO_16;
8114   else if (special_convert_32_to_16 (insn, insn16, reloc))
8115     convert_type = SPECIAL_32_TO_16;
8116   else
8117     return FALSE;
8118
8119   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8120   if (!nds32_get_local_syms (abfd, sec, &isymbuf))
8121     return FALSE;
8122
8123   /* Find the first relocation of the same relocation-type,
8124      so we iteratie them forward.  */
8125   pc_rel = reloc;
8126   while ((pc_rel - 1) >= internal_relocs && pc_rel[-1].r_offset == offset)
8127     pc_rel--;
8128
8129   for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
8130     {
8131       if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
8132           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
8133           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA
8134           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
8135         {
8136           off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr,
8137                                   &pic_ext_target);
8138           if (off >= ACCURATE_8BIT_S1 || off < -ACCURATE_8BIT_S1
8139               || off == 0)
8140             return FALSE;
8141           break;
8142         }
8143       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
8144         {
8145           /* movi => movi55  */
8146           mem_addr = calculate_memory_address (abfd, pc_rel, isymbuf,
8147                                                symtab_hdr);
8148           /* mem_addr is unsigned, but the value should
8149              be between [-16, 15].  */
8150           if ((mem_addr + 0x10) >> 5)
8151             return FALSE;
8152           break;
8153         }
8154       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_20)
8155                || (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_LO12))
8156         {
8157           /* It never happen movi to movi55 for R_NDS32_TLS_LE_20,
8158              because it can be relaxed to addi for TLS_LE_ADD.  */
8159           return FALSE;
8160         }
8161       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
8162                 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
8163                && (reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG)
8164                && convert_type == SPECIAL_32_TO_16)
8165         {
8166           /* fp-as-gp
8167              We've selected a best fp-base for this access, so we can
8168              always resolve it anyway.  Do nothing.  */
8169           break;
8170         }
8171       else if ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_NONE
8172                 && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_RELA_GNU_VTINHERIT))
8173                || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_RELA_GNU_VTENTRY)
8174                    && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_INSN16))
8175                || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_LOADSTORE)
8176                    && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_DWARF2_OP1_RELA)))
8177         {
8178           /* Prevent unresolved addi instruction translate
8179              to addi45 or addi333.  */
8180           return FALSE;
8181         }
8182       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
8183         {
8184           off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr,
8185                                   &pic_ext_target);
8186           if (off >= ACCURATE_U9BIT_S1 || off <= 0)
8187             return FALSE;
8188           break;
8189         }
8190     }
8191
8192   return TRUE;
8193 }
8194
8195 static void
8196 nds32_elf_write_16 (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *contents,
8197                     Elf_Internal_Rela *reloc,
8198                     Elf_Internal_Rela *internal_relocs,
8199                     Elf_Internal_Rela *irelend,
8200                     unsigned short insn16)
8201 {
8202   Elf_Internal_Rela *pc_rel;
8203   bfd_vma offset;
8204
8205   offset = reloc->r_offset;
8206   bfd_putb16 (insn16, contents + offset);
8207   /* Find the first relocation of the same relocation-type,
8208      so we iteratie them forward.  */
8209   pc_rel = reloc;
8210   while ((pc_rel - 1) > internal_relocs && pc_rel[-1].r_offset == offset)
8211     pc_rel--;
8212
8213   for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
8214     {
8215       if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
8216           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
8217           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA)
8218         {
8219           pc_rel->r_info =
8220             ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PCREL_RELA);
8221         }
8222       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
8223         pc_rel->r_info =
8224           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PLTREL);
8225       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
8226         pc_rel->r_info =
8227           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_5_RELA);
8228       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
8229                || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
8230         pc_rel->r_info =
8231           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_SDA_FP7U2_RELA);
8232       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
8233         pc_rel->r_info =
8234           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_10IFCU_PCREL_RELA);
8235     }
8236 }
8237
8238 /* Find a relocation of type specified by `reloc_type'
8239    of the same r_offset with reloc.
8240    If not found, return irelend.
8241
8242    Assuming relocations are sorted by r_offset,
8243    we find the relocation from `reloc' backward untill relocs,
8244    or find it from `reloc' forward untill irelend.  */
8245
8246 static Elf_Internal_Rela *
8247 find_relocs_at_address (Elf_Internal_Rela *reloc,
8248                         Elf_Internal_Rela *relocs,
8249                         Elf_Internal_Rela *irelend,
8250                         enum elf_nds32_reloc_type reloc_type)
8251 {
8252   Elf_Internal_Rela *rel_t;
8253
8254   /* Find backward.  */
8255   for (rel_t = reloc;
8256        rel_t >= relocs && rel_t->r_offset == reloc->r_offset;
8257        rel_t--)
8258     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8259       return rel_t;
8260
8261   /* We didn't find it backward.  Try find it forward.  */
8262   for (rel_t = reloc;
8263        rel_t < irelend && rel_t->r_offset == reloc->r_offset;
8264        rel_t++)
8265     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8266       return rel_t;
8267
8268   return irelend;
8269 }
8270
8271 /* Find a relocation of specified type and offset.
8272    `reloc' is just a refence point to find a relocation at specified offset.
8273    If not found, return irelend.
8274
8275    Assuming relocations are sorted by r_offset,
8276    we find the relocation from `reloc' backward untill relocs,
8277    or find it from `reloc' forward untill irelend.  */
8278
8279 static Elf_Internal_Rela *
8280 find_relocs_at_address_addr (Elf_Internal_Rela *reloc,
8281                              Elf_Internal_Rela *relocs,
8282                              Elf_Internal_Rela *irelend,
8283                              enum elf_nds32_reloc_type reloc_type,
8284                              bfd_vma offset_p)
8285 {
8286   Elf_Internal_Rela *rel_t = NULL;
8287
8288   /* First, we try to find a relocation of offset `offset_p',
8289      and then we use find_relocs_at_address to find specific type.  */
8290
8291   if (reloc->r_offset > offset_p)
8292     {
8293       /* Find backward.  */
8294       for (rel_t = reloc;
8295            rel_t >= relocs && rel_t->r_offset > offset_p; rel_t--)
8296         /* Do nothing.  */;
8297     }
8298   else if (reloc->r_offset < offset_p)
8299     {
8300       /* Find forward.  */
8301       for (rel_t = reloc;
8302            rel_t < irelend && rel_t->r_offset < offset_p; rel_t++)
8303         /* Do nothing.  */;
8304     }
8305   else
8306     rel_t = reloc;
8307
8308   /* Not found?  */
8309   if (rel_t < relocs || rel_t == irelend || rel_t->r_offset != offset_p)
8310     return irelend;
8311
8312   return find_relocs_at_address (rel_t, relocs, irelend, reloc_type);
8313 }
8314
8315 static bfd_boolean
8316 nds32_elf_check_dup_relocs (Elf_Internal_Rela *reloc,
8317                             Elf_Internal_Rela *internal_relocs,
8318                             Elf_Internal_Rela *irelend,
8319                             unsigned char reloc_type)
8320 {
8321   Elf_Internal_Rela *rel_t;
8322
8323   for (rel_t = reloc;
8324        rel_t >= internal_relocs && rel_t->r_offset == reloc->r_offset;
8325        rel_t--)
8326     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8327       {
8328         if (ELF32_R_SYM (rel_t->r_info) == ELF32_R_SYM (reloc->r_info)
8329             && rel_t->r_addend == reloc->r_addend)
8330           continue;
8331         return TRUE;
8332       }
8333
8334   for (rel_t = reloc; rel_t < irelend && rel_t->r_offset == reloc->r_offset;
8335        rel_t++)
8336     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8337       {
8338         if (ELF32_R_SYM (rel_t->r_info) == ELF32_R_SYM (reloc->r_info)
8339             && rel_t->r_addend == reloc->r_addend)
8340           continue;
8341         return TRUE;
8342       }
8343
8344   return FALSE;
8345 }
8346
8347 typedef struct nds32_elf_blank nds32_elf_blank_t;
8348 struct nds32_elf_blank
8349 {
8350   /* Where the blank begins.  */
8351   bfd_vma offset;
8352   /* The size of the blank.  */
8353   bfd_vma size;
8354   /* The accumulative size before this blank.  */
8355   bfd_vma total_size;
8356   nds32_elf_blank_t *next;
8357   nds32_elf_blank_t *prev;
8358 };
8359
8360 static nds32_elf_blank_t *blank_free_list = NULL;
8361
8362 static nds32_elf_blank_t *
8363 create_nds32_elf_blank (bfd_vma offset_p, bfd_vma size_p)
8364 {
8365   nds32_elf_blank_t *blank_t;
8366
8367   if (blank_free_list)
8368     {
8369       blank_t = blank_free_list;
8370       blank_free_list = blank_free_list->next;
8371     }
8372   else
8373     blank_t = bfd_malloc (sizeof (nds32_elf_blank_t));
8374
8375   if (blank_t == NULL)
8376     return NULL;
8377
8378   blank_t->offset = offset_p;
8379   blank_t->size = size_p;
8380   blank_t->total_size = 0;
8381   blank_t->next = NULL;
8382   blank_t->prev = NULL;
8383
8384   return blank_t;
8385 }
8386
8387 static void
8388 remove_nds32_elf_blank (nds32_elf_blank_t *blank_p)
8389 {
8390   if (blank_free_list)
8391     {
8392       blank_free_list->prev = blank_p;
8393       blank_p->next = blank_free_list;
8394     }
8395   else
8396     blank_p->next = NULL;
8397
8398   blank_p->prev = NULL;
8399   blank_free_list = blank_p;
8400 }
8401
8402 static void
8403 clean_nds32_elf_blank (void)
8404 {
8405   nds32_elf_blank_t *blank_t;
8406
8407   while (blank_free_list)
8408     {
8409       blank_t = blank_free_list;
8410       blank_free_list = blank_free_list->next;
8411       free (blank_t);
8412     }
8413 }
8414
8415 static nds32_elf_blank_t *
8416 search_nds32_elf_blank (nds32_elf_blank_t *blank_p, bfd_vma addr)
8417 {
8418   nds32_elf_blank_t *blank_t;
8419
8420   if (!blank_p)
8421     return NULL;
8422   blank_t = blank_p;
8423
8424   while (blank_t && addr < blank_t->offset)
8425     blank_t = blank_t->prev;
8426   while (blank_t && blank_t->next && addr >= blank_t->next->offset)
8427     blank_t = blank_t->next;
8428
8429   return blank_t;
8430 }
8431
8432 static bfd_vma
8433 get_nds32_elf_blank_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
8434                            int overwrite)
8435 {
8436   nds32_elf_blank_t *blank_t;
8437
8438   blank_t = search_nds32_elf_blank (*blank_p, addr);
8439   if (!blank_t)
8440     return 0;
8441
8442   if (overwrite)
8443     *blank_p = blank_t;
8444
8445   if (addr < blank_t->offset + blank_t->size)
8446     return blank_t->total_size + (addr - blank_t->offset);
8447   else
8448     return blank_t->total_size + blank_t->size;
8449 }
8450
8451 static bfd_boolean
8452 insert_nds32_elf_blank (nds32_elf_blank_t **blank_p, bfd_vma addr, bfd_vma len)
8453 {
8454   nds32_elf_blank_t *blank_t, *blank_t2;
8455
8456   if (!*blank_p)
8457     {
8458       *blank_p = create_nds32_elf_blank (addr, len);
8459       return *blank_p ? TRUE : FALSE;
8460     }
8461
8462   blank_t = search_nds32_elf_blank (*blank_p, addr);
8463
8464   if (blank_t == NULL)
8465     {
8466       blank_t = create_nds32_elf_blank (addr, len);
8467       if (!blank_t)
8468         return FALSE;
8469       while ((*blank_p)->prev != NULL)
8470         *blank_p = (*blank_p)->prev;
8471       blank_t->next = *blank_p;
8472       (*blank_p)->prev = blank_t;
8473       (*blank_p) = blank_t;
8474       return TRUE;
8475     }
8476
8477   if (addr < blank_t->offset + blank_t->size)
8478     {
8479       if (addr > blank_t->offset + blank_t->size)
8480         blank_t->size = addr - blank_t->offset;
8481     }
8482   else
8483     {
8484       blank_t2 = create_nds32_elf_blank (addr, len);
8485       if (!blank_t2)
8486         return FALSE;
8487       if (blank_t->next)
8488         {
8489           blank_t->next->prev = blank_t2;
8490           blank_t2->next = blank_t->next;
8491         }
8492       blank_t2->prev = blank_t;
8493       blank_t->next = blank_t2;
8494       *blank_p = blank_t2;
8495     }
8496
8497   return TRUE;
8498 }
8499
8500 static bfd_boolean
8501 insert_nds32_elf_blank_recalc_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
8502                                      bfd_vma len)
8503 {
8504   nds32_elf_blank_t *blank_t;
8505
8506   if (!insert_nds32_elf_blank (blank_p, addr, len))
8507     return FALSE;
8508
8509   blank_t = *blank_p;
8510
8511   if (!blank_t->prev)
8512     {
8513       blank_t->total_size = 0;
8514       blank_t = blank_t->next;
8515     }
8516
8517   while (blank_t)
8518     {
8519       blank_t->total_size = blank_t->prev->total_size + blank_t->prev->size;
8520       blank_t = blank_t->next;
8521     }
8522
8523   return TRUE;
8524 }
8525
8526 static void
8527 calc_nds32_blank_total (nds32_elf_blank_t *blank_p)
8528 {
8529   nds32_elf_blank_t *blank_t;
8530   bfd_vma total_size = 0;
8531
8532   if (!blank_p)
8533     return;
8534
8535   blank_t = blank_p;
8536   while (blank_t->prev)
8537     blank_t = blank_t->prev;
8538   while (blank_t)
8539     {
8540       blank_t->total_size = total_size;
8541       total_size += blank_t->size;
8542       blank_t = blank_t->next;
8543     }
8544 }
8545
8546 static bfd_boolean
8547 nds32_elf_relax_delete_blanks (bfd *abfd, asection *sec,
8548                                nds32_elf_blank_t *blank_p)
8549 {
8550   Elf_Internal_Shdr *symtab_hdr;        /* Symbol table header of this bfd.  */
8551   Elf_Internal_Sym *isym = NULL;        /* Symbol table of this bfd.  */
8552   Elf_Internal_Sym *isymend;            /* Symbol entry iterator.  */
8553   unsigned int sec_shndx;               /* The section the be relaxed.  */
8554   bfd_byte *contents;                   /* Contents data of iterating section.  */
8555   Elf_Internal_Rela *internal_relocs;
8556   Elf_Internal_Rela *irel;
8557   Elf_Internal_Rela *irelend;
8558   struct elf_link_hash_entry **sym_hashes;
8559   struct elf_link_hash_entry **end_hashes;
8560   unsigned int symcount;
8561   asection *sect;
8562   nds32_elf_blank_t *blank_t;
8563   nds32_elf_blank_t *blank_t2;
8564   nds32_elf_blank_t *blank_head;
8565
8566   blank_head = blank_t = blank_p;
8567   while (blank_head->prev != NULL)
8568     blank_head = blank_head->prev;
8569   while (blank_t->next != NULL)
8570     blank_t = blank_t->next;
8571
8572   if (blank_t->offset + blank_t->size <= sec->size)
8573     {
8574       blank_t->next = create_nds32_elf_blank (sec->size + 4, 0);
8575       blank_t->next->prev = blank_t;
8576     }
8577   if (blank_head->offset > 0)
8578     {
8579       blank_head->prev = create_nds32_elf_blank (0, 0);
8580       blank_head->prev->next = blank_head;
8581       blank_head = blank_head->prev;
8582     }
8583
8584   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
8585
8586   /* The deletion must stop at the next ALIGN reloc for an alignment
8587      power larger than the number of bytes we are deleting.  */
8588
8589   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8590   if (!nds32_get_local_syms (abfd, sec, &isym))
8591     return FALSE;
8592
8593   if (isym == NULL)
8594     {
8595       isym = bfd_elf_get_elf_syms (abfd, symtab_hdr,
8596                                    symtab_hdr->sh_info, 0, NULL, NULL, NULL);
8597       symtab_hdr->contents = (bfd_byte *) isym;
8598     }
8599
8600   if (isym == NULL || symtab_hdr->sh_info == 0)
8601     return FALSE;
8602
8603   blank_t = blank_head;
8604   calc_nds32_blank_total (blank_head);
8605
8606   for (sect = abfd->sections; sect != NULL; sect = sect->next)
8607     {
8608       /* Adjust all the relocs.  */
8609
8610       /* Relocations MUST be kept in memory, because relaxation adjust them.  */
8611       internal_relocs = _bfd_elf_link_read_relocs (abfd, sect, NULL, NULL,
8612                                                    TRUE /* keep_memory */);
8613       irelend = internal_relocs + sect->reloc_count;
8614
8615       blank_t = blank_head;
8616       blank_t2 = blank_head;
8617
8618       if (!(sect->flags & SEC_RELOC))
8619         continue;
8620
8621       nds32_get_section_contents (abfd, sect, &contents, TRUE);
8622
8623       for (irel = internal_relocs; irel < irelend; irel++)
8624         {
8625           bfd_vma raddr;
8626
8627           if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_DIFF8
8628               && ELF32_R_TYPE (irel->r_info) <= R_NDS32_DIFF32
8629               && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
8630             {
8631               unsigned long val = 0;
8632               unsigned long mask;
8633               long before, between;
8634               long offset = 0;
8635
8636               switch (ELF32_R_TYPE (irel->r_info))
8637                 {
8638                 case R_NDS32_DIFF8:
8639                   offset = bfd_get_8 (abfd, contents + irel->r_offset);
8640                   break;
8641                 case R_NDS32_DIFF16:
8642                   offset = bfd_get_16 (abfd, contents + irel->r_offset);
8643                   break;
8644                 case R_NDS32_DIFF32:
8645                   val = bfd_get_32 (abfd, contents + irel->r_offset);
8646                   /* Get the signed bit and mask for the high part.  The
8647                      gcc will alarm when right shift 32-bit since the
8648                      type size of long may be 32-bit.  */
8649                   mask = 0 - (val >> 31);
8650                   if (mask)
8651                     offset = (val | (mask - 0xffffffff));
8652                   else
8653                     offset = val;
8654                   break;
8655                 default:
8656                   BFD_ASSERT (0);
8657                 }
8658
8659               /*                  DIFF value
8660                 0            |encoded in location|
8661                 |------------|-------------------|---------
8662                             sym+off(addend)
8663                 -- before ---| *****************
8664                 --------------------- between ---|
8665
8666                 We only care how much data are relax between DIFF,
8667                 marked as ***.  */
8668
8669               before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
8670               between = get_nds32_elf_blank_total (&blank_t,
8671                                                    irel->r_addend + offset, 0);
8672               if (between == before)
8673                 goto done_adjust_diff;
8674
8675               switch (ELF32_R_TYPE (irel->r_info))
8676                 {
8677                 case R_NDS32_DIFF8:
8678                   bfd_put_8 (abfd, offset - (between - before),
8679                              contents + irel->r_offset);
8680                   break;
8681                 case R_NDS32_DIFF16:
8682                   bfd_put_16 (abfd, offset - (between - before),
8683                               contents + irel->r_offset);
8684                   break;
8685                 case R_NDS32_DIFF32:
8686                   bfd_put_32 (abfd, offset - (between - before),
8687                               contents + irel->r_offset);
8688                   break;
8689                 }
8690             }
8691           else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_DIFF_ULEB128
8692               && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
8693             {
8694               bfd_vma val = 0;
8695               unsigned int len = 0;
8696               unsigned long before, between;
8697               bfd_byte *endp, *p;
8698
8699               val = read_unsigned_leb128 (abfd, contents + irel->r_offset,
8700                                           &len);
8701
8702               before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
8703               between = get_nds32_elf_blank_total (&blank_t,
8704                                                    irel->r_addend + val, 0);
8705               if (between == before)
8706                 goto done_adjust_diff;
8707
8708               p = contents + irel->r_offset;
8709               endp = p + len -1;
8710               memset (p, 0x80, len);
8711               *(endp) = 0;
8712               p = write_uleb128 (p, val - (between - before)) - 1;
8713               if (p < endp)
8714                 *p |= 0x80;
8715             }
8716 done_adjust_diff:
8717
8718           if (sec == sect)
8719             {
8720               raddr = irel->r_offset;
8721               irel->r_offset -= get_nds32_elf_blank_total (&blank_t2,
8722                                                            irel->r_offset, 1);
8723
8724               if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
8725                 continue;
8726               if (blank_t2 && blank_t2->next
8727                   && (blank_t2->offset > raddr
8728                       || blank_t2->next->offset <= raddr))
8729                 _bfd_error_handler
8730                   (_("%B: Error: search_nds32_elf_blank reports wrong node\n"), abfd);
8731
8732               /* Mark reloc in deleted portion as NONE.
8733                  For some relocs like R_NDS32_LABEL that doesn't modify the
8734                  content in the section.  R_NDS32_LABEL doesn't belong to the
8735                  instruction in the section, so we should preserve it.  */
8736               if (raddr >= blank_t2->offset
8737                   && raddr < blank_t2->offset + blank_t2->size
8738                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL
8739                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_BEGIN
8740                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_END
8741                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
8742                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_SUBTRAHEND
8743                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_MINUEND)
8744                 {
8745                   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
8746                                                R_NDS32_NONE);
8747                   continue;
8748                 }
8749             }
8750
8751           if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE
8752               || ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
8753               || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
8754             continue;
8755
8756           if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info
8757               && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx
8758               && ELF_ST_TYPE (isym[ELF32_R_SYM (irel->r_info)].st_info) == STT_SECTION)
8759             {
8760               if (irel->r_addend <= sec->size)
8761                 irel->r_addend -=
8762                   get_nds32_elf_blank_total (&blank_t, irel->r_addend, 1);
8763             }
8764         }
8765     }
8766
8767   /* Adjust the local symbols defined in this section.  */
8768   blank_t = blank_head;
8769   for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
8770     {
8771       if (isym->st_shndx == sec_shndx)
8772         {
8773           if (isym->st_value <= sec->size)
8774             {
8775               bfd_vma ahead;
8776               bfd_vma orig_addr = isym->st_value;
8777
8778               ahead = get_nds32_elf_blank_total (&blank_t, isym->st_value, 1);
8779               isym->st_value -= ahead;
8780
8781               /* Adjust function size.  */
8782               if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC
8783                   && isym->st_size > 0)
8784                 isym->st_size -=
8785                   get_nds32_elf_blank_total
8786                   (&blank_t, orig_addr + isym->st_size, 0) - ahead;
8787             }
8788         }
8789     }
8790
8791   /* Now adjust the global symbols defined in this section.  */
8792   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
8793               - symtab_hdr->sh_info);
8794   sym_hashes = elf_sym_hashes (abfd);
8795   end_hashes = sym_hashes + symcount;
8796   blank_t = blank_head;
8797   for (; sym_hashes < end_hashes; sym_hashes++)
8798     {
8799       struct elf_link_hash_entry *sym_hash = *sym_hashes;
8800
8801       if ((sym_hash->root.type == bfd_link_hash_defined
8802            || sym_hash->root.type == bfd_link_hash_defweak)
8803           && sym_hash->root.u.def.section == sec)
8804         {
8805           if (sym_hash->root.u.def.value <= sec->size)
8806             {
8807               bfd_vma ahead;
8808               bfd_vma orig_addr = sym_hash->root.u.def.value;
8809
8810               ahead = get_nds32_elf_blank_total (&blank_t, sym_hash->root.u.def.value, 1);
8811               sym_hash->root.u.def.value -= ahead;
8812
8813               /* Adjust function size.  */
8814               if (sym_hash->type == STT_FUNC)
8815                 sym_hash->size -=
8816                   get_nds32_elf_blank_total
8817                   (&blank_t, orig_addr + sym_hash->size, 0) - ahead;
8818
8819             }
8820         }
8821     }
8822
8823   contents = elf_section_data (sec)->this_hdr.contents;
8824   blank_t = blank_head;
8825   while (blank_t->next)
8826     {
8827       /* Actually delete the bytes.  */
8828
8829       /* If current blank is the last blank overlap with current section,
8830          go to finish process.  */
8831       if (sec->size <= (blank_t->next->offset))
8832         break;
8833
8834       memmove (contents + blank_t->offset - blank_t->total_size,
8835                contents + blank_t->offset + blank_t->size,
8836                blank_t->next->offset - (blank_t->offset + blank_t->size));
8837
8838       blank_t = blank_t->next;
8839     }
8840
8841   if (sec->size > (blank_t->offset + blank_t->size))
8842     {
8843       /* There are remaining code between blank and section boundary.
8844          Move the remaining code to appropriate location.  */
8845       memmove (contents + blank_t->offset - blank_t->total_size,
8846                contents + blank_t->offset + blank_t->size,
8847                sec->size - (blank_t->offset + blank_t->size));
8848       sec->size -= blank_t->total_size + blank_t->size;
8849     }
8850   else
8851     /* This blank is not entirely included in the section,
8852        reduce the section size by only part of the blank size.  */
8853     sec->size -= blank_t->total_size + (sec->size - blank_t->offset);
8854
8855   while (blank_head)
8856     {
8857       blank_t = blank_head;
8858       blank_head = blank_head->next;
8859       remove_nds32_elf_blank (blank_t);
8860     }
8861
8862   return TRUE;
8863 }
8864
8865 /* Get the contents of a section.  */
8866
8867 static int
8868 nds32_get_section_contents (bfd *abfd, asection *sec,
8869                             bfd_byte **contents_p, bfd_boolean cache)
8870 {
8871   /* Get the section contents.  */
8872   if (elf_section_data (sec)->this_hdr.contents != NULL)
8873     *contents_p = elf_section_data (sec)->this_hdr.contents;
8874   else
8875     {
8876       if (!bfd_malloc_and_get_section (abfd, sec, contents_p))
8877         return FALSE;
8878       if (cache)
8879         elf_section_data (sec)->this_hdr.contents = *contents_p;
8880     }
8881
8882   return TRUE;
8883 }
8884
8885 /* Get the contents of the internal symbol of abfd.  */
8886
8887 static int
8888 nds32_get_local_syms (bfd *abfd, asection *sec ATTRIBUTE_UNUSED,
8889                       Elf_Internal_Sym **isymbuf_p)
8890 {
8891   Elf_Internal_Shdr *symtab_hdr;
8892   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8893
8894   /* Read this BFD's local symbols if we haven't done so already.  */
8895   if (*isymbuf_p == NULL && symtab_hdr->sh_info != 0)
8896     {
8897       *isymbuf_p = (Elf_Internal_Sym *) symtab_hdr->contents;
8898       if (*isymbuf_p == NULL)
8899         {
8900           *isymbuf_p = bfd_elf_get_elf_syms (abfd, symtab_hdr,
8901                                              symtab_hdr->sh_info, 0,
8902                                              NULL, NULL, NULL);
8903           if (*isymbuf_p == NULL)
8904             return FALSE;
8905         }
8906     }
8907   symtab_hdr->contents = (bfd_byte *) (*isymbuf_p);
8908
8909   return TRUE;
8910 }
8911
8912 /* Range of small data.  */
8913 static bfd_vma sdata_range[2][2];
8914 static bfd_vma const sdata_init_range[2] =
8915 { ACCURATE_12BIT_S1, ACCURATE_19BIT };
8916
8917 static int
8918 nds32_elf_insn_size (bfd *abfd ATTRIBUTE_UNUSED,
8919                      bfd_byte *contents, bfd_vma addr)
8920 {
8921   unsigned long insn = bfd_getb32 (contents + addr);
8922
8923   if (insn & 0x80000000)
8924     return 2;
8925
8926   return 4;
8927 }
8928
8929 /* Set the gp relax range.  We have to measure the safe range
8930    to do gp relaxation.  */
8931
8932 static void
8933 relax_range_measurement (bfd *abfd)
8934 {
8935   asection *sec_f, *sec_b;
8936   /* For upper bound.   */
8937   bfd_vma maxpgsz = get_elf_backend_data (abfd)->maxpagesize;
8938   bfd_vma align;
8939   static int decide_relax_range = 0;
8940   int i;
8941   int range_number = sizeof (sdata_init_range) / sizeof (sdata_init_range[0]);
8942
8943   if (decide_relax_range)
8944     return;
8945   decide_relax_range = 1;
8946
8947   if (sda_rela_sec == NULL)
8948     {
8949       /* Since there is no data sections, we assume the range is page size.  */
8950       for (i = 0; i < range_number; i++)
8951         {
8952           sdata_range[i][0] = sdata_init_range[i] - 0x1000;
8953           sdata_range[i][1] = sdata_init_range[i] - 0x1000;
8954         }
8955       return;
8956     }
8957
8958   /* Get the biggest alignment power after the gp located section.  */
8959   sec_f = sda_rela_sec->output_section;
8960   sec_b = sec_f->next;
8961   align = 0;
8962   while (sec_b != NULL)
8963     {
8964       if ((unsigned)(1 << sec_b->alignment_power) > align)
8965         align = (1 << sec_b->alignment_power);
8966       sec_b = sec_b->next;
8967     }
8968
8969   /* I guess we can not determine the section before
8970      gp located section, so we assume the align is max page size.  */
8971   for (i = 0; i < range_number; i++)
8972     {
8973       sdata_range[i][1] = sdata_init_range[i] - align;
8974       BFD_ASSERT (sdata_range[i][1] <= sdata_init_range[i]);
8975       sdata_range[i][0] = sdata_init_range[i] - maxpgsz;
8976       BFD_ASSERT (sdata_range[i][0] <= sdata_init_range[i]);
8977     }
8978 }
8979
8980 /* These are macros used to check flags encoded in r_addend.
8981    They are only used by nds32_elf_relax_section ().  */
8982 #define GET_SEQ_LEN(addend)     ((addend) & 0x000000ff)
8983 #define IS_1ST_CONVERT(addend)  ((addend) & 0x80000000)
8984 #define IS_OPTIMIZE(addend)     ((addend) & 0x40000000)
8985 #define IS_16BIT_ON(addend)     ((addend) & 0x20000000)
8986
8987 static const char * unrecognized_reloc_msg =
8988   /* xgettext:c-format */
8989   N_("%B: warning: %s points to unrecognized reloc at 0x%lx.");
8990
8991 /* Relax LONGCALL1 relocation for nds32_elf_relax_section.  */
8992
8993 static bfd_boolean
8994 nds32_elf_relax_longcall1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
8995                            Elf_Internal_Rela *internal_relocs, int *insn_len,
8996                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
8997                            Elf_Internal_Shdr *symtab_hdr)
8998 {
8999   /* There are 3 variations for LONGCALL1
9000      case 4-4-2; 16-bit on, optimize off or optimize for space
9001      sethi ta, hi20(symbol)     ; LONGCALL1/HI20
9002      ori   ta, ta, lo12(symbol) ; LO12S0
9003      jral5 ta                   ;
9004
9005      case 4-4-4; 16-bit off, optimize don't care
9006      sethi ta, hi20(symbol)     ; LONGCALL1/HI20
9007      ori   ta, ta, lo12(symbol) ; LO12S0
9008      jral  ta                   ;
9009
9010      case 4-4-4; 16-bit on, optimize for speed
9011      sethi ta, hi20(symbol)     ; LONGCALL1/HI20
9012      ori   ta, ta, lo12(symbol) ; LO12S0
9013      jral  ta                   ;
9014      Check code for -mlong-calls output.  */
9015
9016   /* Get the reloc for the address from which the register is
9017      being loaded.  This reloc will tell us which function is
9018      actually being called.  */
9019
9020   bfd_vma laddr;
9021   int seq_len;  /* Original length of instruction sequence.  */
9022   uint32_t insn;
9023   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
9024   int pic_ext_target = 0;
9025   bfd_signed_vma foff;
9026   uint16_t insn16;
9027
9028   irelend = internal_relocs + sec->reloc_count;
9029   seq_len = GET_SEQ_LEN (irel->r_addend);
9030   laddr = irel->r_offset;
9031   *insn_len = seq_len;
9032
9033   hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9034                                            R_NDS32_HI20_RELA, laddr);
9035   lo_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9036                                            R_NDS32_LO12S0_ORI_RELA,
9037                                            laddr + 4);
9038
9039   if (hi_irelfn == irelend || lo_irelfn == irelend)
9040     {
9041       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL1",
9042                           (long) irel->r_offset);
9043       return FALSE;
9044     }
9045
9046   /* Get the value of the symbol referred to by the reloc.  */
9047   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9048                            &pic_ext_target);
9049
9050   /* This condition only happened when symbol is undefined.  */
9051   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9052       || foff >= CONSERVATIVE_24BIT_S1)
9053     return FALSE;
9054
9055   /* Relax to: jal symbol; 25_PCREL */
9056   /* For simplicity of coding, we are going to modify the section
9057      contents, the section relocs, and the BFD symbol table.  We
9058      must tell the rest of the code not to free up this
9059      information.  It would be possible to instead create a table
9060      of changes which have to be made, as is done in coff-mips.c;
9061      that would be more work, but would require less memory when
9062      the linker is run.  */
9063
9064   /* Replace the long call with a jal.  */
9065   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9066                                R_NDS32_25_PCREL_RELA);
9067   irel->r_addend = hi_irelfn->r_addend;
9068
9069   /* We don't resolve this here but resolve it in relocate_section.  */
9070   insn = INSN_JAL;
9071   bfd_putb32 (insn, contents + irel->r_offset);
9072
9073   hi_irelfn->r_info =
9074     ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9075   lo_irelfn->r_info =
9076     ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9077   *insn_len = 4;
9078
9079   if (seq_len & 0x2)
9080     {
9081       insn16 = NDS32_NOP16;
9082       bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9083       lo_irelfn->r_info =
9084         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
9085       lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9086       *insn_len += 2;
9087     }
9088   return TRUE;
9089 }
9090
9091 #define CONVERT_CONDITION_CALL(insn) (((insn) & 0xffff0000) ^ 0x90000)
9092 /* Relax LONGCALL2 relocation for nds32_elf_relax_section.  */
9093
9094 static bfd_boolean
9095 nds32_elf_relax_longcall2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9096                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9097                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9098                            Elf_Internal_Shdr *symtab_hdr)
9099 {
9100   /* bltz  rt, .L1   ; LONGCALL2
9101      jal   symbol   ; 25_PCREL
9102      .L1: */
9103
9104   /* Get the reloc for the address from which the register is
9105      being loaded.  This reloc will tell us which function is
9106      actually being called.  */
9107
9108   bfd_vma laddr;
9109   uint32_t insn;
9110   Elf_Internal_Rela *i1_irelfn, *cond_irelfn, *irelend;
9111   int pic_ext_target = 0;
9112   bfd_signed_vma foff;
9113
9114   irelend = internal_relocs + sec->reloc_count;
9115   laddr = irel->r_offset;
9116   i1_irelfn =
9117     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9118                                  R_NDS32_25_PCREL_RELA, laddr + 4);
9119
9120   if (i1_irelfn == irelend)
9121     {
9122       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL2",
9123                           (long) irel->r_offset);
9124       return FALSE;
9125     }
9126
9127   insn = bfd_getb32 (contents + laddr);
9128
9129   /* Get the value of the symbol referred to by the reloc.  */
9130   foff = calculate_offset (abfd, sec, i1_irelfn, isymbuf, symtab_hdr,
9131                            &pic_ext_target);
9132
9133   if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1
9134       || foff >= CONSERVATIVE_16BIT_S1)
9135     return FALSE;
9136
9137   /* Relax to   bgezal   rt, label ; 17_PCREL
9138      or         bltzal   rt, label ; 17_PCREL */
9139
9140   /* Convert to complimentary conditional call.  */
9141   insn = CONVERT_CONDITION_CALL (insn);
9142
9143   /* For simplicity of coding, we are going to modify the section
9144      contents, the section relocs, and the BFD symbol table.  We
9145      must tell the rest of the code not to free up this
9146      information.  It would be possible to instead create a table
9147      of changes which have to be made, as is done in coff-mips.c;
9148      that would be more work, but would require less memory when
9149      the linker is run.  */
9150
9151   /* Clean unnessary relocations.  */
9152   i1_irelfn->r_info =
9153     ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info), R_NDS32_NONE);
9154   cond_irelfn =
9155     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9156                                  R_NDS32_17_PCREL_RELA, laddr);
9157   if (cond_irelfn != irelend)
9158     cond_irelfn->r_info =
9159       ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info), R_NDS32_NONE);
9160
9161   /* Replace the long call with a bgezal.  */
9162   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info),
9163                                R_NDS32_17_PCREL_RELA);
9164   irel->r_addend = i1_irelfn->r_addend;
9165
9166   bfd_putb32 (insn, contents + irel->r_offset);
9167
9168   *insn_len = 4;
9169   return TRUE;
9170 }
9171
9172 /* Relax LONGCALL3 relocation for nds32_elf_relax_section.  */
9173
9174 static bfd_boolean
9175 nds32_elf_relax_longcall3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9176                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9177                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9178                            Elf_Internal_Shdr *symtab_hdr)
9179 {
9180   /* There are 3 variations for LONGCALL3
9181      case 4-4-4-2; 16-bit on, optimize off or optimize for space
9182      bltz  rt,   $1                ; LONGCALL3
9183      sethi ta,   hi20(symbol)      ; HI20
9184      ori   ta, ta,  lo12(symbol)   ; LO12S0
9185      jral5 ta                      ;
9186      $1
9187
9188      case 4-4-4-4; 16-bit off, optimize don't care
9189      bltz  rt,   $1                ; LONGCALL3
9190      sethi ta,   hi20(symbol)      ; HI20
9191      ori   ta, ta,  lo12(symbol)   ; LO12S0
9192      jral  ta                      ;
9193      $1
9194
9195      case 4-4-4-4; 16-bit on, optimize for speed
9196      bltz  rt,   $1                ; LONGCALL3
9197      sethi ta,   hi20(symbol)      ; HI20
9198      ori   ta, ta,  lo12(symbol)   ; LO12S0
9199      jral  ta                      ;
9200      $1 */
9201
9202   /* Get the reloc for the address from which the register is
9203      being loaded.  This reloc will tell us which function is
9204      actually being called.  */
9205
9206   bfd_vma laddr;
9207   int seq_len;  /* Original length of instruction sequence.  */
9208   uint32_t insn;
9209   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
9210   int pic_ext_target = 0;
9211   bfd_signed_vma foff;
9212   uint16_t insn16;
9213
9214   irelend = internal_relocs + sec->reloc_count;
9215   seq_len = GET_SEQ_LEN (irel->r_addend);
9216   laddr = irel->r_offset;
9217   *insn_len = seq_len;
9218
9219   hi_irelfn =
9220     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9221                                  R_NDS32_HI20_RELA, laddr + 4);
9222   lo_irelfn =
9223     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9224                                  R_NDS32_LO12S0_ORI_RELA, laddr + 8);
9225
9226   if (hi_irelfn == irelend || lo_irelfn == irelend)
9227     {
9228       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL3",
9229                           (long) irel->r_offset);
9230       return FALSE;
9231     }
9232
9233   /* Get the value of the symbol referred to by the reloc.  */
9234   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9235                            &pic_ext_target);
9236
9237   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9238       || foff >= CONSERVATIVE_24BIT_S1)
9239     return FALSE;
9240
9241   insn = bfd_getb32 (contents + laddr);
9242   if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
9243     {
9244       /* Relax to  bgezal   rt, label ; 17_PCREL
9245          or        bltzal   rt, label ; 17_PCREL */
9246
9247       /* Convert to complimentary conditional call.  */
9248       insn = CONVERT_CONDITION_CALL (insn);
9249       bfd_putb32 (insn, contents + irel->r_offset);
9250
9251       *insn_len = 4;
9252       irel->r_info =
9253         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9254       hi_irelfn->r_info =
9255         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9256       lo_irelfn->r_info =
9257         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9258
9259       cond_irelfn =
9260         find_relocs_at_address_addr (irel, internal_relocs, irelend,
9261                                      R_NDS32_17_PCREL_RELA, laddr);
9262       if (cond_irelfn != irelend)
9263         {
9264           cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9265                                               R_NDS32_17_PCREL_RELA);
9266           cond_irelfn->r_addend = hi_irelfn->r_addend;
9267         }
9268
9269       if (seq_len & 0x2)
9270         {
9271           insn16 = NDS32_NOP16;
9272           bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9273           hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9274                                             R_NDS32_INSN16);
9275           hi_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9276           insn_len += 2;
9277         }
9278     }
9279   else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
9280     {
9281       /* Relax to the following instruction sequence
9282          bltz  rt,   $1 ; LONGCALL2
9283          jal   symbol   ; 25_PCREL
9284          $1     */
9285       *insn_len = 8;
9286       insn = INSN_JAL;
9287       bfd_putb32 (insn, contents + hi_irelfn->r_offset);
9288
9289       hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9290                                         R_NDS32_25_PCREL_RELA);
9291       irel->r_info =
9292         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL2);
9293
9294       lo_irelfn->r_info =
9295         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9296
9297       if (seq_len & 0x2)
9298         {
9299           insn16 = NDS32_NOP16;
9300           bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9301           lo_irelfn->r_info =
9302             ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
9303           lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9304           insn_len += 2;
9305         }
9306     }
9307   return TRUE;
9308 }
9309
9310 /* Relax LONGJUMP1 relocation for nds32_elf_relax_section.  */
9311
9312 static bfd_boolean
9313 nds32_elf_relax_longjump1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9314                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9315                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9316                            Elf_Internal_Shdr *symtab_hdr)
9317 {
9318   /* There are 3 variations for LONGJUMP1
9319      case 4-4-2; 16-bit bit on, optimize off or optimize for space
9320      sethi ta, hi20(symbol)      ; LONGJUMP1/HI20
9321      ori   ta, ta, lo12(symbol)  ; LO12S0
9322      jr5   ta                    ;
9323
9324      case 4-4-4; 16-bit off, optimize don't care
9325      sethi ta, hi20(symbol)      ; LONGJUMP1/HI20
9326      ori   ta, ta, lo12(symbol)  ; LO12S0
9327      jr    ta                    ;
9328
9329      case 4-4-4; 16-bit on, optimize for speed
9330      sethi ta, hi20(symbol)      ; LONGJUMP1/HI20
9331      ori   ta, ta, lo12(symbol)  ; LO12S0
9332      jr    ta                    ;      */
9333
9334   /* Get the reloc for the address from which the register is
9335      being loaded.  This reloc will tell us which function is
9336      actually being called.  */
9337
9338   bfd_vma laddr;
9339   int seq_len;  /* Original length of instruction sequence.  */
9340   int insn16_on;        /* 16-bit on/off.  */
9341   uint32_t insn;
9342   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
9343   int pic_ext_target = 0;
9344   bfd_signed_vma foff;
9345   uint16_t insn16;
9346   unsigned long reloc;
9347
9348   irelend = internal_relocs + sec->reloc_count;
9349   seq_len = GET_SEQ_LEN (irel->r_addend);
9350   laddr = irel->r_offset;
9351   *insn_len = seq_len;
9352   insn16_on = IS_16BIT_ON (irel->r_addend);
9353
9354   hi_irelfn =
9355     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9356                                  R_NDS32_HI20_RELA, laddr);
9357   lo_irelfn =
9358     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9359                                  R_NDS32_LO12S0_ORI_RELA, laddr + 4);
9360   if (hi_irelfn == irelend || lo_irelfn == irelend)
9361     {
9362       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP1",
9363                           (long) irel->r_offset);
9364       return FALSE;
9365     }
9366
9367   /* Get the value of the symbol referred to by the reloc.  */
9368   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9369                            &pic_ext_target);
9370
9371   if (pic_ext_target || foff == 0 || foff >= CONSERVATIVE_24BIT_S1
9372       || foff < -CONSERVATIVE_24BIT_S1)
9373     return FALSE;
9374
9375   if (insn16_on && foff >= -ACCURATE_8BIT_S1
9376       && foff < ACCURATE_8BIT_S1 && (seq_len & 0x2))
9377     {
9378       /* j8     label */
9379       /* 16-bit on, but not optimized for speed.  */
9380       reloc = R_NDS32_9_PCREL_RELA;
9381       insn16 = INSN_J8;
9382       bfd_putb16 (insn16, contents + irel->r_offset);
9383       *insn_len = 2;
9384       irel->r_info =
9385         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
9386     }
9387   else
9388     {
9389       /* j     label */
9390       reloc = R_NDS32_25_PCREL_RELA;
9391       insn = INSN_J;
9392       bfd_putb32 (insn, contents + irel->r_offset);
9393       *insn_len = 4;
9394       irel->r_info =
9395         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_INSN16);
9396       irel->r_addend = 0;
9397     }
9398
9399   hi_irelfn->r_info =
9400     ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
9401   lo_irelfn->r_info =
9402     ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9403
9404   if ((seq_len & 0x2) && ((*insn_len & 2) == 0))
9405     {
9406       insn16 = NDS32_NOP16;
9407       bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9408       lo_irelfn->r_info =
9409         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
9410                       R_NDS32_INSN16);
9411       lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9412       *insn_len += 2;
9413     }
9414   return TRUE;
9415 }
9416
9417 /* Revert condition branch.  This function does not check if the input
9418    instruction is condition branch or not.  */
9419
9420 static void
9421 nds32_elf_convert_branch (uint16_t insn16, uint32_t insn,
9422                            uint16_t *re_insn16, uint32_t *re_insn)
9423 {
9424   uint32_t comp_insn = 0;
9425   uint16_t comp_insn16 = 0;
9426
9427   if (insn)
9428     {
9429       if (N32_OP6 (insn) == N32_OP6_BR1)
9430         {
9431           /* beqs label.  */
9432           comp_insn = (insn ^ 0x4000) & 0xffffc000;
9433           if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5)
9434             {
9435               /* Insn can be contracted to 16-bit implied r5.  */
9436               comp_insn16 =
9437                 (comp_insn & 0x4000) ? INSN_BNES38 : INSN_BEQS38;
9438               comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
9439             }
9440         }
9441       else if (N32_OP6 (insn) == N32_OP6_BR3)
9442         {
9443           /* bnec $ta, imm11, label.  */
9444           comp_insn = (insn ^ 0x80000) & 0xffffff00;
9445         }
9446       else
9447         {
9448           comp_insn = (insn ^ 0x10000) & 0xffffc000;
9449           if (N32_BR2_SUB (insn) == N32_BR2_BEQZ
9450               || N32_BR2_SUB (insn) == N32_BR2_BNEZ)
9451             {
9452               if (N32_IS_RT3 (insn))
9453                 {
9454                   /* Insn can be contracted to 16-bit.  */
9455                   comp_insn16 =
9456                     (comp_insn & 0x10000) ? INSN_BNEZ38 : INSN_BEQZ38;
9457                   comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
9458                 }
9459               else if (N32_RT5 (insn) == REG_R15)
9460                 {
9461                   /* Insn can be contracted to 16-bit.  */
9462                   comp_insn16 =
9463                     (comp_insn & 0x10000) ? INSN_BNES38 : INSN_BEQS38;
9464                 }
9465             }
9466         }
9467     }
9468   else
9469     {
9470       switch ((insn16 & 0xf000) >> 12)
9471         {
9472         case 0xc:
9473           /* beqz38 or bnez38 */
9474           comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
9475           comp_insn = (comp_insn16 & 0x0800) ? INSN_BNEZ : INSN_BEQZ;
9476           comp_insn |= ((comp_insn16 & 0x0700) >> 8) << 20;
9477           break;
9478
9479         case 0xd:
9480           /* beqs38 or bnes38 */
9481           comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
9482           comp_insn = (comp_insn16 & 0x0800) ? INSN_BNE : INSN_BEQ;
9483           comp_insn |= (((comp_insn16 & 0x0700) >> 8) << 20)
9484             | (REG_R5 << 15);
9485           break;
9486
9487         case 0xe:
9488           /* beqzS8 or bnezS8 */
9489           comp_insn16 = (insn16 ^ 0x0100) & 0xff00;
9490           comp_insn = (comp_insn16 & 0x0100) ? INSN_BNEZ : INSN_BEQZ;
9491           comp_insn |= REG_R15 << 20;
9492           break;
9493
9494         default:
9495           break;
9496         }
9497     }
9498   if (comp_insn && re_insn)
9499     *re_insn = comp_insn;
9500   if (comp_insn16 && re_insn16)
9501     *re_insn16 = comp_insn16;
9502 }
9503
9504 /* Relax LONGJUMP2 relocation for nds32_elf_relax_section.  */
9505
9506 static bfd_boolean
9507 nds32_elf_relax_longjump2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9508                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9509                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9510                            Elf_Internal_Shdr *symtab_hdr)
9511 {
9512   /* There are 3 variations for LONGJUMP2
9513      case 2-4;  1st insn convertible, 16-bit on,
9514      optimize off or optimize for space
9515      bnes38  rt, ra, $1 ; LONGJUMP2
9516      j       label      ; 25_PCREL
9517      $1:
9518
9519      case 4-4; 1st insn not convertible
9520      bne  rt, ra, $1 ; LONGJUMP2
9521      j    label      ; 25_PCREL
9522      $1:
9523
9524      case 4-4; 1st insn convertible, 16-bit on, optimize for speed
9525      bne  rt, ra, $1 ; LONGJUMP2
9526      j    label      ; 25_PCREL
9527      $1: */
9528
9529   /* Get the reloc for the address from which the register is
9530      being loaded.  This reloc will tell us which function is
9531      actually being called.  */
9532
9533   bfd_vma laddr;
9534   int seq_len;  /* Original length of instruction sequence.  */
9535   Elf_Internal_Rela *i2_irelfn, *cond_irelfn, *irelend;
9536   int pic_ext_target = 0, first_size;
9537   unsigned int i;
9538   bfd_signed_vma foff;
9539   uint32_t insn, re_insn = 0;
9540   uint16_t insn16, re_insn16 = 0;
9541   unsigned long reloc, cond_reloc;
9542
9543   enum elf_nds32_reloc_type checked_types[] =
9544     { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
9545
9546   irelend = internal_relocs + sec->reloc_count;
9547   seq_len = GET_SEQ_LEN (irel->r_addend);
9548   laddr = irel->r_offset;
9549   *insn_len = seq_len;
9550   first_size = (seq_len == 6) ? 2 : 4;
9551
9552   i2_irelfn =
9553     find_relocs_at_address_addr (irel, internal_relocs,
9554                                  irelend, R_NDS32_25_PCREL_RELA,
9555                                  laddr + first_size);
9556
9557   for (i = 0; i < sizeof (checked_types) / sizeof(checked_types[0]); i++)
9558     {
9559       cond_irelfn =
9560         find_relocs_at_address_addr (irel, internal_relocs, irelend,
9561                                      checked_types[i], laddr);
9562       if (cond_irelfn != irelend)
9563         break;
9564     }
9565
9566   if (i2_irelfn == irelend || cond_irelfn == irelend)
9567     {
9568       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP2",
9569                           (long) irel->r_offset);
9570       return FALSE;
9571     }
9572
9573   /* Get the value of the symbol referred to by the reloc.  */
9574   foff =
9575     calculate_offset (abfd, sec, i2_irelfn, isymbuf, symtab_hdr,
9576                       &pic_ext_target);
9577   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_16BIT_S1
9578       || foff >= CONSERVATIVE_16BIT_S1)
9579     return FALSE;
9580
9581   /* Get the all corresponding instructions.  */
9582   if (first_size == 4)
9583     {
9584       insn = bfd_getb32 (contents + laddr);
9585       nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
9586     }
9587   else
9588     {
9589       insn16 = bfd_getb16 (contents + laddr);
9590       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
9591     }
9592
9593   if (re_insn16 && foff >= -(ACCURATE_8BIT_S1 - first_size)
9594       && foff < ACCURATE_8BIT_S1 - first_size)
9595     {
9596       if (first_size == 4)
9597         {
9598           /* Don't convert it to 16-bit now, keep this as relaxable for
9599              ``label reloc; INSN16''.  */
9600
9601           /* Save comp_insn32 to buffer.  */
9602           bfd_putb32 (re_insn, contents + irel->r_offset);
9603           *insn_len = 4;
9604           reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
9605             R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
9606           cond_reloc = R_NDS32_INSN16;
9607         }
9608       else
9609         {
9610           bfd_putb16 (re_insn16, contents + irel->r_offset);
9611           *insn_len = 2;
9612           reloc = R_NDS32_9_PCREL_RELA;
9613           cond_reloc = R_NDS32_NONE;
9614         }
9615     }
9616   else if (N32_OP6 (re_insn) == N32_OP6_BR1
9617            && (foff >= -(ACCURATE_14BIT_S1 - first_size)
9618                && foff < ACCURATE_14BIT_S1 - first_size))
9619     {
9620       /* beqs     label    ; 15_PCREL */
9621       bfd_putb32 (re_insn, contents + irel->r_offset);
9622       *insn_len = 4;
9623       reloc = R_NDS32_15_PCREL_RELA;
9624       cond_reloc = R_NDS32_NONE;
9625     }
9626   else if (N32_OP6 (re_insn) == N32_OP6_BR2
9627            && foff >= -CONSERVATIVE_16BIT_S1
9628            && foff < CONSERVATIVE_16BIT_S1)
9629     {
9630       /* beqz     label ; 17_PCREL */
9631       bfd_putb32 (re_insn, contents + irel->r_offset);
9632       *insn_len = 4;
9633       reloc = R_NDS32_17_PCREL_RELA;
9634       cond_reloc = R_NDS32_NONE;
9635     }
9636   else
9637     return FALSE;
9638
9639   /* Set all relocations.  */
9640   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info), reloc);
9641   irel->r_addend = i2_irelfn->r_addend;
9642
9643   cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
9644                                       cond_reloc);
9645   cond_irelfn->r_addend = 0;
9646
9647   if ((seq_len ^ *insn_len ) & 0x2)
9648     {
9649       insn16 = NDS32_NOP16;
9650       bfd_putb16 (insn16, contents + irel->r_offset + 4);
9651       i2_irelfn->r_offset = 4;
9652       i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
9653                                         R_NDS32_INSN16);
9654       i2_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9655       *insn_len += 2;
9656     }
9657   else
9658     i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
9659                                       R_NDS32_NONE);
9660   return TRUE;
9661 }
9662
9663 /* Relax LONGJUMP3 relocation for nds32_elf_relax_section.  */
9664
9665 static bfd_boolean
9666 nds32_elf_relax_longjump3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9667                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9668                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9669                            Elf_Internal_Shdr *symtab_hdr)
9670 {
9671   /* There are 5 variations for LONGJUMP3
9672      case 1: 2-4-4-2; 1st insn convertible, 16-bit on,
9673      optimize off or optimize for space
9674      bnes38   rt, ra, $1            ; LONGJUMP3
9675      sethi    ta, hi20(symbol)      ; HI20
9676      ori      ta, ta, lo12(symbol)  ; LO12S0
9677      jr5      ta                    ;
9678      $1:                            ;
9679
9680      case 2: 2-4-4-2; 1st insn convertible, 16-bit on, optimize for speed
9681      bnes38   rt, ra, $1           ; LONGJUMP3
9682      sethi    ta, hi20(symbol)     ; HI20
9683      ori      ta, ta, lo12(symbol) ; LO12S0
9684      jr5      ta                   ;
9685      $1:                           ; LABEL
9686
9687      case 3: 4-4-4-2; 1st insn not convertible, 16-bit on,
9688      optimize off or optimize for space
9689      bne   rt, ra, $1           ; LONGJUMP3
9690      sethi ta, hi20(symbol)     ; HI20
9691      ori   ta, ta, lo12(symbol) ; LO12S0
9692      jr5   ta                   ;
9693      $1:                        ;
9694
9695      case 4: 4-4-4-4; 1st insn don't care, 16-bit off, optimize don't care
9696      16-bit off if no INSN16
9697      bne   rt, ra, $1           ; LONGJUMP3
9698      sethi ta, hi20(symbol)     ; HI20
9699      ori   ta, ta, lo12(symbol) ; LO12S0
9700      jr    ta                   ;
9701      $1:                        ;
9702
9703      case 5: 4-4-4-4; 1st insn not convertible, 16-bit on, optimize for speed
9704      16-bit off if no INSN16
9705      bne   rt, ra, $1           ; LONGJUMP3
9706      sethi ta, hi20(symbol)     ; HI20
9707      ori   ta, ta, lo12(symbol) ; LO12S0
9708      jr    ta                   ;
9709      $1:                        ; LABEL */
9710
9711   /* Get the reloc for the address from which the register is
9712      being loaded.  This reloc will tell us which function is
9713      actually being called.  */
9714   enum elf_nds32_reloc_type checked_types[] =
9715     { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
9716
9717   int reloc_off = 0, cond_removed = 0, convertible;
9718   bfd_vma laddr;
9719   int seq_len;  /* Original length of instruction sequence.  */
9720   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
9721   int pic_ext_target = 0, first_size;
9722   unsigned int i;
9723   bfd_signed_vma foff;
9724   uint32_t insn, re_insn = 0;
9725   uint16_t insn16, re_insn16 = 0;
9726   unsigned long reloc, cond_reloc;
9727
9728   irelend = internal_relocs + sec->reloc_count;
9729   seq_len = GET_SEQ_LEN (irel->r_addend);
9730   laddr = irel->r_offset;
9731   *insn_len = seq_len;
9732
9733   convertible = IS_1ST_CONVERT (irel->r_addend);
9734
9735   if (convertible)
9736     first_size = 2;
9737   else
9738     first_size = 4;
9739
9740   /* Get all needed relocations.  */
9741   hi_irelfn =
9742     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9743                                  R_NDS32_HI20_RELA, laddr + first_size);
9744   lo_irelfn =
9745     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9746                                  R_NDS32_LO12S0_ORI_RELA,
9747                                  laddr + first_size + 4);
9748
9749   for (i = 0; i < sizeof (checked_types) / sizeof (checked_types[0]); i++)
9750     {
9751       cond_irelfn =
9752         find_relocs_at_address_addr (irel, internal_relocs, irelend,
9753                                      checked_types[i], laddr);
9754       if (cond_irelfn != irelend)
9755         break;
9756     }
9757
9758   if (hi_irelfn == irelend || lo_irelfn == irelend || cond_irelfn == irelend)
9759     {
9760       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP3",
9761                           (long) irel->r_offset);
9762       return FALSE;
9763     }
9764
9765   /* Get the value of the symbol referred to by the reloc.  */
9766   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9767                            &pic_ext_target);
9768
9769   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9770       || foff >= CONSERVATIVE_24BIT_S1)
9771     return FALSE;
9772
9773   /* Get the all corresponding instructions.  */
9774   if (first_size == 4)
9775     {
9776       insn = bfd_getb32 (contents + laddr);
9777       nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
9778     }
9779   else
9780     {
9781       insn16 = bfd_getb16 (contents + laddr);
9782       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
9783     }
9784
9785   /* For simplicity of coding, we are going to modify the section
9786      contents, the section relocs, and the BFD symbol table.  We
9787      must tell the rest of the code not to free up this
9788      information.  It would be possible to instead create a table
9789      of changes which have to be made, as is done in coff-mips.c;
9790      that would be more work, but would require less memory when
9791      the linker is run.  */
9792
9793   if (re_insn16 && foff >= -ACCURATE_8BIT_S1 - first_size
9794       && foff < ACCURATE_8BIT_S1 - first_size)
9795     {
9796       if (!(seq_len & 0x2))
9797         {
9798           /* Don't convert it to 16-bit now, keep this as relaxable
9799              for ``label reloc; INSN1a''6.  */
9800           /* Save comp_insn32 to buffer.  */
9801           bfd_putb32 (re_insn, contents + irel->r_offset);
9802           *insn_len = 4;
9803           reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
9804             R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
9805           cond_reloc = R_NDS32_INSN16;
9806         }
9807       else
9808         {
9809           /* Not optimize for speed; convert sequence to 16-bit.  */
9810           /* Save comp_insn16 to buffer.  */
9811           bfd_putb16 (re_insn16, contents + irel->r_offset);
9812           *insn_len = 2;
9813           reloc = R_NDS32_9_PCREL_RELA;
9814           cond_reloc = R_NDS32_NONE;
9815         }
9816       cond_removed = 1;
9817     }
9818   else if (N32_OP6 (re_insn) == N32_OP6_BR1
9819            && (foff >= -(ACCURATE_14BIT_S1 - first_size)
9820                && foff < ACCURATE_14BIT_S1 - first_size))
9821     {
9822       /* beqs     label    ; 15_PCREL */
9823       bfd_putb32 (re_insn, contents + irel->r_offset);
9824       *insn_len = 4;
9825       reloc = R_NDS32_15_PCREL_RELA;
9826       cond_reloc = R_NDS32_NONE;
9827       cond_removed = 1;
9828     }
9829   else if (N32_OP6 (re_insn) == N32_OP6_BR2
9830            && foff >= -CONSERVATIVE_16BIT_S1
9831            && foff < CONSERVATIVE_16BIT_S1)
9832     {
9833       /* beqz     label ; 17_PCREL */
9834       bfd_putb32 (re_insn, contents + irel->r_offset);
9835       *insn_len = 4;
9836       reloc = R_NDS32_17_PCREL_RELA;
9837       cond_reloc = R_NDS32_NONE;
9838       cond_removed = 1;
9839     }
9840   else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
9841            && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
9842     {
9843       /* Relax to one of the following 3 variations
9844
9845          case 2-4; 1st insn convertible, 16-bit on, optimize off or optimize
9846          for space
9847          bnes38  rt, $1 ; LONGJUMP2
9848          j       label  ; 25_PCREL
9849          $1
9850
9851          case 4-4; 1st insn not convertible, others don't care
9852          bne   rt, ra, $1 ; LONGJUMP2
9853          j     label      ; 25_PCREL
9854          $1
9855
9856          case 4-4; 1st insn convertible, 16-bit on, optimize for speed
9857          bne   rt, ra, $1 ; LONGJUMP2
9858          j     label      ; 25_PCREL
9859          $1 */
9860
9861       /* Offset for first instruction.  */
9862
9863       /* Use j label as second instruction.  */
9864       *insn_len = 4 + first_size;
9865       insn = INSN_J;
9866       bfd_putb32 (insn, contents + hi_irelfn->r_offset);
9867       reloc = R_NDS32_LONGJUMP2;
9868       cond_reloc = R_NDS32_25_PLTREL;
9869     }
9870     else
9871       return FALSE;
9872
9873     if (cond_removed == 1)
9874       {
9875         /* Set all relocations.  */
9876         irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
9877         irel->r_addend = hi_irelfn->r_addend;
9878
9879         cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
9880                                             cond_reloc);
9881         cond_irelfn->r_addend = 0;
9882         hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9883                                           R_NDS32_NONE);
9884       }
9885     else
9886       {
9887         irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
9888         irel->r_addend = irel->r_addend;
9889         hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9890                                           cond_reloc);
9891       }
9892
9893   if ((seq_len ^ *insn_len ) & 0x2)
9894     {
9895       insn16 = NDS32_NOP16;
9896       bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9897       lo_irelfn->r_offset = *insn_len;
9898       lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
9899                                         R_NDS32_INSN16);
9900       lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9901       *insn_len += 2;
9902     }
9903   else
9904     lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
9905                                       R_NDS32_NONE);
9906   return TRUE;
9907 }
9908
9909 /* Relax LONGCALL4 relocation for nds32_elf_relax_section.  */
9910
9911 static bfd_boolean
9912 nds32_elf_relax_longcall4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9913                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9914                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9915                            Elf_Internal_Shdr *symtab_hdr)
9916 {
9917   /* The pattern for LONGCALL4.  Support for function cse.
9918      sethi ta, hi20(symbol)     ; LONGCALL4/HI20
9919      ori   ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
9920      jral  ta                   ; PTR_RES/EMPTY/INSN16  */
9921
9922   bfd_vma laddr;
9923   uint32_t insn;
9924   Elf_Internal_Rela *hi_irel, *ptr_irel, *insn_irel, *em_irel, *call_irel;
9925   Elf_Internal_Rela *irelend;
9926   int pic_ext_target = 0;
9927   bfd_signed_vma foff;
9928
9929   irelend = internal_relocs + sec->reloc_count;
9930   laddr = irel->r_offset;
9931
9932   /* Get the reloc for the address from which the register is
9933      being loaded.  This reloc will tell us which function is
9934      actually being called.  */
9935   hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9936                                          R_NDS32_HI20_RELA, laddr);
9937
9938   if (hi_irel == irelend)
9939     {
9940       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL4",
9941                           (long) irel->r_offset);
9942       return FALSE;
9943     }
9944
9945   /* Get the value of the symbol referred to by the reloc.  */
9946   foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr,
9947                            &pic_ext_target);
9948
9949   /* This condition only happened when symbol is undefined.  */
9950   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9951       || foff >= CONSERVATIVE_24BIT_S1)
9952     return FALSE;
9953
9954   /* Relax to: jal symbol; 25_PCREL */
9955   /* For simplicity of coding, we are going to modify the section
9956      contents, the section relocs, and the BFD symbol table.  We
9957      must tell the rest of the code not to free up this
9958      information.  It would be possible to instead create a table
9959      of changes which have to be made, as is done in coff-mips.c;
9960      that would be more work, but would require less memory when
9961      the linker is run.  */
9962
9963   ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9964                                           R_NDS32_PTR_RESOLVED, irel->r_addend);
9965   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9966                                           R_NDS32_EMPTY, irel->r_addend);
9967
9968   if (ptr_irel == irelend || em_irel == irelend)
9969     {
9970       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL4",
9971                           (long) irel->r_offset);
9972       return FALSE;
9973     }
9974   /* Check these is enough space to insert jal in R_NDS32_EMPTY.  */
9975   insn = bfd_getb32 (contents + irel->r_addend);
9976   if (insn & 0x80000000)
9977     return FALSE;
9978
9979   /* Replace the long call with a jal.  */
9980   em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
9981                                   R_NDS32_25_PCREL_RELA);
9982   ptr_irel->r_addend = 1;
9983
9984   /* We don't resolve this here but resolve it in relocate_section.  */
9985   insn = INSN_JAL;
9986   bfd_putb32 (insn, contents + em_irel->r_offset);
9987
9988   irel->r_info =
9989     ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
9990
9991   /* If there is function cse, HI20 can not remove now.  */
9992   call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9993                                            R_NDS32_LONGCALL4, laddr);
9994   if (call_irel == irelend)
9995     {
9996       *insn_len = 0;
9997       hi_irel->r_info =
9998         ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
9999     }
10000
10001   insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10002                                           R_NDS32_INSN16, irel->r_addend);
10003   if (insn_irel != irelend)
10004     insn_irel->r_info =
10005       ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10006
10007   return TRUE;
10008 }
10009
10010 /* Relax LONGCALL5 relocation for nds32_elf_relax_section.  */
10011
10012 static bfd_boolean
10013 nds32_elf_relax_longcall5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10014                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10015                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10016                            Elf_Internal_Shdr *symtab_hdr)
10017 {
10018   /* The pattern for LONGCALL5.
10019      bltz  rt, .L1      ; LONGCALL5/17_PCREL
10020      jal   symbol       ; 25_PCREL
10021      .L1:  */
10022
10023   bfd_vma laddr;
10024   uint32_t insn;
10025   Elf_Internal_Rela *cond_irel, *irelend;
10026   int pic_ext_target = 0;
10027   bfd_signed_vma foff;
10028
10029   irelend = internal_relocs + sec->reloc_count;
10030   laddr = irel->r_offset;
10031   insn = bfd_getb32 (contents + laddr);
10032
10033   /* Get the reloc for the address from which the register is
10034      being loaded.  This reloc will tell us which function is
10035      actually being called.  */
10036   cond_irel =
10037     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10038                                  R_NDS32_25_PCREL_RELA, irel->r_addend);
10039   if (cond_irel == irelend)
10040     {
10041       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL5",
10042                           (long) irel->r_offset);
10043       return FALSE;
10044     }
10045
10046   /* Get the value of the symbol referred to by the reloc.  */
10047   foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr,
10048                            &pic_ext_target);
10049
10050   if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1
10051       || foff >= CONSERVATIVE_16BIT_S1)
10052     return FALSE;
10053
10054   /* Relax to   bgezal   rt, label ; 17_PCREL
10055      or         bltzal   rt, label ; 17_PCREL */
10056
10057   /* Convert to complimentary conditional call.  */
10058   insn = CONVERT_CONDITION_CALL (insn);
10059
10060   /* For simplicity of coding, we are going to modify the section
10061      contents, the section relocs, and the BFD symbol table.  We
10062      must tell the rest of the code not to free up this
10063      information.  It would be possible to instead create a table
10064      of changes which have to be made, as is done in coff-mips.c;
10065      that would be more work, but would require less memory when
10066      the linker is run.  */
10067
10068   /* Modify relocation and contents.  */
10069   cond_irel->r_info =
10070     ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_17_PCREL_RELA);
10071
10072   /* Replace the long call with a bgezal.  */
10073   bfd_putb32 (insn, contents + cond_irel->r_offset);
10074   *insn_len = 0;
10075
10076   /* Clean unnessary relocations.  */
10077   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10078
10079   cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10080                                            R_NDS32_17_PCREL_RELA, laddr);
10081   cond_irel->r_info =
10082     ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10083
10084   return TRUE;
10085 }
10086
10087 /* Relax LONGCALL6 relocation for nds32_elf_relax_section.  */
10088
10089 static bfd_boolean
10090 nds32_elf_relax_longcall6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10091                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10092                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10093                            Elf_Internal_Shdr *symtab_hdr)
10094 {
10095   /* The pattern for LONGCALL6.
10096      bltz  rt,   .L1                    ; LONGCALL6/17_PCREL
10097      sethi ta,   hi20(symbol)           ; HI20/PTR
10098      ori   ta, ta,  lo12(symbol)        ; LO12S0_ORI/PTR
10099      jral  ta                           ; PTR_RES/EMPTY/INSN16
10100      .L1  */
10101
10102   bfd_vma laddr;
10103   uint32_t insn;
10104   Elf_Internal_Rela *em_irel, *cond_irel, *irelend;
10105   int pic_ext_target = 0;
10106   bfd_signed_vma foff;
10107
10108   irelend = internal_relocs + sec->reloc_count;
10109   laddr = irel->r_offset;
10110
10111   /* Get the reloc for the address from which the register is
10112      being loaded.  This reloc will tell us which function is
10113      actually being called.  */
10114   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10115                                          R_NDS32_EMPTY, irel->r_addend);
10116
10117   if (em_irel == irelend)
10118     {
10119       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGCALL6",
10120                           (long) irel->r_offset);
10121       return FALSE;
10122     }
10123
10124   /* Get the value of the symbol referred to by the reloc.  */
10125   foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr,
10126                            &pic_ext_target);
10127
10128   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
10129       || foff >= CONSERVATIVE_24BIT_S1)
10130     return FALSE;
10131
10132   /* Check these is enough space to insert jal in R_NDS32_EMPTY.  */
10133   insn = bfd_getb32 (contents + irel->r_addend);
10134   if (insn & 0x80000000)
10135     return FALSE;
10136
10137   insn = bfd_getb32 (contents + laddr);
10138   if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
10139     {
10140       /* Relax to  bgezal   rt, label ; 17_PCREL
10141          or        bltzal   rt, label ; 17_PCREL */
10142
10143       /* Convert to complimentary conditional call.  */
10144       *insn_len = 0;
10145       insn = CONVERT_CONDITION_CALL (insn);
10146       bfd_putb32 (insn, contents + em_irel->r_offset);
10147
10148       em_irel->r_info =
10149         ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_17_PCREL_RELA);
10150
10151       /* Set resolved relocation.  */
10152       cond_irel =
10153         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10154                                      R_NDS32_PTR_RESOLVED, irel->r_addend);
10155       if (cond_irel == irelend)
10156         {
10157           _bfd_error_handler (unrecognized_reloc_msg, abfd,
10158                               "R_NDS32_LONGCALL6", (long) irel->r_offset);
10159           return FALSE;
10160         }
10161       cond_irel->r_addend = 1;
10162
10163       /* Clear relocations.  */
10164
10165       irel->r_info =
10166         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10167
10168       cond_irel =
10169         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10170                                      R_NDS32_17_PCREL_RELA, laddr);
10171       if (cond_irel != irelend)
10172         cond_irel->r_info =
10173           ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10174
10175       cond_irel =
10176         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10177                                      R_NDS32_INSN16, irel->r_addend);
10178       if (cond_irel != irelend)
10179         cond_irel->r_info =
10180           ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10181
10182     }
10183   else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
10184     {
10185       /* Relax to the following instruction sequence
10186          bltz  rt, .L1  ; LONGCALL2/17_PCREL
10187          jal   symbol   ; 25_PCREL/PTR_RES
10188          .L1  */
10189       *insn_len = 4;
10190       /* Convert instruction.  */
10191       insn = INSN_JAL;
10192       bfd_putb32 (insn, contents + em_irel->r_offset);
10193
10194       /* Convert relocations.  */
10195       em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
10196                                       R_NDS32_25_PCREL_RELA);
10197       irel->r_info =
10198         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL5);
10199
10200       /* Set resolved relocation.  */
10201       cond_irel =
10202         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10203                                      R_NDS32_PTR_RESOLVED, irel->r_addend);
10204       if (cond_irel == irelend)
10205         {
10206           _bfd_error_handler (unrecognized_reloc_msg, abfd,
10207                               "R_NDS32_LONGCALL6", (long) irel->r_offset);
10208           return FALSE;
10209         }
10210       cond_irel->r_addend = 1;
10211
10212       cond_irel =
10213         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10214                                      R_NDS32_INSN16, irel->r_addend);
10215       if (cond_irel != irelend)
10216         cond_irel->r_info =
10217           ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10218     }
10219   return TRUE;
10220 }
10221
10222 /* Relax LONGJUMP4 relocation for nds32_elf_relax_section.  */
10223
10224 static bfd_boolean
10225 nds32_elf_relax_longjump4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10226                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10227                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10228                            Elf_Internal_Shdr *symtab_hdr)
10229 {
10230   /* The pattern for LONGJUMP4.
10231      sethi ta, hi20(symbol)     ; LONGJUMP4/HI20
10232      ori   ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10233      jr    ta                   ; PTR_RES/INSN16/EMPTY  */
10234
10235   bfd_vma laddr;
10236   int seq_len;  /* Original length of instruction sequence.  */
10237   uint32_t insn;
10238   Elf_Internal_Rela *hi_irel, *ptr_irel, *em_irel, *call_irel, *irelend;
10239   int pic_ext_target = 0;
10240   bfd_signed_vma foff;
10241
10242   irelend = internal_relocs + sec->reloc_count;
10243   seq_len = GET_SEQ_LEN (irel->r_addend);
10244   laddr = irel->r_offset;
10245   *insn_len = seq_len;
10246
10247   /* Get the reloc for the address from which the register is
10248      being loaded.  This reloc will tell us which function is
10249      actually being called.  */
10250
10251   hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10252                                          R_NDS32_HI20_RELA, laddr);
10253
10254   if (hi_irel == irelend)
10255     {
10256       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP4",
10257                           (long) irel->r_offset);
10258       return FALSE;
10259     }
10260
10261   /* Get the value of the symbol referred to by the reloc.  */
10262   foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr,
10263                            &pic_ext_target);
10264
10265   if (pic_ext_target || foff == 0 || foff >= CONSERVATIVE_24BIT_S1
10266       || foff < -CONSERVATIVE_24BIT_S1)
10267     return FALSE;
10268
10269   /* Convert it to "j label", it may be converted to j8 in the final
10270      pass of relaxation.  Therefore, we do not consider this currently.  */
10271   ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10272                                           R_NDS32_PTR_RESOLVED, irel->r_addend);
10273   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10274                                          R_NDS32_EMPTY, irel->r_addend);
10275
10276   if (ptr_irel == irelend || em_irel == irelend)
10277     {
10278       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP4",
10279                           (long) irel->r_offset);
10280       return FALSE;
10281     }
10282
10283   em_irel->r_info =
10284     ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_25_PCREL_RELA);
10285   ptr_irel->r_addend = 1;
10286
10287   /* Write instruction.  */
10288   insn = INSN_J;
10289   bfd_putb32 (insn, contents + em_irel->r_offset);
10290
10291   /* Clear relocations.  */
10292   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10293
10294   /* If there is function cse, HI20 can not remove now.  */
10295   call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10296                                            R_NDS32_LONGJUMP4, laddr);
10297   if (call_irel == irelend)
10298     {
10299       *insn_len = 0;
10300       hi_irel->r_info =
10301         ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
10302     }
10303
10304   return TRUE;
10305 }
10306
10307 /* Relax LONGJUMP5 relocation for nds32_elf_relax_section.  */
10308
10309 static bfd_boolean
10310 nds32_elf_relax_longjump5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10311                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10312                            int *seq_len, bfd_byte *contents,
10313                            Elf_Internal_Sym *isymbuf,
10314                            Elf_Internal_Shdr *symtab_hdr)
10315 {
10316   /* There are 2 variations for LONGJUMP5
10317      case 2-4;  1st insn convertible, 16-bit on.
10318      bnes38  rt, ra, .L1        ; LONGJUMP5/9_PCREL/INSN16
10319      j       label              ; 25_PCREL/INSN16
10320      $1:
10321
10322      case 4-4; 1st insn not convertible
10323      bne  rt, ra, .L1   ; LONGJUMP5/15_PCREL/INSN16
10324      j    label         ; 25_PCREL/INSN16
10325      .L1:  */
10326
10327   bfd_vma laddr;
10328   Elf_Internal_Rela *cond_irel,  *irelend;
10329   int pic_ext_target = 0;
10330   unsigned int i;
10331   bfd_signed_vma foff;
10332   uint32_t insn, re_insn = 0;
10333   uint16_t insn16, re_insn16 = 0;
10334   unsigned long reloc;
10335
10336   enum elf_nds32_reloc_type checked_types[] =
10337     { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
10338       R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
10339
10340   irelend = internal_relocs + sec->reloc_count;
10341   laddr = irel->r_offset;
10342
10343   /* Get the reloc for the address from which the register is
10344      being loaded.  This reloc will tell us which function is
10345      actually being called.  */
10346
10347   cond_irel =
10348     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10349                                  R_NDS32_25_PCREL_RELA, irel->r_addend);
10350   if (cond_irel == irelend)
10351     {
10352       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP5",
10353                           (long) irel->r_offset);
10354       return FALSE;
10355     }
10356
10357   /* Get the value of the symbol referred to by the reloc.  */
10358   foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr,
10359                            &pic_ext_target);
10360
10361   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_16BIT_S1
10362       || foff >= CONSERVATIVE_16BIT_S1)
10363     return FALSE;
10364
10365   /* Get the all corresponding instructions.  */
10366   insn = bfd_getb32 (contents + laddr);
10367   /* Check instruction size.  */
10368   if (insn & 0x80000000)
10369     {
10370       *seq_len = 0;
10371       insn16 = insn >> 16;
10372       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
10373     }
10374   else
10375     nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
10376
10377   if (N32_OP6 (re_insn) == N32_OP6_BR1
10378       && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
10379     {
10380       /* beqs label ; 15_PCREL.  */
10381       bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10382       reloc = R_NDS32_15_PCREL_RELA;
10383     }
10384   else if (N32_OP6 (re_insn) == N32_OP6_BR2
10385            && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
10386     {
10387       /* beqz label ; 17_PCREL.  */
10388       bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10389       reloc = R_NDS32_17_PCREL_RELA;
10390     }
10391   else if ( N32_OP6 (re_insn) == N32_OP6_BR3
10392            && foff >= -CONSERVATIVE_8BIT_S1 && foff < CONSERVATIVE_8BIT_S1)
10393     {
10394       /* beqc label ; 9_PCREL.  */
10395       bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10396       reloc = R_NDS32_WORD_9_PCREL_RELA;
10397     }
10398   else
10399     return FALSE;
10400
10401   /* Set all relocations.  */
10402   cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), reloc);
10403
10404   /* Clean relocations.  */
10405   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10406   for (i = 0; i < sizeof (checked_types) / sizeof (checked_types[0]); i++)
10407     {
10408       cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10409                                                checked_types[i], laddr);
10410       if (cond_irel != irelend)
10411         {
10412           if (*seq_len == 0
10413               && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
10414             {
10415               /* If the branch instruction is 2 byte, it cannot remove
10416                  directly.  Only convert it to nop16 and remove it after
10417                  checking alignment issue.  */
10418               insn16 = NDS32_NOP16;
10419               bfd_putb16 (insn16, contents + laddr);
10420               cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10421             }
10422           else
10423             cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10424                                               R_NDS32_NONE);
10425         }
10426     }
10427   *insn_len = 0;
10428
10429   return TRUE;
10430 }
10431
10432 /* Relax LONGJUMP6 relocation for nds32_elf_relax_section.  */
10433
10434 static bfd_boolean
10435 nds32_elf_relax_longjump6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10436                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10437                            int *seq_len, bfd_byte *contents,
10438                            Elf_Internal_Sym *isymbuf,
10439                            Elf_Internal_Shdr *symtab_hdr)
10440 {
10441   /* There are 5 variations for LONGJUMP6
10442      case : 2-4-4-4; 1st insn convertible, 16-bit on.
10443      bnes38   rt, ra, .L1               ; LONGJUMP6/15_PCREL/INSN16
10444      sethi    ta, hi20(symbol)          ; HI20/PTR
10445      ori      ta, ta, lo12(symbol)      ; LO12S0_ORI/PTR
10446      jr       ta                        ; PTR_RES/INSN16/EMPTY
10447      .L1:
10448
10449      case : 4-4-4-4; 1st insn not convertible, 16-bit on.
10450      bne   rt, ra, .L1          ; LONGJUMP6/15_PCREL/INSN16
10451      sethi ta, hi20(symbol)     ; HI20/PTR
10452      ori   ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10453      jr    ta                   ; PTR_RES/INSN16/EMPTY
10454      .L1:  */
10455
10456   enum elf_nds32_reloc_type checked_types[] =
10457     { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
10458       R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
10459
10460   int reloc_off = 0, cond_removed = 0;
10461   bfd_vma laddr;
10462   Elf_Internal_Rela *cond_irel, *em_irel, *irelend, *insn_irel;
10463   int pic_ext_target = 0;
10464   unsigned int i;
10465   bfd_signed_vma foff;
10466   uint32_t insn, re_insn = 0;
10467   uint16_t insn16, re_insn16 = 0;
10468   unsigned long reloc;
10469
10470   irelend = internal_relocs + sec->reloc_count;
10471   laddr = irel->r_offset;
10472
10473   /* Get the reloc for the address from which the register is
10474      being loaded.  This reloc will tell us which function is
10475      actually being called.  */
10476   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10477                                          R_NDS32_EMPTY, irel->r_addend);
10478
10479   if (em_irel == irelend)
10480     {
10481       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP6",
10482                           (long) irel->r_offset);
10483       return FALSE;
10484     }
10485
10486   /* Get the value of the symbol referred to by the reloc.  */
10487   foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr,
10488                            &pic_ext_target);
10489
10490   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
10491       || foff >= CONSERVATIVE_24BIT_S1)
10492     return FALSE;
10493
10494   insn = bfd_getb32 (contents + laddr);
10495   /* Check instruction size.  */
10496   if (insn & 0x80000000)
10497     {
10498       *seq_len = 0;
10499       insn16 = insn >> 16;
10500       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
10501     }
10502   else
10503     nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
10504
10505   /* For simplicity of coding, we are going to modify the section
10506      contents, the section relocs, and the BFD symbol table.  We
10507      must tell the rest of the code not to free up this
10508      information.  It would be possible to instead create a table
10509      of changes which have to be made, as is done in coff-mips.c;
10510      that would be more work, but would require less memory when
10511      the linker is run.  */
10512
10513   if (N32_OP6 (re_insn) == N32_OP6_BR1
10514       && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
10515     {
10516       /* beqs     label    ; 15_PCREL */
10517       bfd_putb32 (re_insn, contents + em_irel->r_offset);
10518       reloc = R_NDS32_15_PCREL_RELA;
10519       cond_removed = 1;
10520     }
10521   else if (N32_OP6 (re_insn) == N32_OP6_BR2
10522            && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
10523     {
10524       /* beqz     label ; 17_PCREL */
10525       bfd_putb32 (re_insn, contents + em_irel->r_offset);
10526       reloc = R_NDS32_17_PCREL_RELA;
10527       cond_removed = 1;
10528     }
10529   else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
10530            && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
10531     {
10532       /* Relax to one of the following 2 variations
10533
10534          case 2-4;  1st insn convertible, 16-bit on.
10535          bnes38  rt, ra, .L1    ; LONGJUMP5/9_PCREL/INSN16
10536          j       label          ; 25_PCREL/INSN16
10537          $1:
10538
10539          case 4-4; 1st insn not convertible
10540          bne  rt, ra, .L1       ; LONGJUMP5/15_PCREL/INSN16
10541          j    label             ; 25_PCREL/INSN16
10542          .L1:  */
10543
10544       /* Use j label as second instruction.  */
10545       insn = INSN_J;
10546       reloc = R_NDS32_25_PCREL_RELA;
10547       bfd_putb32 (insn, contents + em_irel->r_offset);
10548     }
10549   else
10550     return FALSE;
10551
10552   /* Set all relocations.  */
10553   em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), reloc);
10554
10555   cond_irel =
10556     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10557                                  R_NDS32_PTR_RESOLVED, em_irel->r_offset);
10558   cond_irel->r_addend = 1;
10559
10560   /* Use INSN16 of first branch instruction to distinguish if keeping
10561      INSN16 of final instruction or not.  */
10562   insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10563                                            R_NDS32_INSN16, irel->r_offset);
10564   if (insn_irel == irelend)
10565     {
10566       /* Clean the final INSN16.  */
10567       insn_irel =
10568         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10569                                      R_NDS32_INSN16, em_irel->r_offset);
10570       insn_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10571                                         R_NDS32_NONE);
10572     }
10573
10574   if (cond_removed == 1)
10575     {
10576       *insn_len = 0;
10577
10578       /* Clear relocations.  */
10579       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10580
10581       for (i = 0; i < sizeof (checked_types) / sizeof (checked_types[0]); i++)
10582         {
10583           cond_irel =
10584             find_relocs_at_address_addr (irel, internal_relocs, irelend,
10585                                          checked_types[i], laddr);
10586           if (cond_irel != irelend)
10587             {
10588               if (*seq_len == 0
10589                   && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
10590                 {
10591                   /* If the branch instruction is 2 byte, it cannot remove
10592                      directly.  Only convert it to nop16 and remove it after
10593                      checking alignment issue.  */
10594                   insn16 = NDS32_NOP16;
10595                   bfd_putb16 (insn16, contents + laddr);
10596                   cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10597                 }
10598               else
10599                 cond_irel->r_info =
10600                   ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10601             }
10602         }
10603     }
10604   else
10605     {
10606       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
10607                                    R_NDS32_LONGJUMP5);
10608     }
10609
10610   return TRUE;
10611 }
10612
10613 /* Relax LONGJUMP7 relocation for nds32_elf_relax_section.  */
10614
10615 static bfd_boolean
10616 nds32_elf_relax_longjump7 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10617                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10618                            int *seq_len, bfd_byte *contents,
10619                            Elf_Internal_Sym *isymbuf,
10620                            Elf_Internal_Shdr *symtab_hdr)
10621 {
10622   /* There are 2 variations for LONGJUMP5
10623      case 2-4;  1st insn convertible, 16-bit on.
10624      movi55  ta, imm11          ; LONGJUMP7/INSN16
10625      beq     rt, ta, label      ; 15_PCREL
10626
10627      case 4-4; 1st insn not convertible
10628      movi55  ta, imm11          ; LONGJUMP7/INSN16
10629      beq     rt, ta, label      ; 15_PCREL  */
10630
10631   bfd_vma laddr;
10632   Elf_Internal_Rela *cond_irel,  *irelend, *insn_irel;
10633   int pic_ext_target = 0;
10634   bfd_signed_vma foff;
10635   uint32_t insn, re_insn = 0;
10636   uint16_t insn16;
10637   uint32_t imm11;
10638
10639   irelend = internal_relocs + sec->reloc_count;
10640   laddr = irel->r_offset;
10641
10642   /* Get the reloc for the address from which the register is
10643      being loaded.  This reloc will tell us which function is
10644      actually being called.  */
10645
10646   cond_irel =
10647     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10648                                  R_NDS32_15_PCREL_RELA, irel->r_addend);
10649   if (cond_irel == irelend)
10650     {
10651       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LONGJUMP7",
10652                           (long) irel->r_offset);
10653       return FALSE;
10654     }
10655
10656   /* Get the value of the symbol referred to by the reloc.  */
10657   foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr,
10658                            &pic_ext_target);
10659
10660   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_8BIT_S1
10661       || foff >= CONSERVATIVE_8BIT_S1)
10662     return FALSE;
10663
10664   /* Get the first instruction for its size.  */
10665   insn = bfd_getb32 (contents + laddr);
10666   if (insn & 0x80000000)
10667     {
10668       *seq_len = 0;
10669       /* Get the immediate from movi55.  */
10670       imm11 = N16_IMM5S (insn >> 16);
10671     }
10672   else
10673     {
10674       /* Get the immediate from movi.  */
10675       imm11 = N32_IMM20S (insn);
10676     }
10677
10678   /* Get the branch instruction.  */
10679   insn = bfd_getb32 (contents + irel->r_addend);
10680   /* Convert instruction to BR3.  */
10681   if ((insn >> 14) & 0x1)
10682     re_insn = N32_BR3 (BNEC, N32_RT5 (insn), imm11, 0);
10683   else
10684     re_insn = N32_BR3 (BEQC, N32_RT5 (insn), imm11, 0);
10685
10686   bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10687
10688   /* Set all relocations.  */
10689   cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10690                                     R_NDS32_WORD_9_PCREL_RELA);
10691
10692   /* Clean relocations.  */
10693   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10694   insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10695                                            R_NDS32_INSN16, irel->r_offset);
10696   if (insn_irel != irelend)
10697     {
10698       if (*seq_len == 0)
10699         {
10700           /* If the first insntruction is 16bit, convert it to nop16.  */
10701           insn16 = NDS32_NOP16;
10702           bfd_putb16 (insn16, contents + laddr);
10703           insn_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10704         }
10705       else
10706         cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10707                                           R_NDS32_NONE);
10708     }
10709   *insn_len = 0;
10710
10711   return TRUE;
10712 }
10713
10714 #define GET_LOADSTORE_RANGE(addend) (((addend) >> 8) & 0x3f)
10715
10716 /* Relax LOADSTORE relocation for nds32_elf_relax_section.  */
10717
10718 static bfd_boolean
10719 nds32_elf_relax_loadstore (struct bfd_link_info *link_info, bfd *abfd,
10720                            asection *sec, Elf_Internal_Rela *irel,
10721                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10722                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10723                            Elf_Internal_Shdr *symtab_hdr, int load_store_relax)
10724 {
10725   int eliminate_sethi = 0, range_type;
10726   unsigned int i;
10727   bfd_vma local_sda, laddr;
10728   int seq_len;  /* Original length of instruction sequence.  */
10729   uint32_t insn;
10730   Elf_Internal_Rela *hi_irelfn = NULL, *irelend;
10731   bfd_vma access_addr = 0;
10732   bfd_vma range_l = 0, range_h = 0;     /* Upper/lower bound.  */
10733   enum elf_nds32_reloc_type checked_types[] =
10734     { R_NDS32_HI20_RELA, R_NDS32_GOT_HI20,
10735       R_NDS32_GOTPC_HI20, R_NDS32_GOTOFF_HI20,
10736       R_NDS32_PLTREL_HI20, R_NDS32_PLT_GOTREL_HI20,
10737       R_NDS32_TLS_LE_HI20
10738     };
10739
10740   irelend = internal_relocs + sec->reloc_count;
10741   seq_len = GET_SEQ_LEN (irel->r_addend);
10742   laddr = irel->r_offset;
10743   *insn_len = seq_len;
10744
10745   /* Get the high part relocation.  */
10746   for (i = 0; i < ARRAY_SIZE (checked_types); i++)
10747     {
10748       hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10749                                                checked_types[i], laddr);
10750       if (hi_irelfn != irelend)
10751         break;
10752     }
10753
10754   if (hi_irelfn == irelend)
10755     {
10756       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_LOADSTORE",
10757                           (long) irel->r_offset);
10758         return FALSE;
10759     }
10760
10761   range_type = GET_LOADSTORE_RANGE (irel->r_addend);
10762   nds32_elf_final_sda_base (sec->output_section->owner,
10763                             link_info, &local_sda, FALSE);
10764
10765   switch (ELF32_R_TYPE (hi_irelfn->r_info))
10766     {
10767     case R_NDS32_HI20_RELA:
10768       insn = bfd_getb32 (contents + laddr);
10769       access_addr =
10770         calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
10771
10772       if (range_type == NDS32_LOADSTORE_IMM)
10773         {
10774           struct elf_link_hash_entry *h = NULL;
10775           int indx;
10776
10777           if (ELF32_R_SYM (hi_irelfn->r_info) >= symtab_hdr->sh_info)
10778             {
10779               indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
10780               h = elf_sym_hashes (abfd)[indx];
10781             }
10782
10783           if ((access_addr < CONSERVATIVE_20BIT)
10784               && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
10785             {
10786               eliminate_sethi = 1;
10787               break;
10788             }
10789
10790           /* This is avoid to relax symbol address which is fixed
10791              relocations.  Ex: _stack.  */
10792           if (h && bfd_is_abs_section (h->root.u.def.section))
10793             return FALSE;
10794         }
10795
10796       if (!load_store_relax)
10797         return FALSE;
10798
10799       /* Case for set gp register.  */
10800       if (N32_RT5 (insn) == REG_GP)
10801         break;
10802
10803       if (range_type == NDS32_LOADSTORE_FLOAT_S
10804           || range_type == NDS32_LOADSTORE_FLOAT_S)
10805         {
10806           range_l = sdata_range[0][0];
10807           range_h = sdata_range[0][1];
10808         }
10809       else
10810         {
10811           range_l = sdata_range[1][0];
10812           range_h = sdata_range[1][1];
10813         }
10814       break;
10815
10816     case R_NDS32_GOT_HI20:
10817       access_addr =
10818         calculate_got_memory_address (abfd, link_info, hi_irelfn, symtab_hdr);
10819
10820       /* If this symbol is not in .got, the return value will be -1.
10821          Since the gp value is set to SDA_BASE but not GLOBAL_OFFSET_TABLE,
10822          a negative offset is allowed.  */
10823       if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
10824           && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
10825         eliminate_sethi = 1;
10826       break;
10827
10828     case R_NDS32_PLT_GOTREL_HI20:
10829       access_addr = calculate_plt_memory_address (abfd, link_info, isymbuf,
10830                                                   hi_irelfn, symtab_hdr);
10831
10832       if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
10833           && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
10834         eliminate_sethi = 1;
10835       break;
10836
10837     case R_NDS32_GOTOFF_HI20:
10838       access_addr =
10839         calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
10840
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_GOTPC_HI20:
10847       /* The access_addr must consider r_addend of hi_irel.  */
10848       access_addr = sec->output_section->vma + sec->output_offset
10849         + irel->r_offset + hi_irelfn->r_addend;
10850
10851       if ((bfd_signed_vma) (local_sda - access_addr) < CONSERVATIVE_20BIT
10852           && (bfd_signed_vma) (local_sda - access_addr) >= -CONSERVATIVE_20BIT)
10853         eliminate_sethi = 1;
10854       break;
10855
10856     case R_NDS32_TLS_LE_HI20:
10857       access_addr =
10858         calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
10859       BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
10860       access_addr -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
10861       if ((range_type == NDS32_LOADSTORE_IMM)
10862           && (bfd_signed_vma) (access_addr) < CONSERVATIVE_20BIT
10863           && (bfd_signed_vma) (access_addr) >= -CONSERVATIVE_20BIT)
10864         eliminate_sethi = 1;
10865       break;
10866
10867     default:
10868       return FALSE;
10869     }
10870
10871   /* Delete sethi instruction.  */
10872   if (eliminate_sethi == 1
10873       || (local_sda <= access_addr && (access_addr - local_sda) < range_h)
10874       || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
10875     {
10876       hi_irelfn->r_info =
10877         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
10878       irel->r_info =
10879         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10880       *insn_len = 0;
10881     }
10882   return TRUE;
10883 }
10884
10885 /* Relax LO12 relocation for nds32_elf_relax_section.  */
10886
10887 static void
10888 nds32_elf_relax_lo12 (struct bfd_link_info *link_info, bfd *abfd,
10889                       asection *sec, Elf_Internal_Rela *irel,
10890                       Elf_Internal_Rela *internal_relocs, bfd_byte *contents,
10891                       Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr)
10892 {
10893   uint32_t insn;
10894   bfd_vma local_sda, laddr;
10895   unsigned long reloc;
10896   bfd_vma access_addr;
10897   bfd_vma range_l = 0, range_h = 0;     /* Upper/lower bound.  */
10898   Elf_Internal_Rela *irelfn = NULL, *irelend;
10899   struct elf_link_hash_entry *h = NULL;
10900   int indx;
10901
10902   /* For SDA base relative relaxation.  */
10903   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
10904                             &local_sda, FALSE);
10905
10906   irelend = internal_relocs + sec->reloc_count;
10907   laddr = irel->r_offset;
10908   insn = bfd_getb32 (contents + laddr);
10909
10910   if (!is_sda_access_insn (insn) && N32_OP6 (insn) != N32_OP6_ORI)
10911     return;
10912
10913   access_addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
10914
10915   if (ELF32_R_SYM (irel->r_info) >= symtab_hdr->sh_info)
10916     {
10917       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
10918       h = elf_sym_hashes (abfd)[indx];
10919     }
10920
10921   if (N32_OP6 (insn) == N32_OP6_ORI && access_addr < CONSERVATIVE_20BIT
10922       && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
10923     {
10924       reloc = R_NDS32_20_RELA;
10925       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
10926       insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
10927       bfd_putb32 (insn, contents + laddr);
10928     }
10929   /* This is avoid to relax symbol address which is fixed
10930      relocations.  Ex: _stack.  */
10931   else if (N32_OP6 (insn) == N32_OP6_ORI
10932            && h && bfd_is_abs_section (h->root.u.def.section))
10933     return;
10934   else
10935     {
10936       range_l = sdata_range[1][0];
10937       range_h = sdata_range[1][1];
10938       switch (ELF32_R_TYPE (irel->r_info))
10939         {
10940         case R_NDS32_LO12S0_RELA:
10941           reloc = R_NDS32_SDA19S0_RELA;
10942           break;
10943         case R_NDS32_LO12S1_RELA:
10944           reloc = R_NDS32_SDA18S1_RELA;
10945           break;
10946         case R_NDS32_LO12S2_RELA:
10947           reloc = R_NDS32_SDA17S2_RELA;
10948           break;
10949         case R_NDS32_LO12S2_DP_RELA:
10950           range_l = sdata_range[0][0];
10951           range_h = sdata_range[0][1];
10952           reloc = R_NDS32_SDA12S2_DP_RELA;
10953           break;
10954         case R_NDS32_LO12S2_SP_RELA:
10955           range_l = sdata_range[0][0];
10956           range_h = sdata_range[0][1];
10957           reloc = R_NDS32_SDA12S2_SP_RELA;
10958           break;
10959         default:
10960           return;
10961         }
10962
10963       /* There are range_h and range_l because linker has to promise
10964          all sections move cross one page together.  */
10965       if ((local_sda <= access_addr && (access_addr - local_sda) < range_h)
10966           || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
10967         {
10968           if (N32_OP6 (insn) == N32_OP6_ORI && N32_RT5 (insn) == REG_GP)
10969             {
10970               /* Maybe we should add R_NDS32_INSN16 reloc type here
10971                  or manually do some optimization.  sethi can't be
10972                  eliminated when updating $gp so the relative ori
10973                  needs to be preserved.  */
10974               return;
10975             }
10976           if (!turn_insn_to_sda_access (insn, ELF32_R_TYPE (irel->r_info),
10977                                         &insn))
10978             return;
10979           irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
10980           bfd_putb32 (insn, contents + laddr);
10981
10982           irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
10983                                            R_NDS32_INSN16);
10984           /* SDA17 must keep INSN16 for converting fp_as_gp.  */
10985           if (irelfn != irelend && reloc != R_NDS32_SDA17S2_RELA)
10986             irelfn->r_info =
10987               ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_NDS32_NONE);
10988
10989         }
10990     }
10991   return;
10992 }
10993
10994 /* Relax low part of PIC instruction pattern.  */
10995
10996 static void
10997 nds32_elf_relax_piclo12 (struct bfd_link_info *link_info, bfd *abfd,
10998                          asection *sec, Elf_Internal_Rela *irel,
10999                          bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11000                          Elf_Internal_Shdr *symtab_hdr)
11001 {
11002   uint32_t insn;
11003   bfd_vma local_sda, laddr;
11004   bfd_signed_vma foff;
11005   unsigned long reloc;
11006
11007   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11008                             &local_sda, FALSE);
11009   laddr = irel->r_offset;
11010   insn = bfd_getb32 (contents + laddr);
11011
11012   if (N32_OP6 (insn) != N32_OP6_ORI)
11013     return;
11014
11015   if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12)
11016     {
11017       foff = calculate_got_memory_address (abfd, link_info, irel,
11018                                            symtab_hdr) - local_sda;
11019       reloc = R_NDS32_GOT20;
11020     }
11021   else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12)
11022     {
11023       foff = calculate_plt_memory_address (abfd, link_info, isymbuf, irel,
11024                                            symtab_hdr) - local_sda;
11025       reloc = R_NDS32_PLT_GOTREL_LO20;
11026     }
11027   else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12)
11028     {
11029       foff = calculate_memory_address (abfd, irel, isymbuf,
11030                                        symtab_hdr) - local_sda;
11031       reloc = R_NDS32_GOTOFF;
11032     }
11033   else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12)
11034     {
11035       foff = local_sda - sec->output_section->vma + sec->output_offset
11036         + irel->r_offset + irel->r_addend;
11037       reloc = R_NDS32_GOTPC20;
11038     }
11039   else
11040     return;
11041
11042   if ((foff < CONSERVATIVE_20BIT) && (foff >= -CONSERVATIVE_20BIT))
11043     {
11044       /* Turn into MOVI.  */
11045       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
11046       insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
11047       bfd_putb32 (insn, contents + laddr);
11048     }
11049 }
11050
11051 /* Relax low part of LE TLS instruction pattern.  */
11052
11053 static void
11054 nds32_elf_relax_letlslo12 (struct bfd_link_info *link_info, bfd *abfd,
11055                            Elf_Internal_Rela *irel,
11056                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11057                            Elf_Internal_Shdr *symtab_hdr)
11058 {
11059   uint32_t insn;
11060   bfd_vma laddr;
11061   bfd_signed_vma foff;
11062   unsigned long reloc;
11063
11064   laddr = irel->r_offset;
11065   foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11066   BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
11067   foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
11068   insn = bfd_getb32 (contents + laddr);
11069
11070   if ( (bfd_signed_vma) (foff) < CONSERVATIVE_20BIT
11071       && (bfd_signed_vma) (foff) >= -CONSERVATIVE_20BIT)
11072     {
11073       /* Pattern sethi-ori transform to movi.  */
11074       reloc = R_NDS32_TLS_LE_20;
11075       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
11076       insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
11077       bfd_putb32 (insn, contents + laddr);
11078     }
11079 }
11080
11081 /* Relax LE TLS calculate address instruction pattern.  */
11082
11083 static void
11084 nds32_elf_relax_letlsadd (struct bfd_link_info *link_info, bfd *abfd,
11085                           asection *sec, Elf_Internal_Rela *irel,
11086                           Elf_Internal_Rela *internal_relocs,
11087                           bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11088                           Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11089 {
11090   /* Local TLS non-pic
11091      sethi    ta, hi20(symbol@tpoff)      ; TLS_LE_HI20
11092      ori      ta, ta, lo12(symbol@tpoff)  ; TLS_LE_LO12
11093      add      ra, ta, tp                  ; TLS_LE_ADD */
11094
11095   uint32_t insn;
11096   bfd_vma laddr;
11097   bfd_signed_vma foff;
11098   Elf_Internal_Rela *i1_irelfn, *irelend;
11099
11100   irelend = internal_relocs + sec->reloc_count;
11101   laddr = irel->r_offset;
11102   insn = bfd_getb32 (contents + laddr);
11103   i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11104                                       R_NDS32_PTR_RESOLVED);
11105   foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11106   BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
11107   foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
11108
11109   /* The range is +/-16k.  */
11110   if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT
11111       && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT)
11112     {
11113       /* Transform add to addi.  */
11114       insn = N32_TYPE2 (ADDI, N32_RT5 (insn), N32_RB5 (insn), 0);
11115       irel->r_info =
11116         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S0);
11117
11118       bfd_putb32 (insn, contents + laddr);
11119       if (i1_irelfn != irelend)
11120         {
11121           i1_irelfn->r_addend |= 1;
11122           *again = TRUE;
11123         }
11124     }
11125 }
11126
11127 /* Relax LE TLS load store instruction pattern.  */
11128
11129 static void
11130 nds32_elf_relax_letlsls (struct bfd_link_info *link_info, bfd *abfd,
11131                          asection *sec, Elf_Internal_Rela *irel,
11132                          Elf_Internal_Rela *internal_relocs,
11133                          bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11134                          Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11135 {
11136
11137   uint32_t insn;
11138   bfd_vma laddr;
11139   bfd_signed_vma foff;
11140   Elf_Internal_Rela *i1_irelfn, *irelend;
11141   int success = 0;
11142
11143   irelend = internal_relocs + sec->reloc_count;
11144   laddr = irel->r_offset;
11145   insn = bfd_getb32 (contents + laddr);
11146   i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11147                                       R_NDS32_PTR_RESOLVED);
11148   foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11149   BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
11150   foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
11151
11152   switch ((N32_OP6 (insn) << 8) | (insn & 0xff))
11153     {
11154     case (N32_OP6_MEM << 8) | N32_MEM_LB:
11155     case (N32_OP6_MEM << 8) | N32_MEM_SB:
11156     case (N32_OP6_MEM << 8) | N32_MEM_LBS:
11157       /* The range is +/-16k.  */
11158       if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT
11159           && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT)
11160         {
11161           insn =
11162             ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
11163           irel->r_info =
11164             ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S0);
11165           success = 1;
11166           break;
11167         }
11168       /* Fall through.  */
11169     case (N32_OP6_MEM << 8) | N32_MEM_LH:
11170     case (N32_OP6_MEM << 8) | N32_MEM_SH:
11171     case (N32_OP6_MEM << 8) | N32_MEM_LHS:
11172       /* The range is +/-32k.  */
11173       if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT_S1
11174           && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT_S1)
11175         {
11176           insn =
11177             ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
11178           irel->r_info =
11179             ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S1);
11180           success = 1;
11181           break;
11182         }
11183       /* Fall through.  */
11184     case (N32_OP6_MEM << 8) | N32_MEM_LW:
11185     case (N32_OP6_MEM << 8) | N32_MEM_SW:
11186       /* The range is +/-64k.  */
11187       if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT_S2
11188           && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT_S2)
11189         {
11190           insn =
11191             ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
11192           irel->r_info =
11193             ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S2);
11194           success = 1;
11195           break;
11196         }
11197       /* Fall through.  */
11198     default:
11199       break;
11200     }
11201
11202   if (success)
11203     {
11204       bfd_putb32 (insn, contents + laddr);
11205       if (i1_irelfn != irelend)
11206         {
11207           i1_irelfn->r_addend |= 1;
11208           *again = TRUE;
11209         }
11210     }
11211 }
11212
11213 /* Relax PTR relocation for nds32_elf_relax_section.  */
11214
11215 static bfd_boolean
11216 nds32_elf_relax_ptr (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
11217                      Elf_Internal_Rela *internal_relocs, int *insn_len,
11218                      int *seq_len, bfd_byte *contents)
11219 {
11220   Elf_Internal_Rela *ptr_irel, *irelend, *count_irel, *re_irel;
11221
11222   irelend = internal_relocs + sec->reloc_count;
11223
11224   re_irel =
11225     find_relocs_at_address_addr (irel, internal_relocs, irelend,
11226                                  R_NDS32_PTR_RESOLVED, irel->r_addend);
11227
11228   if (re_irel == irelend)
11229     {
11230       _bfd_error_handler (unrecognized_reloc_msg, abfd, "R_NDS32_PTR",
11231                           (long) irel->r_offset);
11232       return FALSE;
11233     }
11234
11235   if (re_irel->r_addend != 1)
11236     return FALSE;
11237
11238   /* Pointed target is relaxed and no longer needs this void *,
11239      change the type to NONE.  */
11240   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11241
11242   /* Find PTR_COUNT to decide remove it or not.  If PTR_COUNT does
11243      not exist, it means only count 1 and remove it directly.  */
11244   /* TODO: I hope we can obsolate R_NDS32_COUNT in the future.  */
11245   count_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11246                                        R_NDS32_PTR_COUNT);
11247   ptr_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11248                                      R_NDS32_PTR);
11249   if (count_irel != irelend)
11250     {
11251       if (--count_irel->r_addend > 0)
11252         return FALSE;
11253     }
11254
11255   if (ptr_irel != irelend)
11256     return FALSE;
11257
11258   /* If the PTR_COUNT is already 0, remove current instruction.  */
11259   *seq_len = nds32_elf_insn_size (abfd, contents, irel->r_offset);
11260   *insn_len = 0;
11261   return TRUE;
11262 }
11263
11264 /* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section.  */
11265
11266 static void
11267 nds32_elf_relax_pltgot_suff (struct bfd_link_info *link_info, bfd *abfd,
11268                              asection *sec, Elf_Internal_Rela *irel,
11269                              Elf_Internal_Rela *internal_relocs,
11270                              bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11271                              Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11272 {
11273   uint32_t insn;
11274   bfd_signed_vma foff;
11275   Elf_Internal_Rela *i1_irelfn, *irelend;
11276   bfd_vma local_sda, laddr;
11277
11278   irelend = internal_relocs + sec->reloc_count;
11279   laddr = irel->r_offset;
11280   insn = bfd_getb32 (contents + laddr);
11281
11282   /* FIXME: It's a little trouble to turn JRAL5 to JAL since
11283      we need additional space.  It might be help if we could
11284      borrow some space from instructions to be eliminated
11285      such as sethi, ori, add.  */
11286   if (insn & 0x80000000)
11287     return;
11288
11289   if (nds32_elf_check_dup_relocs
11290       (irel, internal_relocs, irelend, R_NDS32_PLT_GOT_SUFF))
11291     return;
11292
11293   i1_irelfn =
11294     find_relocs_at_address (irel, internal_relocs, irelend,
11295                             R_NDS32_PTR_RESOLVED);
11296
11297   /* FIXIT 090606
11298      The boundary should be reduced since the .plt section hasn't
11299      been created and the address of specific entry is still unknown
11300      Maybe the range between the function call and the begin of the
11301      .text section can be used to decide if the .plt is in the range
11302      of function call.  */
11303
11304   if (N32_OP6 (insn) == N32_OP6_ALU1
11305       && N32_SUB5 (insn) == N32_ALU1_ADD)
11306     {
11307       /* Get the value of the symbol referred to by the reloc.  */
11308       nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11309                                 &local_sda, FALSE);
11310       foff = (bfd_signed_vma) (calculate_plt_memory_address
11311                                (abfd, link_info, isymbuf, irel,
11312                                 symtab_hdr) - local_sda);
11313       /* This condition only happened when symbol is undefined.  */
11314       if (foff == 0)
11315         return;
11316
11317       if (foff < -CONSERVATIVE_19BIT || foff >= CONSERVATIVE_19BIT)
11318         return;
11319       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
11320                                    R_NDS32_PLT_GOTREL_LO19);
11321       /* addi.gp */
11322       insn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19));
11323     }
11324   else if (N32_OP6 (insn) == N32_OP6_JREG
11325            && N32_SUB5 (insn) == N32_JREG_JRAL)
11326     {
11327       /* Get the value of the symbol referred to by the reloc.  */
11328       foff =
11329         calculate_plt_offset (abfd, sec, link_info, isymbuf, irel, symtab_hdr);
11330       /* This condition only happened when symbol is undefined.  */
11331       if (foff == 0)
11332         return;
11333       if (foff < -CONSERVATIVE_24BIT_S1 || foff >= CONSERVATIVE_24BIT_S1)
11334         return;
11335       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_25_PLTREL);
11336       insn = INSN_JAL;
11337     }
11338   else
11339     return;
11340
11341   bfd_putb32 (insn, contents + laddr);
11342   if (i1_irelfn != irelend)
11343     {
11344       i1_irelfn->r_addend |= 1;
11345       *again = TRUE;
11346     }
11347 }
11348
11349 /* Relax GOT_SUFF relocation for nds32_elf_relax_section.  */
11350
11351 static void
11352 nds32_elf_relax_got_suff (struct bfd_link_info *link_info, bfd *abfd,
11353                           asection *sec, Elf_Internal_Rela *irel,
11354                           Elf_Internal_Rela *internal_relocs,
11355                           bfd_byte *contents, Elf_Internal_Shdr *symtab_hdr,
11356                           bfd_boolean *again)
11357 {
11358   uint32_t insn;
11359   bfd_signed_vma foff;
11360   Elf_Internal_Rela *i1_irelfn, *irelend;
11361   bfd_vma local_sda, laddr;
11362
11363   irelend = internal_relocs + sec->reloc_count;
11364   laddr = irel->r_offset;
11365   insn = bfd_getb32 (contents + laddr);
11366   if (insn & 0x80000000)
11367     return;
11368
11369   if (nds32_elf_check_dup_relocs
11370       (irel, internal_relocs, irelend, R_NDS32_GOT_SUFF))
11371     return;
11372
11373   i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11374                                       R_NDS32_PTR_RESOLVED);
11375
11376   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11377                             &local_sda, FALSE);
11378   foff = calculate_got_memory_address (abfd, link_info, irel,
11379                                        symtab_hdr) - local_sda;
11380
11381   if (foff < CONSERVATIVE_19BIT && foff >= -CONSERVATIVE_19BIT)
11382     {
11383       /* Turn LW to LWI.GP.  Change relocation type to R_NDS32_GOT_REL.  */
11384       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
11385       irel->r_info =
11386         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_GOT17S2_RELA);
11387       bfd_putb32 (insn, contents + laddr);
11388       if (i1_irelfn != irelend)
11389         {
11390           i1_irelfn->r_addend |= 1;
11391           *again = TRUE;
11392         }
11393     }
11394 }
11395
11396 /* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section.  */
11397
11398 static void
11399 nds32_elf_relax_gotoff_suff (struct bfd_link_info *link_info, bfd *abfd,
11400                              asection *sec, Elf_Internal_Rela *irel,
11401                              Elf_Internal_Rela *internal_relocs,
11402                              bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11403                              Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11404 {
11405   int opc_insn_gotoff;
11406   uint32_t insn;
11407   bfd_signed_vma foff;
11408   Elf_Internal_Rela *i1_irelfn, *i2_irelfn, *irelend;
11409   bfd_vma local_sda, laddr;
11410
11411   irelend = internal_relocs + sec->reloc_count;
11412   laddr = irel->r_offset;
11413   insn = bfd_getb32 (contents + laddr);
11414
11415   if (insn & 0x80000000)
11416     return;
11417
11418   if (nds32_elf_check_dup_relocs
11419       (irel, internal_relocs, irelend, R_NDS32_GOTOFF_SUFF))
11420     return;
11421
11422   i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11423                                       R_NDS32_PTR_RESOLVED);
11424   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11425                             &local_sda, FALSE);
11426   foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11427   foff = foff - local_sda;
11428
11429   if (foff >= CONSERVATIVE_19BIT || foff < -CONSERVATIVE_19BIT)
11430     return;
11431
11432   /* Concatenate opcode and sub-opcode for switch case.
11433      It may be MEM or ALU1.  */
11434   opc_insn_gotoff = (N32_OP6 (insn) << 8) | (insn & 0xff);
11435   switch (opc_insn_gotoff)
11436     {
11437     case (N32_OP6_MEM << 8) | N32_MEM_LW:
11438       /* 4-byte aligned.  */
11439       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
11440       irel->r_info =
11441         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA17S2_RELA);
11442       break;
11443     case (N32_OP6_MEM << 8) | N32_MEM_SW:
11444       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3));
11445       irel->r_info =
11446         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA17S2_RELA);
11447       break;
11448     case (N32_OP6_MEM << 8) | N32_MEM_LH:
11449       /* 2-byte aligned.  */
11450       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0);
11451       irel->r_info =
11452         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
11453       break;
11454     case (N32_OP6_MEM << 8) | N32_MEM_LHS:
11455       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (18));
11456       irel->r_info =
11457         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
11458       break;
11459     case (N32_OP6_MEM << 8) | N32_MEM_SH:
11460       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (19));
11461       irel->r_info =
11462         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
11463       break;
11464     case (N32_OP6_MEM << 8) | N32_MEM_LB:
11465       /* 1-byte aligned.  */
11466       insn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0);
11467       irel->r_info =
11468         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11469       break;
11470     case (N32_OP6_MEM << 8) | N32_MEM_LBS:
11471       insn = N32_TYPE1 (LBGP, N32_RT5 (insn), __BIT (19));
11472       irel->r_info =
11473         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11474       break;
11475     case (N32_OP6_MEM << 8) | N32_MEM_SB:
11476       insn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0);
11477       irel->r_info =
11478         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11479       break;
11480     case (N32_OP6_ALU1 << 8) | N32_ALU1_ADD:
11481       insn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19));
11482       irel->r_info =
11483         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11484       break;
11485     default:
11486       return;
11487     }
11488
11489   bfd_putb32 (insn, contents + laddr);
11490   if (i1_irelfn != irelend)
11491     {
11492       i1_irelfn->r_addend |= 1;
11493       *again = TRUE;
11494     }
11495   if ((i2_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11496                                            R_NDS32_INSN16)) != irelend)
11497     i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11498
11499 }
11500
11501 static bfd_boolean
11502 nds32_relax_adjust_label (bfd *abfd, asection *sec,
11503                           Elf_Internal_Rela *internal_relocs,
11504                           bfd_byte *contents,
11505                           nds32_elf_blank_t **relax_blank_list,
11506                           int optimize, int opt_size)
11507 {
11508   /* This code block is used to adjust 4-byte alignment by relax a pair
11509      of instruction a time.
11510
11511      It recognizes three types of relocations.
11512      1. R_NDS32_LABEL - a aligment.
11513      2. R_NDS32_INSN16 - relax a 32-bit instruction to 16-bit.
11514      3. is_16bit_NOP () - remove a 16-bit instruction.  */
11515
11516   /* TODO: It seems currently implementation only support 4-byte aligment.
11517      We should handle any-aligment.  */
11518
11519   Elf_Internal_Rela *insn_rel = NULL, *label_rel = NULL, *irel;
11520   Elf_Internal_Rela *tmp_rel, *tmp2_rel = NULL;
11521   Elf_Internal_Rela rel_temp;
11522   Elf_Internal_Rela *irelend;
11523   bfd_vma address;
11524   uint16_t insn16;
11525
11526   /* Checking for branch relaxation relies on the relocations to
11527      be sorted on 'r_offset'.  This is not guaranteed so we must sort.  */
11528   nds32_insertion_sort (internal_relocs, sec->reloc_count,
11529                         sizeof (Elf_Internal_Rela), compar_reloc);
11530
11531   irelend = internal_relocs + sec->reloc_count;
11532
11533   /* Force R_NDS32_LABEL before R_NDS32_INSN16.  */
11534   /* FIXME: Can we generate the right order in assembler?
11535      So we don't have to swapping them here.  */
11536
11537   for (label_rel = internal_relocs, insn_rel = internal_relocs;
11538        label_rel < irelend; label_rel++)
11539     {
11540       if (ELF32_R_TYPE (label_rel->r_info) != R_NDS32_LABEL)
11541         continue;
11542
11543       /* Find the first reloc has the same offset with label_rel.  */
11544       while (insn_rel < irelend && insn_rel->r_offset < label_rel->r_offset)
11545         insn_rel++;
11546
11547       for (;insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset;
11548            insn_rel++)
11549         /* Check if there were R_NDS32_INSN16 and R_NDS32_LABEL at the same
11550            address.  */
11551         if (ELF32_R_TYPE (insn_rel->r_info) == R_NDS32_INSN16)
11552           break;
11553
11554       if (insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset
11555           && insn_rel < label_rel)
11556         {
11557           /* Swap the two reloc if the R_NDS32_INSN16 is
11558              before R_NDS32_LABEL.  */
11559           memcpy (&rel_temp, insn_rel, sizeof (Elf_Internal_Rela));
11560           memcpy (insn_rel, label_rel, sizeof (Elf_Internal_Rela));
11561           memcpy (label_rel, &rel_temp, sizeof (Elf_Internal_Rela));
11562         }
11563     }
11564
11565   label_rel = NULL;
11566   insn_rel = NULL;
11567   /* If there were a sequence of R_NDS32_LABEL end up with .align 2
11568      or higher, remove other R_NDS32_LABEL with lower alignment.
11569      If an R_NDS32_INSN16 in between R_NDS32_LABELs must be converted,
11570      then the R_NDS32_LABEL sequence is broke.  */
11571   for (tmp_rel = internal_relocs; tmp_rel < irelend; tmp_rel++)
11572     {
11573       if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_LABEL)
11574         {
11575           if (label_rel == NULL)
11576             {
11577               if (tmp_rel->r_addend < 2)
11578                 label_rel = tmp_rel;
11579               continue;
11580             }
11581           else if (tmp_rel->r_addend > 1)
11582             {
11583               /* Remove all LABEL relocation from label_rel to tmp_rel
11584                  including relocations with same offset as tmp_rel.  */
11585               for (tmp2_rel = label_rel; tmp2_rel < tmp_rel
11586                    || tmp2_rel->r_offset == tmp_rel->r_offset; tmp2_rel++)
11587                 {
11588                   if (ELF32_R_TYPE (tmp2_rel->r_info) == R_NDS32_LABEL
11589                       && tmp2_rel->r_addend < 2)
11590                     tmp2_rel->r_info =
11591                       ELF32_R_INFO (ELF32_R_SYM (tmp2_rel->r_info),
11592                                     R_NDS32_NONE);
11593                 }
11594               label_rel = NULL;
11595             }
11596         }
11597       else if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16 && label_rel)
11598         {
11599           /* A new INSN16 which can be converted, so clear label_rel.  */
11600           if (is_convert_32_to_16 (abfd, sec, tmp_rel, internal_relocs,
11601                                    irelend, &insn16)
11602               || is_16bit_NOP (abfd, sec, tmp_rel))
11603             label_rel = NULL;
11604         }
11605     }
11606
11607   label_rel = NULL;
11608   insn_rel = NULL;
11609   /* Optimized for speed and nothing has not been relaxed.
11610      It's time to align labels.
11611      We may convert a 16-bit instruction right before a label to
11612      32-bit, in order to align the label if necessary
11613      all reloc entries has been sorted by r_offset.  */
11614   for (irel = internal_relocs; irel < irelend; irel++)
11615     {
11616       if (ELF32_R_TYPE (irel->r_info) != R_NDS32_INSN16
11617           && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL)
11618         continue;
11619
11620       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_INSN16)
11621         {
11622           /* A new INSN16 found, resize the old one.  */
11623           if (is_convert_32_to_16
11624               (abfd, sec, irel, internal_relocs, irelend, &insn16)
11625               || is_16bit_NOP (abfd, sec, irel))
11626             {
11627               if (insn_rel)
11628                 {
11629                   /* Previous INSN16 reloc exists, reduce its
11630                      size to 16-bit.  */
11631                   if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
11632                                            irelend, &insn16))
11633                     {
11634                       nds32_elf_write_16 (abfd, contents, insn_rel,
11635                                           internal_relocs, irelend, insn16);
11636
11637                       if (!insert_nds32_elf_blank_recalc_total
11638                           (relax_blank_list, insn_rel->r_offset + 2, 2))
11639                         return FALSE;
11640                     }
11641                   else if (is_16bit_NOP (abfd, sec, insn_rel))
11642                     {
11643                       if (!insert_nds32_elf_blank_recalc_total
11644                           (relax_blank_list, insn_rel->r_offset, 2))
11645                         return FALSE;
11646                     }
11647                   insn_rel->r_info =
11648                     ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info), R_NDS32_NONE);
11649                 }
11650               /* Save the new one for later use.  */
11651               insn_rel = irel;
11652             }
11653           else
11654             irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
11655                                          R_NDS32_NONE);
11656         }
11657       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL)
11658         {
11659           /* Search for label.  */
11660           int force_relax = 0;
11661
11662           /* Label on 16-bit instruction or optimization
11663              needless, just reset this reloc.  */
11664           insn16 = bfd_getb16 (contents + irel->r_offset);
11665           if ((irel->r_addend & 0x1f) < 2 && (!optimize || (insn16 & 0x8000)))
11666             {
11667               irel->r_info =
11668                 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11669               continue;
11670             }
11671
11672           address =
11673             irel->r_offset - get_nds32_elf_blank_total (relax_blank_list,
11674                                                         irel->r_offset, 1);
11675
11676           if (!insn_rel)
11677             {
11678               /* Check if there is case which can not be aligned.  */
11679               if (irel->r_addend == 2 && address & 0x2)
11680                 return FALSE;
11681               continue;
11682             }
11683
11684           /* Try to align this label.  */
11685
11686           if ((irel->r_addend & 0x1f) < 2)
11687             {
11688               /* Check if there is a INSN16 at the same address.
11689                  Label_rel always seats before insn_rel after
11690                  our sort.  */
11691
11692               /* Search for INSN16 at LABEL location.  If INSN16 is at
11693                  same location and this LABEL alignment is lower than 2,
11694                  the INSN16 can be converted to 2-byte.  */
11695               for (tmp_rel = irel;
11696                    tmp_rel < irelend && tmp_rel->r_offset == irel->r_offset;
11697                    tmp_rel++)
11698                 {
11699                   if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16
11700                       && (is_convert_32_to_16
11701                           (abfd, sec, tmp_rel, internal_relocs,
11702                            irelend, &insn16)
11703                           || is_16bit_NOP (abfd, sec, tmp_rel)))
11704                     {
11705                       force_relax = 1;
11706                       break;
11707                     }
11708                 }
11709             }
11710
11711           if (force_relax || irel->r_addend == 1 || address & 0x2)
11712             {
11713               /* Label not aligned.  */
11714               /* Previous reloc exists, reduce its size to 16-bit.  */
11715               if (is_convert_32_to_16 (abfd, sec, insn_rel,
11716                                        internal_relocs, irelend, &insn16))
11717                 {
11718                   nds32_elf_write_16 (abfd, contents, insn_rel,
11719                                       internal_relocs, irelend, insn16);
11720
11721                   if (!insert_nds32_elf_blank_recalc_total
11722                       (relax_blank_list, insn_rel->r_offset + 2, 2))
11723                     return FALSE;
11724                 }
11725               else if (is_16bit_NOP (abfd, sec, insn_rel))
11726                 {
11727                   if (!insert_nds32_elf_blank_recalc_total
11728                       (relax_blank_list, insn_rel->r_offset, 2))
11729                     return FALSE;
11730                 }
11731
11732             }
11733           /* INSN16 reloc is used.  */
11734           insn_rel = NULL;
11735         }
11736     }
11737
11738   address =
11739     sec->size - get_nds32_elf_blank_total (relax_blank_list, sec->size, 0);
11740   if (insn_rel && (address & 0x2 || opt_size))
11741     {
11742       if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
11743                                irelend, &insn16))
11744         {
11745           nds32_elf_write_16 (abfd, contents, insn_rel, internal_relocs,
11746                               irelend, insn16);
11747           if (!insert_nds32_elf_blank_recalc_total
11748               (relax_blank_list, insn_rel->r_offset + 2, 2))
11749             return FALSE;
11750           insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
11751                                            R_NDS32_NONE);
11752         }
11753       else if (is_16bit_NOP (abfd, sec, insn_rel))
11754         {
11755           if (!insert_nds32_elf_blank_recalc_total
11756               (relax_blank_list, insn_rel->r_offset, 2))
11757             return FALSE;
11758           insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
11759                                            R_NDS32_NONE);
11760         }
11761     }
11762   insn_rel = NULL;
11763   return TRUE;
11764 }
11765
11766 /* Pick relaxation round.  */
11767
11768 static int
11769 nds32_elf_pick_relax (bfd_boolean init, asection *sec, bfd_boolean *again,
11770                       struct elf_nds32_link_hash_table *table,
11771                       struct bfd_link_info *link_info)
11772 {
11773   static asection *final_sec, *first_sec = NULL;
11774   static bfd_boolean normal_again = FALSE;
11775   static bfd_boolean set = FALSE;
11776   static bfd_boolean first = TRUE;
11777   int round_table[] = {
11778       NDS32_RELAX_NORMAL_ROUND,
11779       NDS32_RELAX_JUMP_IFC_ROUND,
11780       NDS32_RELAX_EX9_BUILD_ROUND,
11781       NDS32_RELAX_EX9_REPLACE_ROUND,
11782   };
11783   static int pass = 0;
11784   static int relax_round;
11785
11786   /* The new round.  */
11787   if (init && first_sec == sec)
11788     {
11789       set = TRUE;
11790       normal_again = FALSE;
11791     }
11792
11793   if (first)
11794     {
11795       /* Run an empty run to get the final section.  */
11796       relax_round = NDS32_RELAX_EMPTY_ROUND;
11797
11798       /* It has to enter relax again because we can
11799          not make sure what the final turn is.  */
11800       *again = TRUE;
11801
11802       first = FALSE;
11803       first_sec = sec;
11804     }
11805
11806   if (!set)
11807     {
11808       /* Not reenter yet.  */
11809       final_sec = sec;
11810       return relax_round;
11811     }
11812
11813   relax_round = round_table[pass];
11814
11815   if (!init && relax_round == NDS32_RELAX_NORMAL_ROUND && *again)
11816     normal_again = TRUE;
11817
11818   if (!init && final_sec == sec)
11819     {
11820       switch (relax_round)
11821         {
11822         case NDS32_RELAX_NORMAL_ROUND:
11823           if (!normal_again)
11824             {
11825               /* Normal relaxation done.  */
11826               if (table->target_optimize & NDS32_RELAX_JUMP_IFC_ON)
11827                 {
11828                   pass++;
11829                   *again = TRUE;
11830                 }
11831               else if (table->target_optimize & NDS32_RELAX_EX9_ON)
11832                 {
11833                   pass += 2;    /* NDS32_RELAX_EX9_BUILD_ROUND */
11834                   *again = TRUE;
11835                 }
11836               else if (table->ex9_import_file)
11837                 {
11838                   /* Import ex9 table.  */
11839                   if (table->update_ex9_table)
11840                     pass += 2;  /* NDS32_RELAX_EX9_BUILD_ROUND */
11841                   else
11842                     pass += 3;  /* NDS32_RELAX_EX9_REPLACE_ROUND */
11843                   nds32_elf_ex9_import_table (link_info);
11844                   *again = TRUE;
11845                 }
11846             }
11847           break;
11848         case NDS32_RELAX_JUMP_IFC_ROUND:
11849           if (!nds32_elf_ifc_finish (link_info))
11850             _bfd_error_handler (_("error: Jump IFC Fail."));
11851           if (table->target_optimize & NDS32_RELAX_EX9_ON)
11852             {
11853               pass++;
11854               *again = TRUE;
11855             }
11856           break;
11857         case NDS32_RELAX_EX9_BUILD_ROUND:
11858           nds32_elf_ex9_finish (link_info);
11859           pass++;
11860           *again = TRUE;
11861           break;
11862         case NDS32_RELAX_EX9_REPLACE_ROUND:
11863           if (table->target_optimize & NDS32_RELAX_JUMP_IFC_ON)
11864             {
11865               /* Do jump IFC optimization again.  */
11866               if (!nds32_elf_ifc_finish (link_info))
11867                 _bfd_error_handler (_("error: Jump IFC Fail."));
11868             }
11869           break;
11870         default:
11871           break;
11872         }
11873     }
11874
11875   return relax_round;
11876 }
11877
11878 static bfd_boolean
11879 nds32_elf_relax_section (bfd *abfd, asection *sec,
11880                          struct bfd_link_info *link_info, bfd_boolean *again)
11881 {
11882   nds32_elf_blank_t *relax_blank_list = NULL;
11883   Elf_Internal_Shdr *symtab_hdr;
11884   Elf_Internal_Rela *internal_relocs;
11885   Elf_Internal_Rela *irel;
11886   Elf_Internal_Rela *irelend;
11887   Elf_Internal_Sym *isymbuf = NULL;
11888   bfd_byte *contents = NULL;
11889   bfd_boolean result = TRUE;
11890   int optimize = 0;
11891   int opt_size = 0;
11892   uint32_t insn;
11893   uint16_t insn16;
11894
11895   /* Target dependnet option.  */
11896   struct elf_nds32_link_hash_table *table;
11897   int load_store_relax;
11898   int relax_round;
11899
11900   relax_blank_list = NULL;
11901
11902   *again = FALSE;
11903
11904   /* Nothing to do for
11905    * relocatable link or
11906    * non-relocatable section or
11907    * non-code section or
11908    * empty content or
11909    * no reloc entry.  */
11910   if (bfd_link_relocatable (link_info)
11911       || (sec->flags & SEC_RELOC) == 0
11912       || (sec->flags & SEC_EXCLUDE) == 1
11913       || (sec->flags & SEC_CODE) == 0
11914       || sec->size == 0)
11915     return TRUE;
11916
11917   /* 09.12.11 Workaround.  */
11918   /*  We have to adjust align for R_NDS32_LABEL if needed.
11919       The adjust approach only can fix 2-byte align once.  */
11920   if (sec->alignment_power > 2)
11921     return TRUE;
11922
11923   /* The optimization type to do.  */
11924
11925   table = nds32_elf_hash_table (link_info);
11926   relax_round = nds32_elf_pick_relax (TRUE, sec, again, table, link_info);
11927   switch (relax_round)
11928     {
11929     case NDS32_RELAX_JUMP_IFC_ROUND:
11930       /* Here is the entrance of ifc jump relaxation.  */
11931       if (!nds32_elf_ifc_calc (link_info, abfd, sec))
11932         return FALSE;
11933       nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
11934       return TRUE;
11935
11936     case NDS32_RELAX_EX9_BUILD_ROUND:
11937       /* Here is the entrance of ex9 relaxation.  There are two pass of
11938          ex9 relaxation.  The one is to traverse all instructions and build
11939          the hash table.  The other one is to compare instructions and replace
11940          it by ex9.it.  */
11941       if (!nds32_elf_ex9_build_hash_table (abfd, sec, link_info))
11942         return FALSE;
11943       nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
11944       return TRUE;
11945
11946     case NDS32_RELAX_EX9_REPLACE_ROUND:
11947       if (!nds32_elf_ex9_replace_instruction (link_info, abfd, sec))
11948         return FALSE;
11949       return TRUE;
11950
11951     case NDS32_RELAX_EMPTY_ROUND:
11952       nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
11953       return TRUE;
11954
11955     case NDS32_RELAX_NORMAL_ROUND:
11956     default:
11957       if (sec->reloc_count == 0)
11958         return TRUE;
11959       break;
11960     }
11961
11962   /* The begining of general relaxation.  */
11963
11964   if (is_SDA_BASE_set == 0)
11965     {
11966       bfd_vma gp;
11967       is_SDA_BASE_set = 1;
11968       nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11969                                 &gp, FALSE);
11970       relax_range_measurement (abfd);
11971     }
11972
11973   if (is_ITB_BASE_set == 0)
11974     {
11975       /* Set the _ITB_BASE_.  */
11976       if (!nds32_elf_ex9_itb_base (link_info))
11977         {
11978           _bfd_error_handler (_("%B: error: Cannot set _ITB_BASE_"), abfd);
11979           bfd_set_error (bfd_error_bad_value);
11980         }
11981     }
11982
11983   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
11984   /* Relocations MUST be kept in memory, because relaxation adjust them.  */
11985   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
11986                                                TRUE /* keep_memory */);
11987   if (internal_relocs == NULL)
11988     goto error_return;
11989
11990   irelend = internal_relocs + sec->reloc_count;
11991   irel = find_relocs_at_address (internal_relocs, internal_relocs,
11992                                  irelend, R_NDS32_RELAX_ENTRY);
11993
11994   if (irel == irelend)
11995     return TRUE;
11996
11997   if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
11998     {
11999       if (irel->r_addend & R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG)
12000         {
12001           nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
12002           return TRUE;
12003         }
12004
12005       if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG)
12006         optimize = 1;
12007
12008       if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG)
12009         opt_size = 1;
12010     }
12011
12012   load_store_relax = table->load_store_relax;
12013
12014   /* Get symbol table and section content.  */
12015   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
12016       || !nds32_get_local_syms (abfd, sec, &isymbuf))
12017     goto error_return;
12018
12019   /* Do relax loop only when finalize is not done.
12020      Take care of relaxable relocs except INSN16.  */
12021   for (irel = internal_relocs; irel < irelend; irel++)
12022     {
12023       int seq_len;              /* Original length of instruction sequence.  */
12024       int insn_len = 0;         /* Final length of instruction sequence.  */
12025       bfd_boolean removed;
12026
12027       insn = 0;
12028       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
12029           && (irel->r_addend & 0x1f) >= 2)
12030         optimize = 1;
12031
12032       /* Relocation Types
12033          R_NDS32_LONGCALL1      53
12034          R_NDS32_LONGCALL2      54
12035          R_NDS32_LONGCALL3      55
12036          R_NDS32_LONGJUMP1      56
12037          R_NDS32_LONGJUMP2      57
12038          R_NDS32_LONGJUMP3      58
12039          R_NDS32_LOADSTORE      59  */
12040       if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL1
12041           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LOADSTORE)
12042         seq_len = GET_SEQ_LEN (irel->r_addend);
12043
12044       /* Relocation Types
12045          R_NDS32_LONGCALL4      107
12046          R_NDS32_LONGCALL5      108
12047          R_NDS32_LONGCALL6      109
12048          R_NDS32_LONGJUMP4      110
12049          R_NDS32_LONGJUMP5      111
12050          R_NDS32_LONGJUMP6      112
12051          R_NDS32_LONGJUMP7      113  */
12052       else if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL4
12053                && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LONGJUMP7)
12054         seq_len = 4;
12055
12056         /* Relocation Types
12057          R_NDS32_LO12S0_RELA            30
12058          R_NDS32_LO12S1_RELA            29
12059          R_NDS32_LO12S2_RELA            28
12060          R_NDS32_LO12S2_SP_RELA         71
12061          R_NDS32_LO12S2_DP_RELA         70
12062          R_NDS32_GOT_LO12               46
12063          R_NDS32_GOTOFF_LO12            50
12064          R_NDS32_PLTREL_LO12            65
12065          R_NDS32_PLT_GOTREL_LO12        67
12066          R_NDS32_17IFC_PCREL_RELA       96
12067          R_NDS32_GOT_SUFF               193
12068          R_NDS32_GOTOFF_SUFF            194
12069          R_NDS32_PLT_GOT_SUFF           195
12070          R_NDS32_MULCALL_SUFF           196
12071          R_NDS32_PTR                    197  */
12072       else if ((ELF32_R_TYPE (irel->r_info) <= R_NDS32_LO12S0_RELA
12073                 && ELF32_R_TYPE (irel->r_info) >= R_NDS32_LO12S2_RELA)
12074                || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_SP_RELA
12075                || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_DP_RELA
12076                || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12
12077                || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12
12078                || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12
12079                || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLTREL_LO12
12080                || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12
12081                || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_GOT_SUFF
12082                    && ELF32_R_TYPE (irel->r_info) <= R_NDS32_PTR)
12083                || ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
12084                || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LO12
12085                || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_ADD
12086                || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LS)
12087         seq_len = 0;
12088       else
12089         continue;
12090
12091       insn_len = seq_len;
12092       removed = FALSE;
12093
12094       switch (ELF32_R_TYPE (irel->r_info))
12095         {
12096         case R_NDS32_LONGCALL1:
12097           removed = nds32_elf_relax_longcall1 (abfd, sec, irel, internal_relocs,
12098                                                &insn_len, contents, isymbuf,
12099                                                symtab_hdr);
12100           break;
12101         case R_NDS32_LONGCALL2:
12102           removed = nds32_elf_relax_longcall2 (abfd, sec, irel, internal_relocs,
12103                                                &insn_len, contents, isymbuf,
12104                                                symtab_hdr);
12105           break;
12106         case R_NDS32_LONGCALL3:
12107           removed = nds32_elf_relax_longcall3 (abfd, sec, irel, internal_relocs,
12108                                                &insn_len, contents, isymbuf,
12109                                                symtab_hdr);
12110           break;
12111         case R_NDS32_LONGJUMP1:
12112           removed = nds32_elf_relax_longjump1 (abfd, sec, irel, internal_relocs,
12113                                                &insn_len, contents, isymbuf,
12114                                                symtab_hdr);
12115           break;
12116         case R_NDS32_LONGJUMP2:
12117           removed = nds32_elf_relax_longjump2 (abfd, sec, irel, internal_relocs,
12118                                                &insn_len, contents, isymbuf,
12119                                                symtab_hdr);
12120           break;
12121         case R_NDS32_LONGJUMP3:
12122           removed = nds32_elf_relax_longjump3 (abfd, sec, irel, internal_relocs,
12123                                                &insn_len, contents, isymbuf,
12124                                                symtab_hdr);
12125           break;
12126         case R_NDS32_LONGCALL4:
12127           removed = nds32_elf_relax_longcall4 (abfd, sec, irel, internal_relocs,
12128                                                &insn_len, contents, isymbuf,
12129                                                symtab_hdr);
12130           break;
12131         case R_NDS32_LONGCALL5:
12132           removed = nds32_elf_relax_longcall5 (abfd, sec, irel, internal_relocs,
12133                                                &insn_len, contents, isymbuf,
12134                                                symtab_hdr);
12135           break;
12136         case R_NDS32_LONGCALL6:
12137           removed = nds32_elf_relax_longcall6 (abfd, sec, irel, internal_relocs,
12138                                                &insn_len, contents, isymbuf,
12139                                                symtab_hdr);
12140           break;
12141         case R_NDS32_LONGJUMP4:
12142           removed = nds32_elf_relax_longjump4 (abfd, sec, irel, internal_relocs,
12143                                                &insn_len, contents, isymbuf,
12144                                                symtab_hdr);
12145           break;
12146         case R_NDS32_LONGJUMP5:
12147           removed = nds32_elf_relax_longjump5 (abfd, sec, irel, internal_relocs,
12148                                                &insn_len, &seq_len, contents,
12149                                                isymbuf, symtab_hdr);
12150           break;
12151         case R_NDS32_LONGJUMP6:
12152           removed = nds32_elf_relax_longjump6 (abfd, sec, irel, internal_relocs,
12153                                                &insn_len, &seq_len, contents,
12154                                                isymbuf, symtab_hdr);
12155           break;
12156         case R_NDS32_LONGJUMP7:
12157           removed = nds32_elf_relax_longjump7 (abfd, sec, irel, internal_relocs,
12158                                                &insn_len, &seq_len, contents,
12159                                                isymbuf, symtab_hdr);
12160           break;
12161         case R_NDS32_LOADSTORE:
12162           removed = nds32_elf_relax_loadstore (link_info, abfd, sec, irel,
12163                                                internal_relocs, &insn_len,
12164                                                contents, isymbuf, symtab_hdr,
12165                                                load_store_relax);
12166           break;
12167         case R_NDS32_LO12S0_RELA:
12168         case R_NDS32_LO12S1_RELA:
12169         case R_NDS32_LO12S2_DP_RELA:
12170         case R_NDS32_LO12S2_SP_RELA:
12171         case R_NDS32_LO12S2_RELA:
12172           /* Relax for low part.  */
12173           nds32_elf_relax_lo12 (link_info, abfd, sec, irel, internal_relocs,
12174                                 contents, isymbuf, symtab_hdr);
12175
12176           /* It is impossible to delete blank, so just continue.  */
12177           continue;
12178         case R_NDS32_GOT_LO12:
12179         case R_NDS32_GOTOFF_LO12:
12180         case R_NDS32_PLTREL_LO12:
12181         case R_NDS32_PLT_GOTREL_LO12:
12182         case R_NDS32_GOTPC_LO12:
12183           /* Relax for PIC gp-relative low part.  */
12184           nds32_elf_relax_piclo12 (link_info, abfd, sec, irel, contents,
12185                                    isymbuf, symtab_hdr);
12186
12187           /* It is impossible to delete blank, so just continue.  */
12188           continue;
12189         case R_NDS32_TLS_LE_LO12:
12190           /* Relax for LE TLS low part.  */
12191           nds32_elf_relax_letlslo12 (link_info, abfd, irel, contents,
12192                                      isymbuf, symtab_hdr);
12193
12194           /* It is impossible to delete blank, so just continue.  */
12195           continue;
12196         case R_NDS32_TLS_LE_ADD:
12197           nds32_elf_relax_letlsadd (link_info, abfd, sec, irel, internal_relocs,
12198                                     contents, isymbuf, symtab_hdr, again);
12199           /* It is impossible to delete blank, so just continue.  */
12200           continue;
12201         case R_NDS32_TLS_LE_LS:
12202           nds32_elf_relax_letlsls (link_info, abfd, sec, irel, internal_relocs,
12203                                    contents, isymbuf, symtab_hdr, again);
12204           continue;
12205         case R_NDS32_PTR:
12206           removed = nds32_elf_relax_ptr (abfd, sec, irel, internal_relocs,
12207                                          &insn_len, &seq_len, contents);
12208           break;
12209         case R_NDS32_PLT_GOT_SUFF:
12210           nds32_elf_relax_pltgot_suff (link_info, abfd, sec, irel,
12211                                        internal_relocs, contents,
12212                                        isymbuf, symtab_hdr, again);
12213           /* It is impossible to delete blank, so just continue.  */
12214           continue;
12215         case R_NDS32_GOT_SUFF:
12216           nds32_elf_relax_got_suff (link_info, abfd, sec, irel,
12217                                     internal_relocs, contents,
12218                                     symtab_hdr, again);
12219           /* It is impossible to delete blank, so just continue.  */
12220           continue;
12221         case R_NDS32_GOTOFF_SUFF:
12222           nds32_elf_relax_gotoff_suff (link_info, abfd, sec, irel,
12223                                        internal_relocs, contents,
12224                                        isymbuf, symtab_hdr, again);
12225           /* It is impossible to delete blank, so just continue.  */
12226           continue;
12227         default:
12228           continue;
12229
12230         }
12231       if (removed && seq_len - insn_len > 0)
12232         {
12233           if (!insert_nds32_elf_blank
12234               (&relax_blank_list, irel->r_offset + insn_len,
12235                seq_len - insn_len))
12236             goto error_return;
12237           *again = TRUE;
12238         }
12239     }
12240
12241   calc_nds32_blank_total (relax_blank_list);
12242
12243   if (table->relax_fp_as_gp)
12244     {
12245       if (!nds32_relax_fp_as_gp (link_info, abfd, sec, internal_relocs,
12246                                  irelend, isymbuf))
12247         goto error_return;
12248
12249       if (*again == FALSE)
12250         {
12251           if (!nds32_fag_remove_unused_fpbase (abfd, sec, internal_relocs,
12252                                                irelend))
12253             goto error_return;
12254         }
12255     }
12256
12257   nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
12258
12259   if (*again == FALSE)
12260     {
12261       if (!nds32_relax_adjust_label (abfd, sec, internal_relocs, contents,
12262                                      &relax_blank_list, optimize, opt_size))
12263         goto error_return;
12264     }
12265
12266   /* It doesn't matter optimize_for_space_no_align anymore.
12267        If object file is assembled with flag '-Os',
12268        the we don't adjust jump-destination on 4-byte boundary.  */
12269
12270   if (relax_blank_list)
12271     {
12272       nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
12273       relax_blank_list = NULL;
12274     }
12275
12276   if (*again == FALSE)
12277     {
12278       /* Closing the section, so we don't relax it anymore.  */
12279       bfd_vma sec_size_align;
12280       Elf_Internal_Rela *tmp_rel;
12281
12282       /* Pad to alignment boundary.  Only handle current section alignment.  */
12283       sec_size_align = (sec->size + (~((-1U) << sec->alignment_power)))
12284                        & ((-1U) << sec->alignment_power);
12285       if ((sec_size_align - sec->size) & 0x2)
12286         {
12287           insn16 = NDS32_NOP16;
12288           bfd_putb16 (insn16, contents + sec->size);
12289           sec->size += 2;
12290         }
12291
12292       while (sec_size_align != sec->size)
12293         {
12294           insn = NDS32_NOP32;
12295           bfd_putb32 (insn, contents + sec->size);
12296           sec->size += 4;
12297         }
12298
12299       tmp_rel = find_relocs_at_address (internal_relocs, internal_relocs,
12300                                         irelend, R_NDS32_RELAX_ENTRY);
12301       if (tmp_rel != irelend)
12302         tmp_rel->r_addend |= R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG;
12303
12304       clean_nds32_elf_blank ();
12305     }
12306
12307 finish:
12308   if (internal_relocs != NULL
12309       && elf_section_data (sec)->relocs != internal_relocs)
12310     free (internal_relocs);
12311
12312   if (contents != NULL
12313       && elf_section_data (sec)->this_hdr.contents != contents)
12314     free (contents);
12315
12316   if (isymbuf != NULL && symtab_hdr->contents != (bfd_byte *) isymbuf)
12317     free (isymbuf);
12318
12319   return result;
12320
12321 error_return:
12322   result = FALSE;
12323   goto finish;
12324 }
12325
12326 static struct bfd_elf_special_section const nds32_elf_special_sections[] =
12327 {
12328   {".sdata", 6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE},
12329   {".sbss", 5, -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE},
12330   {NULL, 0, 0, 0, 0}
12331 };
12332
12333 static bfd_boolean
12334 nds32_elf_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED,
12335                             struct bfd_link_info *info,
12336                             void *finfo ATTRIBUTE_UNUSED,
12337                             bfd_boolean (*func) (void *, const char *,
12338                                                  Elf_Internal_Sym *,
12339                                                  asection *,
12340                                                  struct elf_link_hash_entry *)
12341                             ATTRIBUTE_UNUSED)
12342 {
12343   FILE *sym_ld_script = NULL;
12344   struct elf_nds32_link_hash_table *table;
12345
12346   table = nds32_elf_hash_table (info);
12347   sym_ld_script = table->sym_ld_script;
12348
12349   if (check_start_export_sym)
12350     fprintf (sym_ld_script, "}\n");
12351
12352   return TRUE;
12353 }
12354
12355 static enum elf_reloc_type_class
12356 nds32_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
12357                             const asection *rel_sec ATTRIBUTE_UNUSED,
12358                             const Elf_Internal_Rela *rela)
12359 {
12360   switch ((int) ELF32_R_TYPE (rela->r_info))
12361     {
12362     case R_NDS32_RELATIVE:
12363       return reloc_class_relative;
12364     case R_NDS32_JMP_SLOT:
12365       return reloc_class_plt;
12366     case R_NDS32_COPY:
12367       return reloc_class_copy;
12368     default:
12369       return reloc_class_normal;
12370     }
12371 }
12372
12373 /* Put target dependent option into info hash table.  */
12374 void
12375 bfd_elf32_nds32_set_target_option (struct bfd_link_info *link_info,
12376                                    int relax_fp_as_gp,
12377                                    int eliminate_gc_relocs,
12378                                    FILE * sym_ld_script, int load_store_relax,
12379                                    int target_optimize, int relax_status,
12380                                    int relax_round, FILE * ex9_export_file,
12381                                    FILE * ex9_import_file,
12382                                    int update_ex9_table, int ex9_limit,
12383                                    bfd_boolean ex9_loop_aware,
12384                                    bfd_boolean ifc_loop_aware)
12385 {
12386   struct elf_nds32_link_hash_table *table;
12387
12388   table = nds32_elf_hash_table (link_info);
12389   if (table == NULL)
12390     return;
12391
12392   table->relax_fp_as_gp = relax_fp_as_gp;
12393   table->eliminate_gc_relocs = eliminate_gc_relocs;
12394   table->sym_ld_script = sym_ld_script;
12395   table ->load_store_relax = load_store_relax;
12396   table->target_optimize = target_optimize;
12397   table->relax_status = relax_status;
12398   table->relax_round = relax_round;
12399   table->ex9_export_file = ex9_export_file;
12400   table->ex9_import_file = ex9_import_file;
12401   table->update_ex9_table = update_ex9_table;
12402   table->ex9_limit = ex9_limit;
12403   table->ex9_loop_aware = ex9_loop_aware;
12404   table->ifc_loop_aware = ifc_loop_aware;
12405 }
12406 \f
12407 /* These functions and data-structures are used for fp-as-gp
12408    optimization.  */
12409
12410 #define FAG_THRESHOLD   3       /* At least 3 gp-access.  */
12411 /* lwi37.fp covers 508 bytes, but there may be 32-byte padding between
12412    the read-only section and read-write section.  */
12413 #define FAG_WINDOW      (508 - 32)
12414
12415 /* An nds32_fag represent a gp-relative access.
12416    We find best fp-base by using a sliding window
12417    to find a base address which can cover most gp-access.  */
12418 struct nds32_fag
12419 {
12420   struct nds32_fag *next;       /* NULL-teminated linked list.  */
12421   bfd_vma addr;                 /* The address of this fag.  */
12422   Elf_Internal_Rela **relas;    /* The relocations associated with this fag.
12423                                    It is used for applying FP7U2_FLAG.  */
12424   int count;                    /* How many times this address is referred.
12425                                    There should be exactly `count' relocations
12426                                    in relas.  */
12427   int relas_capcity;            /* The buffer size of relas.
12428                                    We use an array instead of linked-list,
12429                                    and realloc is used to adjust buffer size.  */
12430 };
12431
12432 static void
12433 nds32_fag_init (struct nds32_fag *head)
12434 {
12435   memset (head, 0, sizeof (struct nds32_fag));
12436 }
12437
12438 static void
12439 nds32_fag_verify (struct nds32_fag *head)
12440 {
12441   struct nds32_fag *iter;
12442   struct nds32_fag *prev;
12443
12444   prev = NULL;
12445   iter = head->next;
12446   while (iter)
12447     {
12448       if (prev && prev->addr >= iter->addr)
12449         puts ("Bug in fp-as-gp insertion.");
12450       prev = iter;
12451       iter = iter->next;
12452     }
12453 }
12454
12455 /* Insert a fag in ascending order.
12456    If a fag of the same address already exists,
12457    they are chained by relas array.  */
12458
12459 static void
12460 nds32_fag_insert (struct nds32_fag *head, bfd_vma addr,
12461                   Elf_Internal_Rela * rel)
12462 {
12463   struct nds32_fag *iter;
12464   struct nds32_fag *new_fag;
12465   const int INIT_RELAS_CAP = 4;
12466
12467   for (iter = head;
12468        iter->next && iter->next->addr <= addr;
12469        iter = iter->next)
12470     /* Find somewhere to insert.  */ ;
12471
12472   /* `iter' will be equal to `head' if the list is empty.  */
12473   if (iter != head && iter->addr == addr)
12474     {
12475       /* The address exists in the list.
12476          Insert `rel' into relocation list, relas.  */
12477
12478       /* Check whether relas is big enough.  */
12479       if (iter->count >= iter->relas_capcity)
12480         {
12481           iter->relas_capcity *= 2;
12482           iter->relas = bfd_realloc
12483             (iter->relas, iter->relas_capcity * sizeof (void *));
12484         }
12485       iter->relas[iter->count++] = rel;
12486       return;
12487     }
12488
12489   /* This is a new address.  Create a fag node for it.  */
12490   new_fag = bfd_malloc (sizeof (struct nds32_fag));
12491   memset (new_fag, 0, sizeof (*new_fag));
12492   new_fag->addr = addr;
12493   new_fag->count = 1;
12494   new_fag->next = iter->next;
12495   new_fag->relas_capcity = INIT_RELAS_CAP;
12496   new_fag->relas = (Elf_Internal_Rela **)
12497     bfd_malloc (new_fag->relas_capcity * sizeof (void *));
12498   new_fag->relas[0] = rel;
12499   iter->next = new_fag;
12500
12501   nds32_fag_verify (head);
12502 }
12503
12504 static void
12505 nds32_fag_free_list (struct nds32_fag *head)
12506 {
12507   struct nds32_fag *iter;
12508
12509   iter = head->next;
12510   while (iter)
12511     {
12512       struct nds32_fag *tmp = iter;
12513       iter = iter->next;
12514       free (tmp->relas);
12515       tmp->relas = NULL;
12516       free (tmp);
12517     }
12518 }
12519
12520 /* Find the best fp-base address.
12521    The relocation associated with that address is returned,
12522    so we can track the symbol instead of a fixed address.
12523
12524    When relaxation, the address of an datum may change,
12525    because a text section is shrinked, so the data section
12526    moves forward.  If the aligments of text and data section
12527    are different, their distance may change too.
12528    Therefore, tracking a fixed address is not appriate.  */
12529
12530 static int
12531 nds32_fag_find_base (struct nds32_fag *head, struct nds32_fag **bestpp)
12532 {
12533   struct nds32_fag *base;       /* First fag in the window.  */
12534   struct nds32_fag *last;       /* First fag outside the window.  */
12535   int accu = 0;                 /* Usage accumulation.  */
12536   struct nds32_fag *best;       /* Best fag.  */
12537   int baccu = 0;                /* Best accumulation.  */
12538
12539   /* Use first fag for initial, and find the last fag in the window.
12540
12541      In each iteration, we could simply subtract previous fag
12542      and accumulate following fags which are inside the window,
12543      untill we each the end.  */
12544
12545   if (head->next == NULL)
12546     {
12547       *bestpp = NULL;
12548       return 0;
12549     }
12550
12551   /* Initialize base.  */
12552   base = head->next;
12553   best = base;
12554   for (last = base;
12555        last && last->addr < base->addr + FAG_WINDOW;
12556        last = last->next)
12557     accu += last->count;
12558
12559   baccu = accu;
12560
12561   /* Record the best base in each iteration.  */
12562   while (base->next)
12563     {
12564       accu -= base->count;
12565       base = base->next;
12566       /* Account fags in window.  */
12567       for (/* Nothing.  */;
12568            last && last->addr < base->addr + FAG_WINDOW;
12569            last = last->next)
12570         accu += last->count;
12571
12572       /* A better fp-base?  */
12573       if (accu > baccu)
12574         {
12575           best = base;
12576           baccu = accu;
12577         }
12578     }
12579
12580   if (bestpp)
12581     *bestpp = best;
12582   return baccu;
12583 }
12584
12585 /* Apply R_NDS32_INSN16_FP7U2_FLAG on gp-relative accesses,
12586    so we can convert it fo fp-relative access later.
12587    `best_fag' is the best fp-base.  Only those inside the window
12588    of best_fag is applied the flag.  */
12589
12590 static bfd_boolean
12591 nds32_fag_mark_relax (struct bfd_link_info *link_info,
12592                       bfd *abfd, struct nds32_fag *best_fag,
12593                       Elf_Internal_Rela *internal_relocs,
12594                       Elf_Internal_Rela *irelend)
12595 {
12596   struct nds32_fag *ifag;
12597   bfd_vma best_fpbase, gp;
12598   bfd *output_bfd;
12599
12600   output_bfd = abfd->sections->output_section->owner;
12601   nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
12602   best_fpbase = best_fag->addr;
12603
12604   if (best_fpbase > gp + sdata_range[1][1]
12605       || best_fpbase < gp - sdata_range[1][0])
12606     return FALSE;
12607
12608   /* Mark these inside the window R_NDS32_INSN16_FP7U2_FLAG flag,
12609      so we know they can be converted to lwi37.fp.   */
12610   for (ifag = best_fag;
12611        ifag && ifag->addr < best_fpbase + FAG_WINDOW; ifag = ifag->next)
12612     {
12613       int i;
12614
12615       for (i = 0; i < ifag->count; i++)
12616         {
12617           Elf_Internal_Rela *insn16_rel;
12618           Elf_Internal_Rela *fag_rel;
12619
12620           fag_rel = ifag->relas[i];
12621
12622           /* Only if this is within the WINDOWS, FP7U2_FLAG
12623              is applied.  */
12624
12625           insn16_rel = find_relocs_at_address
12626             (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
12627
12628           if (insn16_rel != irelend)
12629             insn16_rel->r_addend = R_NDS32_INSN16_FP7U2_FLAG;
12630         }
12631     }
12632   return TRUE;
12633 }
12634
12635 /* Reset INSN16 to clean fp as gp.  */
12636
12637 static void
12638 nds32_fag_unmark_relax (struct nds32_fag *fag,
12639                         Elf_Internal_Rela *internal_relocs,
12640                         Elf_Internal_Rela *irelend)
12641 {
12642   struct nds32_fag *ifag;
12643   int i;
12644   Elf_Internal_Rela *insn16_rel;
12645   Elf_Internal_Rela *fag_rel;
12646
12647   for (ifag = fag; ifag; ifag = ifag->next)
12648     {
12649       for (i = 0; i < ifag->count; i++)
12650         {
12651           fag_rel = ifag->relas[i];
12652
12653           /* Restore the INSN16 relocation.  */
12654           insn16_rel = find_relocs_at_address
12655             (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
12656
12657           if (insn16_rel != irelend)
12658             insn16_rel->r_addend &= ~R_NDS32_INSN16_FP7U2_FLAG;
12659         }
12660     }
12661 }
12662
12663 /* This is the main function of fp-as-gp optimization.
12664    It should be called by relax_section.  */
12665
12666 static bfd_boolean
12667 nds32_relax_fp_as_gp (struct bfd_link_info *link_info,
12668                       bfd *abfd, asection *sec,
12669                       Elf_Internal_Rela *internal_relocs,
12670                       Elf_Internal_Rela *irelend,
12671                       Elf_Internal_Sym *isymbuf)
12672 {
12673   Elf_Internal_Rela *begin_rel = NULL;
12674   Elf_Internal_Rela *irel;
12675   struct nds32_fag fag_head;
12676   Elf_Internal_Shdr *symtab_hdr;
12677   bfd_byte *contents;
12678   bfd_boolean ifc_inside = FALSE;
12679
12680   /* FIXME: Can we bfd_elf_link_read_relocs for the relocs?  */
12681
12682   /* Per-function fp-base selection.
12683      1. Create a list for all the gp-relative access.
12684      2. Base on those gp-relative address,
12685         find a fp-base which can cover most access.
12686      3. Use the fp-base for fp-as-gp relaxation.
12687
12688      NOTE: If fp-as-gp is not worth to do, (e.g., less than 3 times),
12689      we should
12690      1. delete the `la $fp, _FP_BASE_' instruction and
12691      2. not convert lwi.gp to lwi37.fp.
12692
12693      To delete the _FP_BASE_ instruction, we simply apply
12694      R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG flag in the r_addend to disable it.
12695
12696      To suppress the conversion, we simply NOT to apply
12697      R_NDS32_INSN16_FP7U2_FLAG flag.  */
12698
12699   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12700
12701   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
12702       || !nds32_get_local_syms (abfd, sec, &isymbuf))
12703     return FALSE;
12704
12705   /* Check whether it is worth for fp-as-gp optimization,
12706      i.e., at least 3 gp-load.
12707
12708      Set R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG if we should NOT
12709      apply this optimization.  */
12710
12711   for (irel = internal_relocs; irel < irelend; irel++)
12712     {
12713       /* We recognize R_NDS32_RELAX_REGION_BEGIN/_END for the region.
12714          One we enter the begin of the region, we track all the LW/ST
12715          instructions, so when we leave the region, we try to find
12716          the best fp-base address for those LW/ST instructions.  */
12717
12718       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
12719           && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
12720         {
12721           /* Begin of the region.  */
12722           if (begin_rel)
12723             /* xgettext:c-format */
12724             _bfd_error_handler (_("%B: Nested OMIT_FP in %A."), abfd, sec);
12725
12726           begin_rel = irel;
12727           nds32_fag_init (&fag_head);
12728           ifc_inside = FALSE;
12729         }
12730       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
12731                && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
12732         {
12733           int accu;
12734           struct nds32_fag *best_fag, *tmp_fag;
12735           int dist;
12736
12737           /* End of the region.
12738              Check whether it is worth to do fp-as-gp.  */
12739
12740           if (begin_rel == NULL)
12741             {
12742               /* xgettext:c-format */
12743               _bfd_error_handler (_("%B: Unmatched OMIT_FP in %A."), abfd, sec);
12744               continue;
12745             }
12746
12747           accu = nds32_fag_find_base (&fag_head, &best_fag);
12748
12749           /* Clean FP7U2_FLAG because they may set ever.  */
12750           tmp_fag = fag_head.next;
12751           nds32_fag_unmark_relax (tmp_fag, internal_relocs, irelend);
12752
12753           /* Check if it is worth, and FP_BASE is near enough to SDA_BASE.  */
12754           if (accu < FAG_THRESHOLD
12755               || !nds32_fag_mark_relax (link_info, abfd, best_fag,
12756                                         internal_relocs, irelend))
12757             {
12758               /* Not worth to do fp-as-gp.  */
12759               begin_rel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
12760               begin_rel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
12761               irel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
12762               irel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
12763               nds32_fag_free_list (&fag_head);
12764               begin_rel = NULL;
12765               continue;
12766             }
12767
12768           /* R_SYM of R_NDS32_RELAX_REGION_BEGIN is not used by assembler,
12769              so we use it to record the distance to the reloction of best
12770              fp-base.  */
12771           dist = best_fag->relas[0] - begin_rel;
12772           BFD_ASSERT (dist > 0 && dist < 0xffffff);
12773           /* Use high 16 bits of addend to record the _FP_BASE_ matched
12774              relocation.  And get the base value when relocating.  */
12775           begin_rel->r_addend &= (0x1 << 16) - 1;
12776           begin_rel->r_addend |= dist << 16;
12777
12778           nds32_fag_free_list (&fag_head);
12779           begin_rel = NULL;
12780         }
12781
12782       if (begin_rel == NULL || ifc_inside)
12783         /* Skip if we are not in the region of fp-as-gp.  */
12784         continue;
12785
12786       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S2_RELA
12787           || ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA17S2_RELA)
12788         {
12789           bfd_vma addr;
12790           uint32_t insn;
12791
12792           /* A gp-relative access is found.  Insert it to the fag-list.  */
12793
12794           /* Rt is necessary an RT3, so it can be converted to lwi37.fp.  */
12795           insn = bfd_getb32 (contents + irel->r_offset);
12796           if (!N32_IS_RT3 (insn))
12797             continue;
12798
12799           addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
12800           nds32_fag_insert (&fag_head, addr, irel);
12801         }
12802       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA_FP7U2_RELA)
12803         {
12804           begin_rel = NULL;
12805         }
12806       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
12807                || ELF32_R_TYPE (irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
12808         {
12809           /* Suppress fp as gp when encounter ifc.  */
12810           ifc_inside = TRUE;
12811         }
12812     }
12813
12814   return TRUE;
12815 }
12816
12817 /* Remove unused `la $fp, _FD_BASE_' instruction.  */
12818
12819 static bfd_boolean
12820 nds32_fag_remove_unused_fpbase (bfd *abfd, asection *sec,
12821                                 Elf_Internal_Rela *internal_relocs,
12822                                 Elf_Internal_Rela *irelend)
12823 {
12824   Elf_Internal_Rela *irel;
12825   Elf_Internal_Shdr *symtab_hdr;
12826   bfd_byte *contents = NULL;
12827   nds32_elf_blank_t *relax_blank_list = NULL;
12828   bfd_boolean result = TRUE;
12829   bfd_boolean unused_region = FALSE;
12830
12831   /*
12832      NOTE: Disable fp-as-gp if we encounter ifcall relocations.
12833      * R_NDS32_17IFC_PCREL_RELA
12834      * R_NDS32_10IFCU_PCREL_RELA
12835
12836      CASE??????????????
12837   */
12838
12839   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12840   nds32_get_section_contents (abfd, sec, &contents, TRUE);
12841
12842   for (irel = internal_relocs; irel < irelend; irel++)
12843     {
12844       /* To remove unused fp-base, we simply find the REGION_NOT_OMIT_FP
12845          we marked to in previous pass.
12846          DO NOT scan relocations again, since we've alreadly decided it
12847          and set the flag.  */
12848       const char *syname;
12849       int syndx;
12850       uint32_t insn;
12851
12852       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
12853           && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
12854         unused_region = TRUE;
12855       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
12856                && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
12857         unused_region = FALSE;
12858
12859       /* We're not in the region.  */
12860       if (!unused_region)
12861         continue;
12862
12863       /* _FP_BASE_ must be a GLOBAL symbol.  */
12864       syndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
12865       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
12866         continue;
12867
12868       /* The symbol name must be _FP_BASE_.  */
12869       syname = elf_sym_hashes (abfd)[syndx]->root.root.string;
12870       if (strcmp (syname, FP_BASE_NAME) != 0)
12871         continue;
12872
12873       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA19S0_RELA)
12874         {
12875           /* addi.gp  $fp, -256  */
12876           insn = bfd_getb32 (contents + irel->r_offset);
12877           if (insn != INSN_ADDIGP_TO_FP)
12878             continue;
12879         }
12880       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S0_RELA)
12881         {
12882           /* addi  $fp, $gp, -256  */
12883           insn = bfd_getb32 (contents + irel->r_offset);
12884           if (insn != INSN_ADDI_GP_TO_FP)
12885             continue;
12886         }
12887       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_20_RELA)
12888         {
12889           /* movi  $fp, FP_BASE  */
12890           insn = bfd_getb32 (contents + irel->r_offset);
12891           if (insn != INSN_MOVI_TO_FP)
12892             continue;
12893         }
12894       else
12895         continue;
12896
12897       /* We got here because a FP_BASE instruction is found.  */
12898       if (!insert_nds32_elf_blank_recalc_total
12899           (&relax_blank_list, irel->r_offset, 4))
12900         goto error_return;
12901     }
12902
12903 finish:
12904   if (relax_blank_list)
12905     {
12906       nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
12907       relax_blank_list = NULL;
12908     }
12909   return result;
12910
12911 error_return:
12912   result = FALSE;
12913   goto finish;
12914 }
12915
12916 /* This is a version of bfd_generic_get_relocated_section_contents.
12917    We need this variety because relaxation will modify the dwarf
12918    infomation.  When there is undefined symbol reference error mesage,
12919    linker need to dump line number where the symbol be used.  However
12920    the address is be relaxed, it can not get the original dwarf contents.
12921    The variety only modify function call for reading in the section.  */
12922
12923 static bfd_byte *
12924 nds32_elf_get_relocated_section_contents (bfd *abfd,
12925                                           struct bfd_link_info *link_info,
12926                                           struct bfd_link_order *link_order,
12927                                           bfd_byte *data,
12928                                           bfd_boolean relocatable,
12929                                           asymbol **symbols)
12930 {
12931   bfd *input_bfd = link_order->u.indirect.section->owner;
12932   asection *input_section = link_order->u.indirect.section;
12933   long reloc_size;
12934   arelent **reloc_vector;
12935   long reloc_count;
12936
12937   reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
12938   if (reloc_size < 0)
12939     return NULL;
12940
12941   /* Read in the section.  */
12942   if (!nds32_get_section_contents (input_bfd, input_section, &data, FALSE))
12943     return NULL;
12944
12945   if (reloc_size == 0)
12946     return data;
12947
12948   reloc_vector = (arelent **) bfd_malloc (reloc_size);
12949   if (reloc_vector == NULL)
12950     return NULL;
12951
12952   reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
12953                                         reloc_vector, symbols);
12954   if (reloc_count < 0)
12955     goto error_return;
12956
12957   if (reloc_count > 0)
12958     {
12959       arelent **parent;
12960       for (parent = reloc_vector; *parent != NULL; parent++)
12961         {
12962           char *error_message = NULL;
12963           asymbol *symbol;
12964           bfd_reloc_status_type r;
12965
12966           symbol = *(*parent)->sym_ptr_ptr;
12967           if (symbol->section && discarded_section (symbol->section))
12968             {
12969               bfd_byte *p;
12970               static reloc_howto_type none_howto
12971                 = HOWTO (0, 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL,
12972                          "unused", FALSE, 0, 0, FALSE);
12973
12974               p = data + (*parent)->address * bfd_octets_per_byte (input_bfd);
12975               _bfd_clear_contents ((*parent)->howto, input_bfd, input_section,
12976                                    p);
12977               (*parent)->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
12978               (*parent)->addend = 0;
12979               (*parent)->howto = &none_howto;
12980               r = bfd_reloc_ok;
12981             }
12982           else
12983             r = bfd_perform_relocation (input_bfd, *parent, data,
12984                                         input_section,
12985                                         relocatable ? abfd : NULL,
12986                                         &error_message);
12987
12988           if (relocatable)
12989             {
12990               asection *os = input_section->output_section;
12991
12992               /* A partial link, so keep the relocs.  */
12993               os->orelocation[os->reloc_count] = *parent;
12994               os->reloc_count++;
12995             }
12996
12997           if (r != bfd_reloc_ok)
12998             {
12999               switch (r)
13000                 {
13001                 case bfd_reloc_undefined:
13002                   (*link_info->callbacks->undefined_symbol)
13003                     (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13004                      input_bfd, input_section, (*parent)->address, TRUE);
13005                   break;
13006                 case bfd_reloc_dangerous:
13007                   BFD_ASSERT (error_message != NULL);
13008                   (*link_info->callbacks->reloc_dangerous)
13009                     (link_info, error_message,
13010                      input_bfd, input_section, (*parent)->address);
13011                   break;
13012                 case bfd_reloc_overflow:
13013                   (*link_info->callbacks->reloc_overflow)
13014                     (link_info, NULL,
13015                      bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13016                      (*parent)->howto->name, (*parent)->addend,
13017                      input_bfd, input_section, (*parent)->address);
13018                   break;
13019                 case bfd_reloc_outofrange:
13020                   /* PR ld/13730:
13021                      This error can result when processing some partially
13022                      complete binaries.  Do not abort, but issue an error
13023                      message instead.  */
13024                   link_info->callbacks->einfo
13025                     /* xgettext:c-format */
13026                     (_("%X%P: %B(%A): relocation \"%R\" goes out of range\n"),
13027                      abfd, input_section, * parent);
13028                   goto error_return;
13029
13030                 default:
13031                   abort ();
13032                   break;
13033                 }
13034             }
13035         }
13036     }
13037
13038   free (reloc_vector);
13039   return data;
13040
13041 error_return:
13042   free (reloc_vector);
13043   return NULL;
13044 }
13045 \f
13046 /* Link-time IFC relaxation.
13047    In this optimization, we chains jump instructions
13048    of the same destination with ifcall.  */
13049
13050
13051 /* List to save jal and j relocation.  */
13052 struct elf_nds32_ifc_symbol_entry
13053 {
13054   asection *sec;
13055   struct elf_link_hash_entry *h;
13056   struct elf_nds32_ifc_irel_list *irel_head;
13057   unsigned long insn;
13058   int times;
13059   int enable;           /* Apply ifc.  */
13060   int ex9_enable;       /* Apply ifc after ex9.  */
13061   struct elf_nds32_ifc_symbol_entry *next;
13062 };
13063
13064 struct elf_nds32_ifc_irel_list
13065 {
13066   Elf_Internal_Rela *irel;
13067   asection *sec;
13068   bfd_vma addr;
13069   /* If this is set, then it is the last instruction for
13070      ifc-chain, so it must be keep for the actual branching.  */
13071   int keep;
13072   struct elf_nds32_ifc_irel_list *next;
13073 };
13074
13075 static struct elf_nds32_ifc_symbol_entry *ifc_symbol_head = NULL;
13076
13077 /* Insert symbol of jal and j for ifc.  */
13078
13079 static void
13080 nds32_elf_ifc_insert_symbol (asection *sec,
13081                              struct elf_link_hash_entry *h,
13082                              Elf_Internal_Rela *irel,
13083                              unsigned long insn)
13084 {
13085   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13086
13087   /* Check there is target of existing entry the same as the new one.  */
13088   while (ptr != NULL)
13089     {
13090       if (((h == NULL && ptr->sec == sec
13091             && ELF32_R_SYM (ptr->irel_head->irel->r_info) == ELF32_R_SYM (irel->r_info)
13092             && ptr->irel_head->irel->r_addend == irel->r_addend)
13093            || h != NULL)
13094           && ptr->h == h
13095           && ptr->insn == insn)
13096         {
13097           /* The same target exist, so insert into list.  */
13098           struct elf_nds32_ifc_irel_list *irel_list = ptr->irel_head;
13099
13100           while (irel_list->next != NULL)
13101             irel_list = irel_list->next;
13102           irel_list->next = bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list));
13103           irel_list = irel_list->next;
13104           irel_list->irel = irel;
13105           irel_list->keep = 1;
13106
13107           if (h == NULL)
13108             irel_list->sec = NULL;
13109           else
13110             irel_list->sec = sec;
13111           irel_list->next = NULL;
13112           return;
13113         }
13114       if (ptr->next == NULL)
13115         break;
13116       ptr = ptr->next;
13117     }
13118
13119   /* There is no same target entry, so build a new one.  */
13120   if (ifc_symbol_head == NULL)
13121     {
13122       ifc_symbol_head = bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry));
13123       ptr = ifc_symbol_head;
13124     }
13125   else
13126     {
13127       ptr->next = bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry));
13128       ptr = ptr->next;
13129     }
13130
13131   ptr->h = h;
13132   ptr->irel_head = bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list));
13133   ptr->irel_head->irel = irel;
13134   ptr->insn = insn;
13135   ptr->irel_head->keep = 1;
13136
13137   if (h == NULL)
13138     {
13139       /* Local symbols.  */
13140       ptr->sec = sec;
13141       ptr->irel_head->sec = NULL;
13142     }
13143   else
13144     {
13145       /* Global symbol.  */
13146       ptr->sec = NULL;
13147       ptr->irel_head->sec = sec;
13148     }
13149
13150   ptr->irel_head->next = NULL;
13151   ptr->times = 0;
13152   ptr->enable = 0;
13153   ptr->ex9_enable = 0;
13154   ptr->next = NULL;
13155 }
13156
13157 /* Gather all jal and j instructions.  */
13158
13159 static bfd_boolean
13160 nds32_elf_ifc_calc (struct bfd_link_info *info,
13161                     bfd *abfd, asection *sec)
13162 {
13163   Elf_Internal_Rela *internal_relocs;
13164   Elf_Internal_Rela *irelend;
13165   Elf_Internal_Rela *irel;
13166   Elf_Internal_Shdr *symtab_hdr;
13167   bfd_byte *contents = NULL;
13168   uint32_t insn, insn_with_reg;
13169   unsigned long r_symndx;
13170   struct elf_link_hash_entry *h;
13171   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
13172   struct elf_nds32_link_hash_table *table;
13173   bfd_boolean ifc_loop_aware;
13174
13175   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
13176                                                TRUE /* keep_memory */);
13177   irelend = internal_relocs + sec->reloc_count;
13178   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13179
13180   /* Check if the object enable ifc.  */
13181   irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend,
13182                                  R_NDS32_RELAX_ENTRY);
13183
13184   if (irel == NULL
13185       || irel >= irelend
13186       || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
13187       || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
13188           && !(irel->r_addend & R_NDS32_RELAX_ENTRY_IFC_FLAG)))
13189     return TRUE;
13190
13191   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
13192     return FALSE;
13193
13194   table = nds32_elf_hash_table (info);
13195   ifc_loop_aware = table->ifc_loop_aware;
13196   while (irel != NULL && irel < irelend)
13197     {
13198       /* Traverse all relocation and gather all of them to build the list.  */
13199
13200       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN)
13201         {
13202           if (ifc_loop_aware == 1
13203               && (irel->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG) != 0)
13204             {
13205               /* Check the region if loop or not.  If it is true and
13206                  ifc-loop-aware is true, ignore the region till region end.  */
13207               while (irel != NULL
13208                      && irel < irelend
13209                      && (ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_END
13210                          || (irel->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG) != 0))
13211                 irel++;
13212             }
13213         }
13214
13215       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA)
13216         {
13217           insn = bfd_getb32 (contents + irel->r_offset);
13218           nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
13219           r_symndx = ELF32_R_SYM (irel->r_info);
13220           if (r_symndx < symtab_hdr->sh_info)
13221             {
13222               /* Local symbol.  */
13223               nds32_elf_ifc_insert_symbol (sec, NULL, irel, insn_with_reg);
13224             }
13225           else
13226             {
13227               /* External symbol.  */
13228               h = sym_hashes[r_symndx - symtab_hdr->sh_info];
13229               nds32_elf_ifc_insert_symbol (sec, h, irel, insn_with_reg);
13230             }
13231         }
13232       irel++;
13233     }
13234   return TRUE;
13235 }
13236
13237 /* Determine whether j and jal should be substituted.  */
13238
13239 static void
13240 nds32_elf_ifc_filter (struct bfd_link_info *info)
13241 {
13242   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13243   struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13244   struct elf_nds32_ifc_irel_list *irel_keeper = NULL;
13245   struct elf_nds32_link_hash_table *table;
13246   int target_optimize;
13247   bfd_vma address;
13248
13249   table = nds32_elf_hash_table (info);
13250   target_optimize = table->target_optimize;
13251   while (ptr)
13252     {
13253       irel_ptr = ptr->irel_head;
13254       if (ptr->h == NULL)
13255         {
13256           /* Local symbol.  */
13257           irel_keeper = irel_ptr;
13258           while (irel_ptr && irel_ptr->next)
13259             {
13260               /* Check there is jump target can be used.  */
13261               if ((irel_ptr->next->irel->r_offset
13262                    - irel_keeper->irel->r_offset) > 1022)
13263                 irel_keeper = irel_ptr->next;
13264               else
13265                 {
13266                   ptr->enable = 1;
13267                   irel_ptr->keep = 0;
13268                 }
13269               irel_ptr = irel_ptr->next;
13270             }
13271         }
13272       else
13273         {
13274           /* Global symbol.  */
13275           /* We have to get the absolute address and decide
13276              whether to keep it or not.  */
13277           while (irel_ptr)
13278             {
13279               address = (irel_ptr->irel->r_offset
13280                          + irel_ptr->sec->output_section->vma
13281                          + irel_ptr->sec->output_offset);
13282               irel_ptr->addr = address;
13283               irel_ptr = irel_ptr->next;
13284             }
13285
13286           irel_ptr = ptr->irel_head;
13287           while (irel_ptr)
13288             {
13289               /* Sort by address.  */
13290               struct elf_nds32_ifc_irel_list *irel_dest = irel_ptr;
13291               struct elf_nds32_ifc_irel_list *irel_temp = irel_ptr;
13292               struct elf_nds32_ifc_irel_list *irel_ptr_prev = NULL;
13293               struct elf_nds32_ifc_irel_list *irel_dest_prev = NULL;
13294
13295               /* Get the smallest one.  */
13296               while (irel_temp->next)
13297                 {
13298                   if (irel_temp->next->addr < irel_dest->addr)
13299                     {
13300                       irel_dest_prev = irel_temp;
13301                       irel_dest = irel_temp->next;
13302                     }
13303                   irel_temp = irel_temp->next;
13304                 }
13305
13306               if (irel_dest != irel_ptr)
13307                 {
13308                   if (irel_ptr_prev)
13309                     irel_ptr_prev->next = irel_dest;
13310                   if (irel_dest_prev)
13311                     irel_dest_prev->next = irel_ptr;
13312                   irel_temp = irel_ptr->next;
13313                   irel_ptr->next = irel_dest->next;
13314                   irel_dest->next = irel_temp;
13315                 }
13316               irel_ptr_prev = irel_ptr;
13317               irel_ptr = irel_ptr->next;
13318             }
13319
13320           irel_ptr = ptr->irel_head;
13321           irel_keeper = irel_ptr;
13322           while (irel_ptr && irel_ptr->next)
13323             {
13324               if ((irel_ptr->next->addr - irel_keeper->addr) > 1022)
13325                 irel_keeper = irel_ptr->next;
13326               else
13327                 {
13328                   ptr->enable = 1;
13329                   irel_ptr->keep = 0;
13330                 }
13331               irel_ptr = irel_ptr->next;
13332             }
13333         }
13334
13335         /* Ex9 enable.  Reserve it for ex9.  */
13336       if ((target_optimize & NDS32_RELAX_EX9_ON)
13337           && ptr->irel_head != irel_keeper)
13338         ptr->enable = 0;
13339       ptr = ptr->next;
13340     }
13341 }
13342
13343 /* Determine whether j and jal should be substituted after ex9 done.  */
13344
13345 static void
13346 nds32_elf_ifc_filter_after_ex9 (void)
13347 {
13348   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13349   struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13350
13351   while (ptr)
13352     {
13353       if (ptr->enable == 0)
13354         {
13355           /* Check whether ifc is applied or not.  */
13356           irel_ptr = ptr->irel_head;
13357           ptr->ex9_enable = 1;
13358           while (irel_ptr)
13359             {
13360               if (ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_TRAN)
13361                 {
13362                   /* Ex9 already.  */
13363                   ptr->ex9_enable = 0;
13364                   break;
13365                 }
13366               irel_ptr = irel_ptr->next;
13367             }
13368         }
13369       ptr = ptr->next;
13370     }
13371 }
13372
13373 /* Wrapper to do ifc relaxation.  */
13374
13375 bfd_boolean
13376 nds32_elf_ifc_finish (struct bfd_link_info *info)
13377 {
13378   int relax_status;
13379   struct elf_nds32_link_hash_table *table;
13380
13381   table = nds32_elf_hash_table (info);
13382   relax_status = table->relax_status;
13383
13384   if (!(relax_status & NDS32_RELAX_JUMP_IFC_DONE))
13385     nds32_elf_ifc_filter (info);
13386   else
13387     nds32_elf_ifc_filter_after_ex9 ();
13388
13389   if (!nds32_elf_ifc_replace (info))
13390     return FALSE;
13391
13392   if (table)
13393     table->relax_status |= NDS32_RELAX_JUMP_IFC_DONE;
13394   return TRUE;
13395 }
13396
13397 /* Traverse the result of ifc filter and replace it with ifcall9.  */
13398
13399 static bfd_boolean
13400 nds32_elf_ifc_replace (struct bfd_link_info *info)
13401 {
13402   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13403   struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13404   nds32_elf_blank_t *relax_blank_list = NULL;
13405   bfd_byte *contents = NULL;
13406   Elf_Internal_Rela *internal_relocs;
13407   Elf_Internal_Rela *irel;
13408   Elf_Internal_Rela *irelend;
13409   unsigned short insn16 = INSN_IFCALL9;
13410   struct elf_nds32_link_hash_table *table;
13411   int relax_status;
13412
13413   table = nds32_elf_hash_table (info);
13414   relax_status = table->relax_status;
13415
13416   while (ptr)
13417     {
13418       /* Traverse the ifc gather list, and replace the
13419          filter entries by ifcall9.  */
13420       if ((!(relax_status & NDS32_RELAX_JUMP_IFC_DONE) && ptr->enable == 1)
13421           || ((relax_status & NDS32_RELAX_JUMP_IFC_DONE)
13422               && ptr->ex9_enable == 1))
13423         {
13424           irel_ptr = ptr->irel_head;
13425           if (ptr->h == NULL)
13426             {
13427               /* Local symbol.  */
13428               internal_relocs = _bfd_elf_link_read_relocs
13429                 (ptr->sec->owner, ptr->sec, NULL, NULL, TRUE /* keep_memory */);
13430               irelend = internal_relocs + ptr->sec->reloc_count;
13431
13432               if (!nds32_get_section_contents (ptr->sec->owner, ptr->sec,
13433                                                &contents, TRUE))
13434                 return FALSE;
13435
13436               while (irel_ptr)
13437                 {
13438                   if (irel_ptr->keep == 0 && irel_ptr->next)
13439                     {
13440                       /* The one can be replaced.  We have to check whether
13441                          there is any alignment point in the region.  */
13442                       irel = irel_ptr->irel;
13443                       while (((irel_ptr->next->keep == 0
13444                                && irel < irel_ptr->next->irel)
13445                               || (irel_ptr->next->keep == 1 && irel < irelend))
13446                              && !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13447                                   && (irel->r_addend & 0x1f) == 2))
13448                         irel++;
13449                       if (irel >= irelend
13450                           || !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13451                                && (irel->r_addend & 0x1f) == 2
13452                                && ((irel->r_offset - get_nds32_elf_blank_total
13453                                     (&relax_blank_list, irel->r_offset, 1))
13454                                    & 0x02) == 0))
13455                         {
13456                           /* Replace by ifcall9.  */
13457                           bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13458                           if (!insert_nds32_elf_blank_recalc_total
13459                               (&relax_blank_list, irel_ptr->irel->r_offset + 2, 2))
13460                             return FALSE;
13461                           irel_ptr->irel->r_info =
13462                             ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13463                                           R_NDS32_10IFCU_PCREL_RELA);
13464                         }
13465                     }
13466                   irel_ptr = irel_ptr->next;
13467                 }
13468
13469               /* Delete the redundant code.  */
13470               if (relax_blank_list)
13471                 {
13472                   nds32_elf_relax_delete_blanks (ptr->sec->owner, ptr->sec,
13473                                                  relax_blank_list);
13474                   relax_blank_list = NULL;
13475                 }
13476             }
13477           else
13478             {
13479               /* Global symbol.  */
13480               while (irel_ptr)
13481                 {
13482                   if (irel_ptr->keep == 0 && irel_ptr->next)
13483                     {
13484                       /* The one can be replaced, and we have to check
13485                          whether there is any alignment point in the region.  */
13486                       internal_relocs = _bfd_elf_link_read_relocs
13487                         (irel_ptr->sec->owner, irel_ptr->sec, NULL, NULL,
13488                          TRUE /* keep_memory */);
13489                       irelend = internal_relocs + irel_ptr->sec->reloc_count;
13490                       if (!nds32_get_section_contents (irel_ptr->sec->owner,
13491                                                        irel_ptr->sec, &contents,
13492                                                        TRUE))
13493                         return FALSE;
13494
13495                       irel = irel_ptr->irel;
13496                       while (((irel_ptr->sec == irel_ptr->next->sec
13497                                && irel_ptr->next->keep == 0
13498                                && irel < irel_ptr->next->irel)
13499                               || ((irel_ptr->sec != irel_ptr->next->sec
13500                                    || irel_ptr->next->keep == 1)
13501                                   && irel < irelend))
13502                              && !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13503                                   && (irel->r_addend & 0x1f) == 2))
13504                         irel++;
13505                       if (irel >= irelend
13506                           || !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13507                                && (irel->r_addend & 0x1f) == 2
13508                                && ((irel->r_offset
13509                                     - get_nds32_elf_blank_total (&relax_blank_list,
13510                                                             irel->r_offset, 1)) & 0x02) == 0))
13511                         {
13512                           /* Replace by ifcall9.  */
13513                           bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13514                           if (!insert_nds32_elf_blank_recalc_total
13515                               (&relax_blank_list, irel_ptr->irel->r_offset + 2, 2))
13516                             return FALSE;
13517
13518                           /* Delete the redundant code, and clear the relocation.  */
13519                           nds32_elf_relax_delete_blanks (irel_ptr->sec->owner,
13520                                                          irel_ptr->sec,
13521                                                          relax_blank_list);
13522                           irel_ptr->irel->r_info =
13523                             ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13524                                           R_NDS32_10IFCU_PCREL_RELA);
13525                           relax_blank_list = NULL;
13526                         }
13527                     }
13528
13529                   irel_ptr = irel_ptr->next;
13530                 }
13531             }
13532         }
13533       ptr = ptr->next;
13534     }
13535
13536   return TRUE;
13537 }
13538
13539 /* Relocate ifcall.  */
13540
13541 static bfd_boolean
13542 nds32_elf_ifc_reloc (void)
13543 {
13544   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13545   struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13546   struct elf_nds32_ifc_irel_list *irel_keeper = NULL;
13547   bfd_vma relocation, address;
13548   unsigned short insn16;
13549   bfd_byte *contents = NULL;
13550   static bfd_boolean done = FALSE;
13551
13552   if (done)
13553     return TRUE;
13554
13555   done = TRUE;
13556
13557   while (ptr)
13558     {
13559       /* Check the entry is enable ifcall.  */
13560       if (ptr->enable == 1 || ptr->ex9_enable == 1)
13561         {
13562           /* Get the reserve jump.  */
13563           irel_ptr = ptr->irel_head;
13564           while (irel_ptr)
13565             {
13566               if (irel_ptr->keep == 1)
13567                 {
13568                   irel_keeper = irel_ptr;
13569                   break;
13570                 }
13571               irel_ptr = irel_ptr->next;
13572             }
13573
13574           irel_ptr = ptr->irel_head;
13575           if (ptr->h == NULL)
13576             {
13577               /* Local symbol.  */
13578               if (!nds32_get_section_contents (ptr->sec->owner, ptr->sec,
13579                                                &contents, TRUE))
13580                 return FALSE;
13581
13582               while (irel_ptr)
13583                 {
13584                   if (irel_ptr->keep == 0
13585                       && ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
13586                     {
13587                       relocation = irel_keeper->irel->r_offset;
13588                       relocation = relocation - irel_ptr->irel->r_offset;
13589                       while (irel_keeper && relocation > 1022)
13590                         {
13591                           irel_keeper = irel_keeper->next;
13592                           if (irel_keeper && irel_keeper->keep == 1)
13593                             {
13594                               relocation = irel_keeper->irel->r_offset;
13595                               relocation = relocation - irel_ptr->irel->r_offset;
13596                             }
13597                         }
13598                       if (relocation > 1022)
13599                         {
13600                           /* Double check.  */
13601                           irel_keeper = ptr->irel_head;
13602                           while (irel_keeper)
13603                             {
13604                               if (irel_keeper->keep == 1)
13605                                 {
13606                                   relocation = irel_keeper->irel->r_offset;
13607                                   relocation = relocation - irel_ptr->irel->r_offset;
13608                                 }
13609                               if (relocation <= 1022)
13610                                 break;
13611                               irel_keeper = irel_keeper->next;
13612                             }
13613                           if (!irel_keeper)
13614                             return FALSE;
13615                         }
13616                       irel_ptr->irel->r_info =
13617                         ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13618                                       R_NDS32_NONE);
13619                       insn16 = INSN_IFCALL9 | (relocation >> 1);
13620                       bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13621                     }
13622                   irel_ptr = irel_ptr->next;
13623                 }
13624             }
13625           else
13626             {
13627               /* Global symbol.  */
13628               while (irel_ptr)
13629                 {
13630                   if (irel_ptr->keep == 0
13631                       && ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
13632                     {
13633                       /* Get the distance between ifcall and jump.  */
13634                       relocation = (irel_keeper->irel->r_offset
13635                                     + irel_keeper->sec->output_section->vma
13636                                     + irel_keeper->sec->output_offset);
13637                       address = (irel_ptr->irel->r_offset
13638                                  + irel_ptr->sec->output_section->vma
13639                                  + irel_ptr->sec->output_offset);
13640                       relocation = relocation - address;
13641
13642                       /* The distance is over ragne, find callee again.  */
13643                       while (irel_keeper && relocation > 1022)
13644                         {
13645                           irel_keeper = irel_keeper->next;
13646                           if (irel_keeper && irel_keeper->keep ==1)
13647                             {
13648                               relocation = (irel_keeper->irel->r_offset
13649                                             + irel_keeper->sec->output_section->vma
13650                                             + irel_keeper->sec->output_offset);
13651                               relocation = relocation - address;
13652                             }
13653                         }
13654
13655                       if (relocation > 1022)
13656                         {
13657                           /* Double check.  */
13658                           irel_keeper = ptr->irel_head;
13659                           while (irel_keeper)
13660                             {
13661                               if (irel_keeper->keep == 1)
13662                                 {
13663
13664                                   relocation = (irel_keeper->irel->r_offset
13665                                                 + irel_keeper->sec->output_section->vma
13666                                                 + irel_keeper->sec->output_offset);
13667                                   relocation = relocation - address;
13668                                 }
13669                               if (relocation <= 1022)
13670                                 break;
13671                               irel_keeper = irel_keeper->next;
13672                             }
13673                           if (!irel_keeper)
13674                             return FALSE;
13675                         }
13676                       if (!nds32_get_section_contents
13677                           (irel_ptr->sec->owner, irel_ptr->sec, &contents, TRUE))
13678                         return FALSE;
13679                       insn16 = INSN_IFCALL9 | (relocation >> 1);
13680                       bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13681                       irel_ptr->irel->r_info =
13682                         ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13683                                       R_NDS32_NONE);
13684                     }
13685                   irel_ptr =irel_ptr->next;
13686                 }
13687             }
13688         }
13689       ptr = ptr->next;
13690     }
13691
13692   return TRUE;
13693 }
13694
13695 /* End of IFC relaxation.  */
13696 \f
13697 /* EX9 Instruction Table Relaxation.  */
13698
13699 /* Global hash list.  */
13700 struct elf_link_hash_entry_list
13701 {
13702   struct elf_link_hash_entry *h;
13703   struct elf_link_hash_entry_list *next;
13704 };
13705
13706 /* Save different destination but same insn.  */
13707 struct elf_link_hash_entry_mul_list
13708 {
13709   /* Global symbol times.  */
13710   int times;
13711   /* Save relocation for each global symbol but useful??  */
13712   Elf_Internal_Rela *irel;
13713   /* For sethi, two sethi may have the same high-part but different low-parts.  */
13714   Elf_Internal_Rela rel_backup;
13715   struct elf_link_hash_entry_list *h_list;
13716   struct elf_link_hash_entry_mul_list *next;
13717 };
13718
13719 /* Instruction hash table.  */
13720 struct elf_nds32_code_hash_entry
13721 {
13722   struct bfd_hash_entry root;
13723   int times;
13724   /* For insn that can use relocation or constant ex: sethi.  */
13725   int const_insn;
13726   asection *sec;
13727   struct elf_link_hash_entry_mul_list *m_list;
13728   /* Using r_addend.  */
13729   Elf_Internal_Rela *irel;
13730   /* Using r_info.  */
13731   Elf_Internal_Rela rel_backup;
13732 };
13733
13734 /* Instruction count list.  */
13735 struct elf_nds32_insn_times_entry
13736 {
13737   const char *string;
13738   int times;
13739   int order;
13740   asection *sec;
13741   struct elf_link_hash_entry_mul_list *m_list;
13742   Elf_Internal_Rela *irel;
13743   Elf_Internal_Rela rel_backup;
13744   struct elf_nds32_insn_times_entry *next;
13745 };
13746
13747 /* J and JAL symbol list.  */
13748 struct elf_nds32_symbol_entry
13749 {
13750   char *string;
13751   unsigned long insn;
13752   struct elf_nds32_symbol_entry *next;
13753 };
13754
13755 /* Relocation list.  */
13756 struct elf_nds32_irel_entry
13757 {
13758   Elf_Internal_Rela *irel;
13759   struct elf_nds32_irel_entry *next;
13760 };
13761
13762 /* ex9.it insn need to be fixed.  */
13763 struct elf_nds32_ex9_refix
13764 {
13765   Elf_Internal_Rela *irel;
13766   asection *sec;
13767   struct elf_link_hash_entry *h;
13768   int order;
13769   struct elf_nds32_ex9_refix *next;
13770 };
13771
13772 static struct bfd_hash_table ex9_code_table;
13773 static struct elf_nds32_insn_times_entry *ex9_insn_head = NULL;
13774 static struct elf_nds32_ex9_refix *ex9_refix_head = NULL;
13775
13776 /* EX9 hash function.  */
13777
13778 static struct bfd_hash_entry *
13779 nds32_elf_code_hash_newfunc (struct bfd_hash_entry *entry,
13780                              struct bfd_hash_table *table,
13781                              const char *string)
13782 {
13783   struct elf_nds32_code_hash_entry *ret;
13784
13785   /* Allocate the structure if it has not already been allocated by a
13786      subclass.  */
13787   if (entry == NULL)
13788     {
13789       entry = (struct bfd_hash_entry *)
13790         bfd_hash_allocate (table, sizeof (*ret));
13791       if (entry == NULL)
13792         return entry;
13793     }
13794
13795   /* Call the allocation method of the superclass.  */
13796   entry = bfd_hash_newfunc (entry, table, string);
13797   if (entry == NULL)
13798     return entry;
13799
13800   ret = (struct elf_nds32_code_hash_entry*) entry;
13801   ret->times = 0;
13802   ret->const_insn = 0;
13803   ret->m_list = NULL;
13804   ret->sec = NULL;
13805   ret->irel = NULL;
13806   return &ret->root;
13807 }
13808
13809 /* Insert ex9 entry
13810    this insert must be stable sorted by times.  */
13811
13812 static void
13813 nds32_elf_ex9_insert_entry (struct elf_nds32_insn_times_entry *ptr)
13814 {
13815   struct elf_nds32_insn_times_entry *temp;
13816   struct elf_nds32_insn_times_entry *temp2;
13817
13818   if (ex9_insn_head == NULL)
13819     {
13820       ex9_insn_head = ptr;
13821       ptr->next = NULL;
13822     }
13823   else
13824     {
13825       temp = ex9_insn_head;
13826       temp2 = ex9_insn_head;
13827       while (temp->next &&
13828              (temp->next->times >= ptr->times
13829               || temp->times == -1))
13830         {
13831           if (temp->times == -1)
13832             temp2 = temp;
13833           temp = temp->next;
13834         }
13835       if (ptr->times > temp->times && temp->times != -1)
13836         {
13837           ptr->next = temp;
13838           if (temp2->times == -1)
13839             temp2->next = ptr;
13840           else
13841             ex9_insn_head = ptr;
13842         }
13843       else if (temp->next == NULL)
13844         {
13845           temp->next = ptr;
13846           ptr->next = NULL;
13847         }
13848       else
13849         {
13850           ptr->next = temp->next;
13851           temp->next = ptr;
13852         }
13853     }
13854 }
13855
13856 /* Examine each insn times in hash table.
13857    Handle multi-link hash entry.
13858
13859    TODO: This function doesn't assign so much info since it is fake.  */
13860
13861 static int
13862 nds32_elf_examine_insn_times (struct elf_nds32_code_hash_entry *h)
13863 {
13864   struct elf_nds32_insn_times_entry *ptr;
13865   int times;
13866
13867   if (h->m_list == NULL)
13868     {
13869       /* Local symbol insn or insn without relocation.  */
13870       if (h->times < 3)
13871         return TRUE;
13872
13873       ptr = (struct elf_nds32_insn_times_entry *)
13874         bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13875       ptr->times = h->times;
13876       ptr->string = h->root.string;
13877       ptr->m_list = NULL;
13878       ptr->sec = h->sec;
13879       ptr->irel = h->irel;
13880       ptr->rel_backup = h->rel_backup;
13881       nds32_elf_ex9_insert_entry (ptr);
13882     }
13883   else
13884     {
13885       /* Global symbol insn.  */
13886       /* Only sethi insn has multiple m_list.  */
13887       struct elf_link_hash_entry_mul_list *m_list = h->m_list;
13888
13889       times = 0;
13890       while (m_list)
13891         {
13892           times += m_list->times;
13893           m_list = m_list->next;
13894         }
13895       if (times >= 3)
13896         {
13897           m_list = h->m_list;
13898           ptr = (struct elf_nds32_insn_times_entry *)
13899             bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13900           ptr->times = times; /* Use the total times.  */
13901           ptr->string = h->root.string;
13902           ptr->m_list = m_list;
13903           ptr->sec = h->sec;
13904           ptr->irel = m_list->irel;
13905           ptr->rel_backup = m_list->rel_backup;
13906           nds32_elf_ex9_insert_entry (ptr);
13907         }
13908       if (h->const_insn == 1)
13909         {
13910           /* sethi with constant value.  */
13911           if (h->times < 3)
13912             return TRUE;
13913
13914           ptr = (struct elf_nds32_insn_times_entry *)
13915             bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13916           ptr->times = h->times;
13917           ptr->string = h->root.string;
13918           ptr->m_list = NULL;
13919           ptr->sec = NULL;
13920           ptr->irel = NULL;
13921           ptr->rel_backup = h->rel_backup;
13922           nds32_elf_ex9_insert_entry (ptr);
13923         }
13924     }
13925   return TRUE;
13926 }
13927
13928 /* Count each insn times in hash table.
13929    Handle multi-link hash entry.  */
13930
13931 static int
13932 nds32_elf_count_insn_times (struct elf_nds32_code_hash_entry *h)
13933 {
13934   int reservation, times;
13935   unsigned long relocation, min_relocation;
13936   struct elf_nds32_insn_times_entry *ptr;
13937
13938   if (h->m_list == NULL)
13939     {
13940       /* Local symbol insn or insn without relocation.  */
13941       if (h->times < 3)
13942         return TRUE;
13943       ptr = (struct elf_nds32_insn_times_entry *)
13944         bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13945       ptr->times = h->times;
13946       ptr->string = h->root.string;
13947       ptr->m_list = NULL;
13948       ptr->sec = h->sec;
13949       ptr->irel = h->irel;
13950       ptr->rel_backup = h->rel_backup;
13951       nds32_elf_ex9_insert_entry (ptr);
13952     }
13953   else
13954     {
13955       /* Global symbol insn.  */
13956       /* Only sethi insn has multiple m_list.  */
13957       struct elf_link_hash_entry_mul_list *m_list = h->m_list;
13958
13959       if (ELF32_R_TYPE (m_list->rel_backup.r_info) == R_NDS32_HI20_RELA
13960           && m_list->next != NULL)
13961         {
13962           /* Sethi insn has different symbol or addend but has same hi20.  */
13963           times = 0;
13964           reservation = 1;
13965           relocation = 0;
13966           min_relocation = 0xffffffff;
13967           while (m_list)
13968             {
13969               /* Get the minimum sethi address
13970                  and calculate how many entry the sethi-list have to use.  */
13971               if ((m_list->h_list->h->root.type == bfd_link_hash_defined
13972                    || m_list->h_list->h->root.type == bfd_link_hash_defweak)
13973                   && (m_list->h_list->h->root.u.def.section != NULL
13974                       && m_list->h_list->h->root.u.def.section->output_section != NULL))
13975                 {
13976                   relocation = (m_list->h_list->h->root.u.def.value +
13977                                 m_list->h_list->h->root.u.def.section->output_section->vma +
13978                                 m_list->h_list->h->root.u.def.section->output_offset);
13979                   relocation += m_list->irel->r_addend;
13980                 }
13981               else
13982                 relocation = 0;
13983               if (relocation < min_relocation)
13984                 min_relocation = relocation;
13985               times += m_list->times;
13986               m_list = m_list->next;
13987             }
13988           if (min_relocation < ex9_relax_size)
13989             reservation = (min_relocation >> 12) + 1;
13990           else
13991             reservation = (min_relocation >> 12)
13992                           - ((min_relocation - ex9_relax_size) >> 12) + 1;
13993           if (reservation < (times / 3))
13994             {
13995               /* Efficient enough to use ex9.  */
13996               int i;
13997
13998               for (i = reservation ; i > 0; i--)
13999                 {
14000                   /* Allocate number of reservation ex9 entry.  */
14001                   ptr = (struct elf_nds32_insn_times_entry *)
14002                     bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
14003                   ptr->times = h->m_list->times / reservation;
14004                   ptr->string = h->root.string;
14005                   ptr->m_list = h->m_list;
14006                   ptr->sec = h->sec;
14007                   ptr->irel = h->m_list->irel;
14008                   ptr->rel_backup = h->m_list->rel_backup;
14009                   nds32_elf_ex9_insert_entry (ptr);
14010                 }
14011             }
14012         }
14013       else
14014         {
14015           /* Normal global symbol that means no different address symbol
14016              using same ex9 entry.  */
14017           if (m_list->times >= 3)
14018             {
14019               ptr = (struct elf_nds32_insn_times_entry *)
14020                 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
14021               ptr->times = m_list->times;
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       if (h->const_insn == 1)
14032         {
14033           /* sethi with constant value.  */
14034           if (h->times < 3)
14035             return TRUE;
14036
14037           ptr = (struct elf_nds32_insn_times_entry *)
14038             bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
14039           ptr->times = h->times;
14040           ptr->string = h->root.string;
14041           ptr->m_list = NULL;
14042           ptr->sec = NULL;
14043           ptr->irel = NULL;
14044           ptr->rel_backup = h->rel_backup;
14045           nds32_elf_ex9_insert_entry (ptr);
14046         }
14047     }
14048
14049   return TRUE;
14050 }
14051
14052 /* Hash table traverse function.  */
14053
14054 static void
14055 nds32_elf_code_hash_traverse (int (*func) (struct elf_nds32_code_hash_entry*))
14056 {
14057   unsigned int i;
14058
14059   ex9_code_table.frozen = 1;
14060   for (i = 0; i < ex9_code_table.size; i++)
14061     {
14062       struct bfd_hash_entry *p;
14063
14064       for (p = ex9_code_table.table[i]; p != NULL; p = p->next)
14065         if (!func ((struct elf_nds32_code_hash_entry *) p))
14066           goto out;
14067     }
14068 out:
14069   ex9_code_table.frozen = 0;
14070 }
14071
14072
14073 /* Give order number to insn list.  */
14074
14075 static void
14076 nds32_elf_order_insn_times (struct bfd_link_info *info)
14077 {
14078   struct elf_nds32_insn_times_entry *ex9_insn;
14079   struct elf_nds32_insn_times_entry *temp = NULL;
14080   struct elf_nds32_link_hash_table *table;
14081   int ex9_limit;
14082   int number = 0;
14083
14084   if (ex9_insn_head == NULL)
14085     return;
14086
14087 /* The max number of entries is 512.  */
14088   ex9_insn = ex9_insn_head;
14089   table = nds32_elf_hash_table (info);
14090   ex9_limit = table->ex9_limit;
14091
14092   ex9_insn = ex9_insn_head;
14093
14094   while (ex9_insn != NULL && number < ex9_limit)
14095     {
14096       ex9_insn->order = number;
14097       number++;
14098       temp = ex9_insn;
14099       ex9_insn = ex9_insn->next;
14100     }
14101
14102   if (ex9_insn && temp)
14103     temp->next = NULL;
14104
14105   while (ex9_insn != NULL)
14106     {
14107       /* Free useless entry.  */
14108       temp = ex9_insn;
14109       ex9_insn = ex9_insn->next;
14110       free (temp);
14111     }
14112 }
14113
14114 /* Build .ex9.itable section.  */
14115
14116 static void
14117 nds32_elf_ex9_build_itable (struct bfd_link_info *link_info)
14118 {
14119   asection *table_sec;
14120   struct elf_nds32_insn_times_entry *ptr;
14121   bfd *it_abfd;
14122   int number = 0;
14123   bfd_byte *contents = NULL;
14124
14125   for (it_abfd = link_info->input_bfds; it_abfd != NULL;
14126        it_abfd = it_abfd->link.next)
14127     {
14128       /* Find the section .ex9.itable, and put all entries into it.  */
14129       table_sec = bfd_get_section_by_name (it_abfd, ".ex9.itable");
14130       if (table_sec != NULL)
14131         {
14132           if (!nds32_get_section_contents (it_abfd, table_sec, &contents, TRUE))
14133             return;
14134
14135           for (ptr = ex9_insn_head; ptr !=NULL ; ptr = ptr->next)
14136             number++;
14137
14138           table_sec->size = number * 4;
14139
14140           if (number == 0)
14141             return;
14142
14143           elf_elfheader (link_info->output_bfd)->e_flags |= E_NDS32_HAS_EX9_INST;
14144           number = 0;
14145           for (ptr = ex9_insn_head; ptr !=NULL ; ptr = ptr->next)
14146             {
14147               long val;
14148
14149               val = strtol (ptr->string, NULL, 16);
14150               bfd_putb32 ((bfd_vma) val, (char *) contents + (number * 4));
14151               number++;
14152             }
14153           break;
14154         }
14155     }
14156 }
14157
14158 /* Get insn with regs according to relocation type.  */
14159
14160 static void
14161 nds32_elf_get_insn_with_reg (Elf_Internal_Rela *irel,
14162                              uint32_t insn, uint32_t *insn_with_reg)
14163 {
14164   reloc_howto_type *howto = NULL;
14165
14166   if (irel == NULL
14167       || (ELF32_R_TYPE (irel->r_info) >= (int) ARRAY_SIZE (nds32_elf_howto_table)
14168           && (ELF32_R_TYPE (irel->r_info) - R_NDS32_RELAX_ENTRY)
14169              >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table)))
14170     {
14171       *insn_with_reg = insn;
14172       return;
14173     }
14174
14175   howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
14176   *insn_with_reg = insn & (0xffffffff ^ howto->dst_mask);
14177 }
14178
14179 /* Mask number of address bits according to relocation.  */
14180
14181 static unsigned long
14182 nds32_elf_irel_mask (Elf_Internal_Rela *irel)
14183 {
14184   reloc_howto_type *howto = NULL;
14185
14186   if (irel == NULL
14187       || (ELF32_R_TYPE (irel->r_info) >= (int) ARRAY_SIZE (nds32_elf_howto_table)
14188           && (ELF32_R_TYPE (irel->r_info) - R_NDS32_RELAX_ENTRY)
14189              >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table)))
14190     return 0;
14191
14192   howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
14193   return howto->dst_mask;
14194 }
14195
14196 static void
14197 nds32_elf_insert_irel_entry (struct elf_nds32_irel_entry **irel_list,
14198                              struct elf_nds32_irel_entry *irel_ptr)
14199 {
14200   if (*irel_list == NULL)
14201     {
14202       *irel_list = irel_ptr;
14203       irel_ptr->next = NULL;
14204     }
14205   else
14206     {
14207       irel_ptr->next = *irel_list;
14208       *irel_list = irel_ptr;
14209     }
14210 }
14211
14212 static void
14213 nds32_elf_ex9_insert_fix (asection * sec, Elf_Internal_Rela * irel,
14214                           struct elf_link_hash_entry *h, int order)
14215 {
14216   struct elf_nds32_ex9_refix *ptr;
14217
14218   ptr = bfd_malloc (sizeof (struct elf_nds32_ex9_refix));
14219   ptr->sec = sec;
14220   ptr->irel = irel;
14221   ptr->h = h;
14222   ptr->order = order;
14223   ptr->next = NULL;
14224
14225   if (ex9_refix_head == NULL)
14226     ex9_refix_head = ptr;
14227   else
14228     {
14229       struct elf_nds32_ex9_refix *temp = ex9_refix_head;
14230
14231       while (temp->next != NULL)
14232         temp = temp->next;
14233       temp->next = ptr;
14234     }
14235 }
14236
14237 enum
14238 {
14239   DATA_EXIST = 1,
14240   CLEAN_PRE = 1 << 1,
14241   PUSH_PRE = 1 << 2
14242 };
14243
14244 /* Check relocation type if supporting for ex9.  */
14245
14246 static int
14247 nds32_elf_ex9_relocation_check (struct bfd_link_info *info,
14248                                 Elf_Internal_Rela **irel,
14249                                 Elf_Internal_Rela *irelend,
14250                                 nds32_elf_blank_t *relax_blank_list,
14251                                 asection *sec,bfd_vma *off,
14252                                 bfd_byte *contents)
14253 {
14254   /* Suppress ex9 if `.no_relax ex9' or inner loop.  */
14255   bfd_boolean nested_ex9, nested_loop;
14256   bfd_boolean ex9_loop_aware;
14257   /* We use the highest 1 byte of result to record
14258      how many bytes location counter has to move.  */
14259   int result = 0;
14260   Elf_Internal_Rela *irel_save = NULL;
14261   struct elf_nds32_link_hash_table *table;
14262
14263   table = nds32_elf_hash_table (info);
14264   ex9_loop_aware = table->ex9_loop_aware;
14265
14266   while ((*irel) != NULL && (*irel) < irelend && *off == (*irel)->r_offset)
14267     {
14268       switch (ELF32_R_TYPE ((*irel)->r_info))
14269         {
14270         case R_NDS32_RELAX_REGION_BEGIN:
14271           /* Ignore code block.  */
14272           nested_ex9 = FALSE;
14273           nested_loop = FALSE;
14274           if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG)
14275               || (ex9_loop_aware
14276                   && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG)))
14277             {
14278               /* Check the region if loop or not.  If it is true and
14279                  ex9-loop-aware is true, ignore the region till region end.  */
14280               /* To save the status for in .no_relax ex9 region and
14281                  loop region to conform the block can do ex9 relaxation.  */
14282               nested_ex9 = ((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG);
14283               nested_loop = (ex9_loop_aware
14284                              && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG));
14285               while ((*irel) && (*irel) < irelend && (nested_ex9 || nested_loop))
14286                 {
14287                   (*irel)++;
14288                   if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_BEGIN)
14289                     {
14290                       /* There may be nested region.  */
14291                       if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG) != 0)
14292                         nested_ex9 = TRUE;
14293                       else if (ex9_loop_aware
14294                                && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))
14295                         nested_loop = TRUE;
14296                     }
14297                   else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_END)
14298                     {
14299                       /* The end of region.  */
14300                       if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG) != 0)
14301                         nested_ex9 = FALSE;
14302                       else if (ex9_loop_aware
14303                                && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))
14304                         nested_loop = FALSE;
14305                     }
14306                   else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_LABEL
14307                            && ((*irel)->r_addend & 0x1f) == 2)
14308                     {
14309                       /* Alignment exist in the region.  */
14310                       result |= CLEAN_PRE;
14311                       if (((*irel)->r_offset -
14312                            get_nds32_elf_blank_total (&relax_blank_list,
14313                                                       (*irel)->r_offset, 0)) & 0x02)
14314                         result |= PUSH_PRE;
14315                     }
14316                 }
14317               if ((*irel) >= irelend)
14318                 *off = sec->size;
14319               else
14320                 *off = (*irel)->r_offset;
14321
14322               /* The final instruction in the region, regard this one as data to ignore it.  */
14323               result |= DATA_EXIST;
14324               return result;
14325             }
14326           break;
14327
14328         case R_NDS32_LABEL:
14329           if (((*irel)->r_addend & 0x1f) == 2)
14330             {
14331               /* Check this point is align and decide to do ex9 or not.  */
14332               result |= CLEAN_PRE;
14333               if (((*irel)->r_offset -
14334                    get_nds32_elf_blank_total (&relax_blank_list,
14335                                               (*irel)->r_offset, 0)) & 0x02)
14336                 result |= PUSH_PRE;
14337             }
14338           break;
14339         case R_NDS32_32_RELA:
14340           /* Data.  */
14341           result |= (4 << 24);
14342           result |= DATA_EXIST;
14343           break;
14344         case R_NDS32_16_RELA:
14345           /* Data.  */
14346           result |= (2 << 24);
14347           result |= DATA_EXIST;
14348           break;
14349         case R_NDS32_DATA:
14350           /* Data.  */
14351           /* The least code alignment is 2.  If the data is only one byte,
14352              we have to shift one more byte.  */
14353           if ((*irel)->r_addend == 1)
14354             result |= ((*irel)->r_addend << 25) ;
14355           else
14356             result |= ((*irel)->r_addend << 24) ;
14357
14358           result |= DATA_EXIST;
14359           break;
14360
14361         case R_NDS32_25_PCREL_RELA:
14362         case R_NDS32_SDA16S3_RELA:
14363         case R_NDS32_SDA15S3_RELA:
14364         case R_NDS32_SDA15S3:
14365         case R_NDS32_SDA17S2_RELA:
14366         case R_NDS32_SDA15S2_RELA:
14367         case R_NDS32_SDA12S2_SP_RELA:
14368         case R_NDS32_SDA12S2_DP_RELA:
14369         case R_NDS32_SDA15S2:
14370         case R_NDS32_SDA18S1_RELA:
14371         case R_NDS32_SDA15S1_RELA:
14372         case R_NDS32_SDA15S1:
14373         case R_NDS32_SDA19S0_RELA:
14374         case R_NDS32_SDA15S0_RELA:
14375         case R_NDS32_SDA15S0:
14376         case R_NDS32_HI20_RELA:
14377         case R_NDS32_LO12S0_ORI_RELA:
14378         case R_NDS32_LO12S0_RELA:
14379         case R_NDS32_LO12S1_RELA:
14380         case R_NDS32_LO12S2_RELA:
14381           /* These relocation is supported ex9 relaxation currently.  */
14382           /* We have to save the relocation for using later, since we have
14383              to check there is any alignment in the same address.  */
14384           irel_save = *irel;
14385           break;
14386         default:
14387           /* Not support relocations.  */
14388           if (ELF32_R_TYPE ((*irel)->r_info) < ARRAY_SIZE (nds32_elf_howto_table)
14389               && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_NONE
14390               && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_INSN16)
14391             {
14392               /* Note: To optimize aggressively, it maybe can ignore R_NDS32_INSN16 here.
14393                  But we have to consider if there is any side-effect.  */
14394               if (!(result & DATA_EXIST))
14395                 {
14396                   /* We have to confirm there is no data relocation in the
14397                      same address.  In general case, this won't happen.  */
14398                   /* We have to do ex9 conservative, for those relocation not
14399                      considerd we ignore instruction.  */
14400                   result |= DATA_EXIST;
14401                   if (*(contents + *off) & 0x80)
14402                     result |= (2 << 24);
14403                   else
14404                     result |= (4 << 24);
14405                   break;
14406                 }
14407             }
14408         }
14409       if ((*irel) < irelend
14410           && ((*irel) + 1) < irelend
14411           && (*irel)->r_offset == ((*irel) + 1)->r_offset)
14412         /* There are relocations pointing to the same address, we have to
14413            check all of them.  */
14414         (*irel)++;
14415       else
14416         {
14417           if (irel_save)
14418             *irel = irel_save;
14419           return result;
14420         }
14421     }
14422   return result;
14423 }
14424
14425 /* Replace with ex9 instruction.  */
14426
14427 static bfd_boolean
14428 nds32_elf_ex9_push_insn (uint16_t insn16, bfd_byte *contents, bfd_vma pre_off,
14429                          nds32_elf_blank_t **relax_blank_list,
14430                          struct elf_nds32_irel_entry *pre_irel_ptr,
14431                          struct elf_nds32_irel_entry **irel_list)
14432 {
14433   if (insn16 != 0)
14434     {
14435       /* Implement the ex9 relaxation.  */
14436       bfd_putb16 (insn16, contents + pre_off);
14437       if (!insert_nds32_elf_blank_recalc_total (relax_blank_list,
14438                                                 pre_off + 2, 2))
14439         return FALSE;
14440       if (pre_irel_ptr != NULL)
14441         nds32_elf_insert_irel_entry (irel_list, pre_irel_ptr);
14442     }
14443   return TRUE;
14444 }
14445
14446 /* Replace input file instruction which is in ex9 itable.  */
14447
14448 static bfd_boolean
14449 nds32_elf_ex9_replace_instruction (struct bfd_link_info *info, bfd *abfd, asection *sec)
14450 {
14451   struct elf_nds32_insn_times_entry *ex9_insn = ex9_insn_head;
14452   bfd_byte *contents = NULL;
14453   bfd_vma off;
14454   uint16_t insn16, insn_ex9;
14455   /* `pre_*' are used to track previous instruction that can use ex9.it.  */
14456   bfd_vma pre_off = -1;
14457   uint16_t pre_insn16 = 0;
14458   struct elf_nds32_irel_entry *pre_irel_ptr = NULL;
14459   Elf_Internal_Rela *internal_relocs;
14460   Elf_Internal_Rela *irel;
14461   Elf_Internal_Rela *irelend;
14462   Elf_Internal_Shdr *symtab_hdr;
14463   Elf_Internal_Sym *isym = NULL;
14464   nds32_elf_blank_t *relax_blank_list = NULL;
14465   uint32_t insn = 0;
14466   uint32_t insn_with_reg = 0;
14467   uint32_t it_insn;
14468   uint32_t it_insn_with_reg;
14469   unsigned long r_symndx;
14470   asection *isec;
14471   struct elf_nds32_irel_entry *irel_list = NULL;
14472   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
14473   int data_flag, do_replace, save_irel;
14474   struct elf_link_hash_entry_list *h_list;
14475
14476
14477   /* Load section instructions, relocations, and symbol table.  */
14478   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
14479       || !nds32_get_local_syms (abfd, sec, &isym))
14480     return FALSE;
14481   internal_relocs =
14482     _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, TRUE /* keep_memory */);
14483   irelend = internal_relocs + sec->reloc_count;
14484   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
14485
14486   off = 0;
14487
14488   /* Check if the object enable ex9.  */
14489   irel = find_relocs_at_address (internal_relocs, internal_relocs,
14490                                  irelend, R_NDS32_RELAX_ENTRY);
14491
14492   /* Check this section trigger ex9 relaxation.  */
14493   if (irel == NULL
14494       || irel >= irelend
14495       || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
14496       || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
14497           && !(irel->r_addend & R_NDS32_RELAX_ENTRY_EX9_FLAG)))
14498     return TRUE;
14499
14500   irel = internal_relocs;
14501
14502   /* Check alignment and fetch proper relocation.  */
14503   while (off < sec->size)
14504     {
14505       struct elf_link_hash_entry *h = NULL;
14506       struct elf_nds32_irel_entry *irel_ptr = NULL;
14507
14508       /* Syn the instruction and the relocation.  */
14509       while (irel != NULL && irel < irelend && irel->r_offset < off)
14510         irel++;
14511
14512       data_flag = nds32_elf_ex9_relocation_check (info, &irel, irelend,
14513                                                   relax_blank_list, sec,
14514                                                   &off, contents);
14515       if (data_flag & PUSH_PRE)
14516         if (!nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
14517                                       &relax_blank_list, pre_irel_ptr,
14518                                       &irel_list))
14519           return FALSE;
14520
14521       if (data_flag & CLEAN_PRE)
14522         {
14523           pre_off = 0;
14524           pre_insn16 = 0;
14525           pre_irel_ptr = NULL;
14526         }
14527       if (data_flag & DATA_EXIST)
14528         {
14529           /* We save the move offset in the highest byte.  */
14530           off += (data_flag >> 24);
14531           continue;
14532         }
14533
14534       if (*(contents + off) & 0x80)
14535         {
14536           /* 2-byte instruction.  */
14537           off += 2;
14538           continue;
14539         }
14540
14541       /* Load the instruction and its opcode with register for comparing.  */
14542       ex9_insn = ex9_insn_head;
14543       insn = bfd_getb32 (contents + off);
14544       insn_with_reg = 0;
14545       while (ex9_insn)
14546         {
14547           it_insn = strtol (ex9_insn->string, NULL, 16);
14548           it_insn_with_reg = 0;
14549           do_replace = 0;
14550           save_irel = 0;
14551
14552           if (irel != NULL && irel < irelend && irel->r_offset == off)
14553             {
14554               /* Insn with relocation.  */
14555               nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
14556
14557               if (ex9_insn->irel != NULL)
14558                 nds32_elf_get_insn_with_reg (ex9_insn->irel, it_insn,
14559                                              &it_insn_with_reg);
14560
14561               if (ex9_insn->irel != NULL
14562                   && (ELF32_R_TYPE (irel->r_info) ==
14563                       ELF32_R_TYPE (ex9_insn->irel->r_info))
14564                   && (insn_with_reg == it_insn_with_reg))
14565                 {
14566                   /* Insn relocation and format is the same as table entry.  */
14567
14568                   if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA
14569                       || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_ORI_RELA
14570                       || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_RELA
14571                       || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S1_RELA
14572                       || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_RELA
14573                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
14574                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
14575                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
14576                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
14577                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
14578                           && ELF32_R_TYPE (irel->r_info) <=
14579                           R_NDS32_SDA12S2_SP_RELA)
14580                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
14581                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))
14582                     {
14583                       r_symndx = ELF32_R_SYM (irel->r_info);
14584                       if (r_symndx < symtab_hdr->sh_info)
14585                         {
14586                           /* Local symbol.  */
14587                           int shndx = isym[r_symndx].st_shndx;
14588
14589                           isec = elf_elfsections (abfd)[shndx]->bfd_section;
14590                           if (ex9_insn->sec == isec
14591                               && ex9_insn->irel->r_addend == irel->r_addend
14592                               && ex9_insn->irel->r_info == irel->r_info)
14593                             {
14594                               do_replace = 1;
14595                               save_irel = 1;
14596                             }
14597                         }
14598                       else
14599                         {
14600                           /* External symbol.  */
14601                           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
14602                           if (ex9_insn->m_list)
14603                             {
14604                               h_list = ex9_insn->m_list->h_list;
14605                               while (h_list)
14606                                 {
14607                                   if (h == h_list->h
14608                                       && (ex9_insn->m_list->irel->r_addend ==
14609                                           irel->r_addend))
14610                                     {
14611                                       do_replace = 1;
14612                                       save_irel = 1;
14613                                       break;
14614                                     }
14615                                   h_list = h_list->next;
14616                                 }
14617                             }
14618                         }
14619                     }
14620                   else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_HI20_RELA)
14621                     {
14622                       r_symndx = ELF32_R_SYM (irel->r_info);
14623                       if (r_symndx < symtab_hdr->sh_info)
14624                         {
14625                           /* Local symbols.  Compare its base symbol and offset.  */
14626                           int shndx = isym[r_symndx].st_shndx;
14627
14628                           isec = elf_elfsections (abfd)[shndx]->bfd_section;
14629                           if (ex9_insn->sec == isec
14630                               && ex9_insn->irel->r_addend == irel->r_addend
14631                               && ex9_insn->irel->r_info == irel->r_info)
14632                             {
14633                               do_replace = 1;
14634                               save_irel = 1;
14635                             }
14636                         }
14637                       else
14638                         {
14639                           /* External symbol.  */
14640                           struct elf_link_hash_entry_mul_list *m_list;
14641
14642                           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
14643                           m_list = ex9_insn->m_list;
14644
14645                           while (m_list)
14646                             {
14647                               h_list = m_list->h_list;
14648
14649                               while (h_list)
14650                                 {
14651                                   if (h == h_list->h
14652                                       && (m_list->irel->r_addend
14653                                           == irel->r_addend))
14654                                     {
14655                                       do_replace = 1;
14656                                       save_irel = 1;
14657                                       if (ex9_insn->next
14658                                           && ex9_insn->m_list
14659                                           && ex9_insn->m_list == ex9_insn->next->m_list)
14660                                         {
14661                                           /* sethi multiple entry must be fixed */
14662                                           nds32_elf_ex9_insert_fix (sec, irel,
14663                                                                     h, ex9_insn->order);
14664                                         }
14665                                       break;
14666                                     }
14667                                   h_list = h_list->next;
14668                                 }
14669                               m_list = m_list->next;
14670                             }
14671                         }
14672                     }
14673                 }
14674
14675               /* Import table: Check the symbol hash table and the
14676                  jump target.  Only R_NDS32_25_PCREL_RELA now.  */
14677               else if (ex9_insn->times == -1
14678                        && ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA)
14679                 {
14680                   nds32_elf_get_insn_with_reg (irel, it_insn, &it_insn_with_reg);
14681                   if (insn_with_reg == it_insn_with_reg)
14682                     {
14683                       char code[10];
14684                       bfd_vma relocation;
14685
14686                       r_symndx = ELF32_R_SYM (irel->r_info);
14687                       if (r_symndx >= symtab_hdr->sh_info)
14688                         {
14689                           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
14690                           if ((h->root.type == bfd_link_hash_defined
14691                                || h->root.type == bfd_link_hash_defweak)
14692                               && h->root.u.def.section != NULL
14693                               && h->root.u.def.section->output_section != NULL
14694                               && h->root.u.def.section->gc_mark == 1
14695                               && bfd_is_abs_section (h->root.u.def.section)
14696                               && h->root.u.def.value > sec->size)
14697                             {
14698                               relocation = h->root.u.def.value +
14699                                 h->root.u.def.section->output_section->vma +
14700                                 h->root.u.def.section->output_offset;
14701                               relocation += irel->r_addend;
14702                               insn = insn_with_reg
14703                                 | ((relocation >> 1) & 0xffffff);
14704                               snprintf (code, sizeof (code), "%08x", insn);
14705                               if (strcmp (code, ex9_insn->string) == 0)
14706                                 {
14707                                   do_replace = 1;
14708                                   save_irel = 1;
14709                                 }
14710                             }
14711                         }
14712                     }
14713                 }
14714               else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
14715                        || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
14716                        || ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
14717                 {
14718                   /* These relocations do not have to relocate contens, so it can
14719                      be regard as instruction without relocation.  */
14720                   if (insn == it_insn && ex9_insn->irel == NULL)
14721                     do_replace = 1;
14722                 }
14723             }
14724           else
14725             {
14726               /* Instruction without relocation, we only
14727                  have to compare their byte code.  */
14728               if (insn == it_insn && ex9_insn->irel == NULL)
14729                 do_replace = 1;
14730             }
14731
14732           /* Insntruction match so replacing the code here.  */
14733           if (do_replace == 1)
14734             {
14735               /* There are two formats of ex9 instruction.  */
14736               if (ex9_insn->order < 32)
14737                 insn_ex9 = INSN_EX9_IT_2;
14738               else
14739                 insn_ex9 = INSN_EX9_IT_1;
14740               insn16 = insn_ex9 | ex9_insn->order;
14741
14742               /* Insert ex9 instruction.  */
14743               nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
14744                                        &relax_blank_list, pre_irel_ptr,
14745                                        &irel_list);
14746               pre_off = off;
14747               pre_insn16 = insn16;
14748
14749               if (save_irel)
14750                 {
14751                   /* For instuction with relocation do relax.  */
14752                   irel_ptr = (struct elf_nds32_irel_entry *)
14753                     bfd_malloc (sizeof (struct elf_nds32_irel_entry));
14754                   irel_ptr->irel = irel;
14755                   irel_ptr->next = NULL;
14756                   pre_irel_ptr = irel_ptr;
14757                 }
14758               else
14759                 pre_irel_ptr = NULL;
14760               break;
14761             }
14762           ex9_insn = ex9_insn->next;
14763         }
14764       off += 4;
14765     }
14766
14767   /* Insert ex9 instruction.  */
14768   nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
14769                            &relax_blank_list, pre_irel_ptr,
14770                            &irel_list);
14771
14772   /* Delete the redundant code.  */
14773   if (relax_blank_list)
14774     {
14775       nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
14776       relax_blank_list = NULL;
14777     }
14778
14779   /* Clear the relocation that is replaced by ex9.  */
14780   while (irel_list)
14781     {
14782       struct elf_nds32_irel_entry *irel_ptr;
14783
14784       irel_ptr = irel_list;
14785       irel_list = irel_ptr->next;
14786       irel_ptr->irel->r_info =
14787         ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info), R_NDS32_TRAN);
14788       free (irel_ptr);
14789     }
14790   return TRUE;
14791 }
14792
14793 /* Initialize ex9 hash table.  */
14794
14795 int
14796 nds32_elf_ex9_init (void)
14797 {
14798   if (!bfd_hash_table_init_n (&ex9_code_table, nds32_elf_code_hash_newfunc,
14799                               sizeof (struct elf_nds32_code_hash_entry),
14800                               1023))
14801     {
14802       _bfd_error_handler (_("Linker: cannot init ex9 hash table error \n"));
14803       return FALSE;
14804     }
14805   return TRUE;
14806 }
14807
14808 /* Predict how many bytes will be relaxed with ex9 and ifc.  */
14809
14810 static void
14811 nds32_elf_ex9_total_relax (struct bfd_link_info *info)
14812 {
14813   struct elf_nds32_insn_times_entry *ex9_insn;
14814   struct elf_nds32_insn_times_entry *temp;
14815   int target_optimize;
14816   struct elf_nds32_link_hash_table *table;
14817
14818   if (ex9_insn_head == NULL)
14819     return;
14820
14821   table = nds32_elf_hash_table (info);
14822   target_optimize  = table->target_optimize;
14823   ex9_insn = ex9_insn_head;
14824   while (ex9_insn)
14825     {
14826       ex9_relax_size = ex9_insn->times * 2 + ex9_relax_size;
14827       temp = ex9_insn;
14828       ex9_insn = ex9_insn->next;
14829       free (temp);
14830     }
14831   ex9_insn_head = NULL;
14832
14833   if ((target_optimize & NDS32_RELAX_JUMP_IFC_ON))
14834     {
14835       /* Examine ifc reduce size.  */
14836       struct elf_nds32_ifc_symbol_entry *ifc_ent = ifc_symbol_head;
14837       struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
14838       int size = 0;
14839
14840       while (ifc_ent)
14841         {
14842           if (ifc_ent->enable == 0)
14843             {
14844               /* Not ifc yet.  */
14845               irel_ptr = ifc_ent->irel_head;
14846               while (irel_ptr)
14847                 {
14848                   size += 2;
14849                   irel_ptr = irel_ptr->next;
14850                 }
14851             }
14852           size -= 2;
14853           ifc_ent = ifc_ent->next;
14854         }
14855       ex9_relax_size += size;
14856     }
14857 }
14858
14859 /* Finish ex9 table.  */
14860
14861 void
14862 nds32_elf_ex9_finish (struct bfd_link_info *link_info)
14863 {
14864   nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times);
14865   nds32_elf_order_insn_times (link_info);
14866   nds32_elf_ex9_total_relax (link_info);
14867   /* Traverse the hash table and count its times.  */
14868   nds32_elf_code_hash_traverse (nds32_elf_count_insn_times);
14869   nds32_elf_order_insn_times (link_info);
14870   nds32_elf_ex9_build_itable (link_info);
14871 }
14872
14873 /* Relocate the entries in ex9 table.  */
14874
14875 static bfd_vma
14876 nds32_elf_ex9_reloc_insn (struct elf_nds32_insn_times_entry *ptr,
14877                           struct bfd_link_info *link_info)
14878 {
14879   Elf_Internal_Sym *isym = NULL;
14880   bfd_vma relocation = -1;
14881   struct elf_link_hash_entry *h;
14882
14883   if (ptr->m_list != NULL)
14884     {
14885       /* Global symbol.  */
14886       h = ptr->m_list->h_list->h;
14887       if ((h->root.type == bfd_link_hash_defined
14888            || h->root.type == bfd_link_hash_defweak)
14889           && h->root.u.def.section != NULL
14890           && h->root.u.def.section->output_section != NULL)
14891         {
14892
14893           relocation = h->root.u.def.value +
14894             h->root.u.def.section->output_section->vma +
14895             h->root.u.def.section->output_offset;
14896           relocation += ptr->m_list->irel->r_addend;
14897         }
14898       else
14899         relocation = 0;
14900     }
14901   else if (ptr->sec !=NULL)
14902     {
14903       /* Local symbol.  */
14904       Elf_Internal_Sym sym;
14905       asection *sec = NULL;
14906       asection isec;
14907       asection *isec_ptr = &isec;
14908       Elf_Internal_Rela irel_backup = *(ptr->irel);
14909       asection *sec_backup = ptr->sec;
14910       bfd *abfd = ptr->sec->owner;
14911
14912       if (!nds32_get_local_syms (abfd, sec, &isym))
14913         return FALSE;
14914       isym = isym + ELF32_R_SYM (ptr->irel->r_info);
14915
14916       sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
14917       if (sec != NULL)
14918         *isec_ptr = *sec;
14919       sym = *isym;
14920
14921       /* The purpose is same as elf_link_input_bfd.  */
14922       if (isec_ptr != NULL
14923           && isec_ptr->sec_info_type == SEC_INFO_TYPE_MERGE
14924           && ELF_ST_TYPE (isym->st_info) != STT_SECTION)
14925         {
14926           sym.st_value =
14927             _bfd_merged_section_offset (ptr->sec->output_section->owner, &isec_ptr,
14928                                         elf_section_data (isec_ptr)->sec_info,
14929                                         isym->st_value);
14930         }
14931       relocation = _bfd_elf_rela_local_sym (link_info->output_bfd, &sym,
14932                                             &ptr->sec, ptr->irel);
14933       if (ptr->irel != NULL)
14934         relocation += ptr->irel->r_addend;
14935
14936       /* Restore origin value since there may be some insntructions that
14937          could not be replaced with ex9.it.  */
14938       *(ptr->irel) = irel_backup;
14939       ptr->sec = sec_backup;
14940     }
14941
14942   return relocation;
14943 }
14944
14945 /* Import ex9 table and build list.  */
14946
14947 void
14948 nds32_elf_ex9_import_table (struct bfd_link_info *info)
14949 {
14950   int num = 0;
14951   bfd_byte *contents;
14952   unsigned long insn;
14953   FILE *ex9_import_file;
14954   int update_ex9_table;
14955   struct elf_nds32_link_hash_table *table;
14956
14957   table = nds32_elf_hash_table (info);
14958   ex9_import_file = table->ex9_import_file;
14959   rewind (table->ex9_import_file);
14960
14961   contents = bfd_malloc (sizeof (bfd_byte) * 4);
14962
14963   /* Read instructions from the input file and build the list.  */
14964   while (!feof (ex9_import_file))
14965     {
14966       char *code;
14967       struct elf_nds32_insn_times_entry *ptr;
14968       size_t nread;
14969
14970       nread = fread (contents, sizeof (bfd_byte) * 4, 1, ex9_import_file);
14971       /* Ignore the final byte 0x0a.  */
14972       if (nread < 1)
14973         break;
14974       insn = bfd_getb32 (contents);
14975       code = bfd_malloc (sizeof (char) * 9);
14976       snprintf (code, 9, "%08lx", insn);
14977       ptr = bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
14978       ptr->string = code;
14979       ptr->order = num;
14980       ptr->times = -1;
14981       ptr->sec = NULL;
14982       ptr->m_list = NULL;
14983       ptr->rel_backup.r_offset = 0;
14984       ptr->rel_backup.r_info = 0;
14985       ptr->rel_backup.r_addend = 0;
14986       ptr->irel = NULL;
14987       ptr->next = NULL;
14988       nds32_elf_ex9_insert_entry (ptr);
14989       num++;
14990     }
14991
14992   update_ex9_table = table->update_ex9_table;
14993   if (update_ex9_table == 1)
14994     {
14995       /* It has to consider of sethi need to use multiple page
14996          but it not be done yet.  */
14997       nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times);
14998       nds32_elf_order_insn_times (info);
14999     }
15000 }
15001
15002 /* Export ex9 table.  */
15003
15004 static void
15005 nds32_elf_ex9_export (struct bfd_link_info *info,
15006                       bfd_byte *contents, int size)
15007 {
15008   FILE *ex9_export_file;
15009   struct elf_nds32_link_hash_table *table;
15010
15011   table = nds32_elf_hash_table (info);
15012   ex9_export_file = table->ex9_export_file;
15013   fwrite (contents, sizeof (bfd_byte), size, ex9_export_file);
15014   fclose (ex9_export_file);
15015 }
15016
15017 /* Adjust relocations of J and JAL in ex9.itable.
15018    Export ex9 table.  */
15019
15020 static void
15021 nds32_elf_ex9_reloc_jmp (struct bfd_link_info *link_info)
15022 {
15023   asection *table_sec = NULL;
15024   struct elf_nds32_insn_times_entry *ex9_insn = ex9_insn_head;
15025   struct elf_nds32_insn_times_entry *temp_ptr, *temp_ptr2;
15026   bfd *it_abfd;
15027   uint32_t insn, insn_with_reg, source_insn;
15028   bfd_byte *contents = NULL, *source_contents = NULL;
15029   int size = 0;
15030   bfd_vma gp;
15031   int shift, update_ex9_table, offset = 0;
15032   reloc_howto_type *howto = NULL;
15033   Elf_Internal_Rela rel_backup;
15034   unsigned short insn_ex9;
15035   struct elf_nds32_link_hash_table *table;
15036   FILE *ex9_export_file;
15037   static bfd_boolean done = FALSE;
15038
15039   if (done)
15040     return;
15041
15042   done = TRUE;
15043
15044   table = nds32_elf_hash_table (link_info);
15045   if (table)
15046     table->relax_status |= NDS32_RELAX_EX9_DONE;
15047
15048
15049   update_ex9_table = table->update_ex9_table;
15050   /* Generated ex9.itable exactly.  */
15051   if (update_ex9_table == 0)
15052     {
15053       for (it_abfd = link_info->input_bfds; it_abfd != NULL;
15054            it_abfd = it_abfd->link.next)
15055         {
15056           table_sec = bfd_get_section_by_name (it_abfd, ".ex9.itable");
15057           if (table_sec != NULL)
15058             break;
15059         }
15060
15061       if (table_sec != NULL)
15062         {
15063           bfd *output_bfd;
15064
15065           output_bfd = table_sec->output_section->owner;
15066           nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
15067           if (table_sec->size == 0)
15068             return;
15069
15070           if (!nds32_get_section_contents (it_abfd, table_sec, &contents, TRUE))
15071             return;
15072         }
15073     }
15074   else
15075     {
15076       /* Set gp.  */
15077       bfd *output_bfd;
15078
15079       output_bfd = link_info->input_bfds->sections->output_section->owner;
15080       nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
15081       contents = bfd_malloc (sizeof (bfd_byte) * 2048);
15082     }
15083
15084   /* Relocate instruction.  */
15085   while (ex9_insn)
15086     {
15087       bfd_vma relocation, min_relocation = 0xffffffff;
15088
15089       insn = strtol (ex9_insn->string, NULL, 16);
15090       insn_with_reg = 0;
15091       if (ex9_insn->m_list != NULL || ex9_insn->sec != NULL)
15092         {
15093           if (ex9_insn->m_list)
15094             rel_backup = ex9_insn->m_list->rel_backup;
15095           else
15096             rel_backup = ex9_insn->rel_backup;
15097
15098           nds32_elf_get_insn_with_reg (&rel_backup, insn, &insn_with_reg);
15099           howto =
15100             bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE
15101                                                    (rel_backup.r_info));
15102           shift = howto->rightshift;
15103           if (ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_25_PCREL_RELA
15104               || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S0_ORI_RELA
15105               || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S0_RELA
15106               || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S1_RELA
15107               || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S2_RELA)
15108             {
15109               relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
15110               insn =
15111                 insn_with_reg | ((relocation >> shift) &
15112                                  nds32_elf_irel_mask (&rel_backup));
15113               bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15114             }
15115           else if ((ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA15S3
15116                     && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA15S0)
15117                    || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA15S3_RELA
15118                        && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA15S0_RELA)
15119                    || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA12S2_DP_RELA
15120                        && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA12S2_SP_RELA)
15121                    || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA16S3_RELA
15122                        && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA19S0_RELA))
15123             {
15124               relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
15125               insn =
15126                 insn_with_reg | (((relocation - gp) >> shift) &
15127                                  nds32_elf_irel_mask (&rel_backup));
15128               bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15129             }
15130           else if (ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_HI20_RELA)
15131             {
15132               /* Sethi may be multiple entry for one insn.  */
15133               if (ex9_insn->next && ex9_insn->m_list
15134                   && ex9_insn->m_list == ex9_insn->next->m_list)
15135                 {
15136                   struct elf_link_hash_entry_mul_list *m_list;
15137                   struct elf_nds32_ex9_refix *fix_ptr;
15138                   struct elf_link_hash_entry *h;
15139
15140                   temp_ptr = ex9_insn;
15141                   temp_ptr2 = ex9_insn;
15142                   m_list = ex9_insn->m_list;
15143                   while (m_list)
15144                     {
15145                       h = m_list->h_list->h;
15146                       relocation = h->root.u.def.value +
15147                         h->root.u.def.section->output_section->vma +
15148                         h->root.u.def.section->output_offset;
15149                       relocation += m_list->irel->r_addend;
15150
15151                       if (relocation < min_relocation)
15152                         min_relocation = relocation;
15153                       m_list = m_list->next;
15154                     }
15155                   relocation = min_relocation;
15156
15157                   /* Put insntruction into ex9 table.  */
15158                   insn = insn_with_reg
15159                     | ((relocation >> shift) & nds32_elf_irel_mask (&rel_backup));
15160                   bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15161                   relocation = relocation + 0x1000;     /* hi20 */
15162
15163                   while (ex9_insn->next && ex9_insn->m_list
15164                          && ex9_insn->m_list == ex9_insn->next->m_list)
15165                     {
15166                       /* Multiple sethi.  */
15167                       ex9_insn = ex9_insn->next;
15168                       size += 4;
15169                       insn =
15170                         insn_with_reg | ((relocation >> shift) &
15171                                          nds32_elf_irel_mask (&rel_backup));
15172                       bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15173                       relocation = relocation + 0x1000; /* hi20 */
15174                     }
15175
15176                   fix_ptr = ex9_refix_head;
15177                   while (fix_ptr)
15178                     {
15179                       /* Fix ex9 insn.  */
15180                       /* temp_ptr2 points to the head of multiple sethi.  */
15181                       temp_ptr = temp_ptr2;
15182                       while (fix_ptr->order != temp_ptr->order && fix_ptr->next)
15183                         {
15184                           fix_ptr = fix_ptr->next;
15185                         }
15186                       if (fix_ptr->order != temp_ptr->order)
15187                         break;
15188
15189                       /* Set source insn.  */
15190                       relocation =
15191                         fix_ptr->h->root.u.def.value +
15192                         fix_ptr->h->root.u.def.section->output_section->vma +
15193                         fix_ptr->h->root.u.def.section->output_offset;
15194                       relocation += fix_ptr->irel->r_addend;
15195                       /* sethi imm is imm20s.  */
15196                       source_insn = insn_with_reg | ((relocation >> shift) & 0xfffff);
15197
15198                       while (temp_ptr)
15199                         {
15200                           /* Match entry and source code.  */
15201                           insn = bfd_getb32 (contents + (temp_ptr->order) * 4 + offset);
15202                           if (insn == source_insn)
15203                             {
15204                               /* Fix the ex9 insn.  */
15205                               if (temp_ptr->order != fix_ptr->order)
15206                                 {
15207                                   if (!nds32_get_section_contents
15208                                          (fix_ptr->sec->owner, fix_ptr->sec,
15209                                           &source_contents, TRUE))
15210                                     _bfd_error_handler
15211                                       (_("Linker: error cannot fixed ex9 relocation \n"));
15212                                   if (temp_ptr->order < 32)
15213                                     insn_ex9 = INSN_EX9_IT_2;
15214                                   else
15215                                     insn_ex9 = INSN_EX9_IT_1;
15216                                   insn_ex9 = insn_ex9 | temp_ptr->order;
15217                                   bfd_putb16 (insn_ex9, source_contents + fix_ptr->irel->r_offset);
15218                                 }
15219                                 break;
15220                             }
15221                           else
15222                             {
15223                               if (!temp_ptr->next || temp_ptr->m_list != temp_ptr->next->m_list)
15224                                 _bfd_error_handler
15225                                   (_("Linker: error cannot fixed ex9 relocation \n"));
15226                               else
15227                                 temp_ptr = temp_ptr->next;
15228                             }
15229                         }
15230                       fix_ptr = fix_ptr->next;
15231                     }
15232                 }
15233               else
15234                 {
15235                   relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
15236                   insn = insn_with_reg
15237                          | ((relocation >> shift) & nds32_elf_irel_mask (&rel_backup));
15238                   bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15239                 }
15240             }
15241         }
15242       else
15243         {
15244           /* Insn without relocation does not have to be fixed
15245              if need to update export table.  */
15246           if (update_ex9_table == 1)
15247             bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15248         }
15249       ex9_insn = ex9_insn->next;
15250       size += 4;
15251     }
15252
15253   ex9_export_file = table->ex9_export_file;
15254   if (ex9_export_file != NULL)
15255     nds32_elf_ex9_export (link_info, contents, table_sec->size);
15256   else if (update_ex9_table == 1)
15257     {
15258       table->ex9_export_file = table->ex9_import_file;
15259       rewind (table->ex9_export_file);
15260       nds32_elf_ex9_export (link_info, contents, size);
15261     }
15262 }
15263
15264 /* Generate ex9 hash table.  */
15265
15266 static bfd_boolean
15267 nds32_elf_ex9_build_hash_table (bfd *abfd, asection *sec,
15268                                 struct bfd_link_info *link_info)
15269 {
15270   Elf_Internal_Rela *internal_relocs;
15271   Elf_Internal_Rela *irelend;
15272   Elf_Internal_Rela *irel;
15273   Elf_Internal_Rela *jrel;
15274   Elf_Internal_Rela rel_backup;
15275   Elf_Internal_Shdr *symtab_hdr;
15276   Elf_Internal_Sym *isym = NULL;
15277   asection *isec;
15278   struct elf_link_hash_entry **sym_hashes;
15279   bfd_byte *contents = NULL;
15280   bfd_vma off = 0;
15281   unsigned long r_symndx;
15282   uint32_t insn, insn_with_reg;
15283   struct elf_link_hash_entry *h;
15284   int data_flag, shift, align;
15285   bfd_vma relocation;
15286   /* Suppress ex9 if `.no_relax ex9' or inner loop.  */
15287   reloc_howto_type *howto = NULL;
15288
15289   sym_hashes = elf_sym_hashes (abfd);
15290   /* Load section instructions, relocations, and symbol table.  */
15291   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
15292     return FALSE;
15293
15294   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
15295                                                TRUE /* keep_memory */);
15296   irelend = internal_relocs + sec->reloc_count;
15297   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
15298   if (!nds32_get_local_syms (abfd, sec, &isym))
15299     return FALSE;
15300
15301   /* Check the object if enable ex9.  */
15302   irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend,
15303                                  R_NDS32_RELAX_ENTRY);
15304
15305   /* Check this section trigger ex9 relaxation.  */
15306   if (irel == NULL
15307       || irel >= irelend
15308       || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
15309       || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
15310           && !(irel->r_addend & R_NDS32_RELAX_ENTRY_EX9_FLAG)))
15311     return TRUE;
15312
15313   irel = internal_relocs;
15314
15315   /* Push each insn into hash table.  */
15316   while (off < sec->size)
15317     {
15318       char code[10];
15319       struct elf_nds32_code_hash_entry *entry;
15320
15321       while (irel != NULL && irel < irelend && irel->r_offset < off)
15322         irel++;
15323
15324       data_flag = nds32_elf_ex9_relocation_check (link_info, &irel, irelend,
15325                                                   NULL, sec, &off, contents);
15326       if (data_flag & DATA_EXIST)
15327         {
15328           /* We save the move offset in the highest byte.  */
15329           off += (data_flag >> 24);
15330           continue;
15331         }
15332
15333       if (*(contents + off) & 0x80)
15334         {
15335           off += 2;
15336         }
15337       else
15338         {
15339           h = NULL;
15340           isec = NULL;
15341           jrel = NULL;
15342           rel_backup.r_info = 0;
15343           rel_backup.r_offset = 0;
15344           rel_backup.r_addend = 0;
15345           /* Load the instruction and its opcode with register for comparing.  */
15346           insn = bfd_getb32 (contents + off);
15347           insn_with_reg = 0;
15348           if (irel != NULL && irel < irelend && irel->r_offset == off)
15349             {
15350               nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
15351               howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
15352               shift = howto->rightshift;
15353               align = (1 << shift) - 1;
15354               if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA
15355                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_HI20_RELA
15356                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_ORI_RELA
15357                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_RELA
15358                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S1_RELA
15359                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_RELA
15360                   ||(ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
15361                      && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
15362                   || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
15363                       && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
15364                   || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
15365                       && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA)
15366                   || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
15367                       && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))
15368                 {
15369                   r_symndx = ELF32_R_SYM (irel->r_info);
15370                   jrel = irel;
15371                   rel_backup = *irel;
15372                   if (r_symndx < symtab_hdr->sh_info)
15373                     {
15374                       /* Local symbol.  */
15375                       int shndx = isym[r_symndx].st_shndx;
15376
15377                       bfd_vma st_value = (isym + r_symndx)->st_value;
15378                       isec = elf_elfsections (abfd)[shndx]->bfd_section;
15379                       relocation = (isec->output_section->vma + isec->output_offset
15380                                     + st_value + irel->r_addend);
15381                     }
15382                   else
15383                     {
15384                       /* External symbol.  */
15385                       bfd_boolean warned ATTRIBUTE_UNUSED;
15386                       bfd_boolean ignored ATTRIBUTE_UNUSED;
15387                       bfd_boolean unresolved_reloc ATTRIBUTE_UNUSED;
15388                       asection *sym_sec;
15389
15390                       /* Maybe there is a better way to get h and relocation */
15391                       RELOC_FOR_GLOBAL_SYMBOL (link_info, abfd, sec, irel,
15392                                                r_symndx, symtab_hdr, sym_hashes,
15393                                                h, sym_sec, relocation,
15394                                                unresolved_reloc, warned, ignored);
15395                       relocation += irel->r_addend;
15396                       if ((h->root.type != bfd_link_hash_defined
15397                            && h->root.type != bfd_link_hash_defweak)
15398                           || strcmp (h->root.root.string, "_FP_BASE_") == 0)
15399                         {
15400                           off += 4;
15401                           continue;
15402                         }
15403                     }
15404
15405                   /* Check for gp relative instruction alignment.  */
15406                   if ((ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
15407                        && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
15408                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
15409                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
15410                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
15411                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA)
15412                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
15413                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))
15414                     {
15415                       bfd_vma gp;
15416                       bfd *output_bfd = sec->output_section->owner;
15417                       bfd_reloc_status_type r;
15418
15419                       /* If the symbol is in the abs section, the out_bfd will be null.
15420                          This happens when the relocation has a symbol@GOTOFF.  */
15421                       r = nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
15422                       if (r != bfd_reloc_ok)
15423                         {
15424                           off += 4;
15425                           continue;
15426                         }
15427
15428                       relocation -= gp;
15429
15430                       /* Make sure alignment is correct.  */
15431                       if (relocation & align)
15432                         {
15433                           /* Incorrect alignment.  */
15434                           _bfd_error_handler
15435                             /* xgettext:c-format */
15436                             (_("%s: warning: unaligned small data access. "
15437                                "For entry: {%d, %d, %d}, addr = 0x%x, align = 0x%x."),
15438                              bfd_get_filename (abfd), irel->r_offset,
15439                              irel->r_info, irel->r_addend, relocation, align);
15440                           off += 4;
15441                           continue;
15442                         }
15443                     }
15444
15445                   insn = insn_with_reg
15446                     | ((relocation >> shift) & nds32_elf_irel_mask (irel));
15447                 }
15448               else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
15449                        || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
15450                        || ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
15451                 {
15452                   /* These relocations do not have to relocate contens, so it can
15453                      be regard as instruction without relocation.  */
15454                 }
15455               else
15456                 {
15457                   off += 4;
15458                   continue;
15459                 }
15460             }
15461
15462           snprintf (code, sizeof (code), "%08x", insn);
15463           /* Copy "code".  */
15464           entry = (struct elf_nds32_code_hash_entry*)
15465             bfd_hash_lookup (&ex9_code_table, code, TRUE, TRUE);
15466           if (entry == NULL)
15467             {
15468               _bfd_error_handler
15469                 (_("%P%F: failed creating ex9.it %s hash table: %E\n"), code);
15470               return FALSE;
15471             }
15472           if (h)
15473             {
15474               if (h->root.type == bfd_link_hash_undefined)
15475                 return TRUE;
15476               /* Global symbol.  */
15477               /* In order to do sethi with different symbol but same value.  */
15478               if (entry->m_list == NULL)
15479                 {
15480                   struct elf_link_hash_entry_mul_list *m_list_new;
15481                   struct elf_link_hash_entry_list *h_list_new;
15482
15483                   m_list_new = (struct elf_link_hash_entry_mul_list *)
15484                     bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list));
15485                   h_list_new = (struct elf_link_hash_entry_list *)
15486                     bfd_malloc (sizeof (struct elf_link_hash_entry_list));
15487                   entry->m_list = m_list_new;
15488                   m_list_new->h_list = h_list_new;
15489                   m_list_new->rel_backup = rel_backup;
15490                   m_list_new->times = 1;
15491                   m_list_new->irel = jrel;
15492                   m_list_new->next = NULL;
15493                   h_list_new->h = h;
15494                   h_list_new->next = NULL;
15495                 }
15496               else
15497                 {
15498                   struct elf_link_hash_entry_mul_list *m_list = entry->m_list;
15499                   struct elf_link_hash_entry_list *h_list;
15500
15501                   while (m_list)
15502                     {
15503                       /* Build the different symbols that point to the same address.  */
15504                       h_list = m_list->h_list;
15505                       if (h_list->h->root.u.def.value == h->root.u.def.value
15506                           && h_list->h->root.u.def.section->output_section->vma
15507                              == h->root.u.def.section->output_section->vma
15508                           && h_list->h->root.u.def.section->output_offset
15509                              == h->root.u.def.section->output_offset
15510                           && m_list->rel_backup.r_addend == rel_backup.r_addend)
15511                         {
15512                           m_list->times++;
15513                           m_list->irel = jrel;
15514                           while (h_list->h != h && h_list->next)
15515                             h_list = h_list->next;
15516                           if (h_list->h != h)
15517                             {
15518                               struct elf_link_hash_entry_list *h_list_new;
15519
15520                               h_list_new = (struct elf_link_hash_entry_list *)
15521                                 bfd_malloc (sizeof (struct elf_link_hash_entry_list));
15522                               h_list->next = h_list_new;
15523                               h_list_new->h = h;
15524                               h_list_new->next = NULL;
15525                             }
15526                           break;
15527                         }
15528                       /* The sethi case may have different address but the
15529                          hi20 is the same.  */
15530                       else if (ELF32_R_TYPE (jrel->r_info) == R_NDS32_HI20_RELA
15531                                && m_list->next == NULL)
15532                         {
15533                           struct elf_link_hash_entry_mul_list *m_list_new;
15534                           struct elf_link_hash_entry_list *h_list_new;
15535
15536                           m_list_new = (struct elf_link_hash_entry_mul_list *)
15537                             bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list));
15538                           h_list_new = (struct elf_link_hash_entry_list *)
15539                             bfd_malloc (sizeof (struct elf_link_hash_entry_list));
15540                           m_list->next = m_list_new;
15541                           m_list_new->h_list = h_list_new;
15542                           m_list_new->rel_backup = rel_backup;
15543                           m_list_new->times = 1;
15544                           m_list_new->irel = jrel;
15545                           m_list_new->next = NULL;
15546                           h_list_new->h = h;
15547                           h_list_new->next = NULL;
15548                           break;
15549                         }
15550                       m_list = m_list->next;
15551                     }
15552                   if (!m_list)
15553                     {
15554                       off += 4;
15555                       continue;
15556                     }
15557                 }
15558             }
15559           else
15560             {
15561               /* Local symbol and insn without relocation*/
15562               entry->times++;
15563               entry->rel_backup = rel_backup;
15564             }
15565
15566           /* Use in sethi insn with constant and global symbol in same format.  */
15567           if (!jrel)
15568             entry->const_insn = 1;
15569           else
15570             entry->irel = jrel;
15571           entry->sec = isec;
15572           off += 4;
15573         }
15574     }
15575   return TRUE;
15576 }
15577
15578 /* Set the _ITB_BASE, and point it to ex9 table.  */
15579
15580 bfd_boolean
15581 nds32_elf_ex9_itb_base (struct bfd_link_info *link_info)
15582 {
15583   bfd *abfd;
15584   asection *sec;
15585   bfd *output_bfd = NULL;
15586   struct bfd_link_hash_entry *bh = NULL;
15587
15588   if (is_ITB_BASE_set == 1)
15589     return TRUE;
15590
15591   is_ITB_BASE_set = 1;
15592
15593   bh = bfd_link_hash_lookup (link_info->hash, "_ITB_BASE_", FALSE, FALSE, TRUE);
15594
15595   if (bh && (bh->type == bfd_link_hash_defined
15596              || bh->type == bfd_link_hash_defweak))
15597     return TRUE;
15598
15599   for (abfd = link_info->input_bfds; abfd != NULL;
15600        abfd = abfd->link.next)
15601     {
15602       sec = bfd_get_section_by_name (abfd, ".ex9.itable");
15603       if (sec != NULL)
15604         {
15605           output_bfd = sec->output_section->owner;
15606           break;
15607         }
15608     }
15609   if (output_bfd == NULL)
15610     {
15611       output_bfd = link_info->output_bfd;
15612       if (output_bfd->sections == NULL)
15613         return TRUE;
15614       else
15615         sec = bfd_abs_section_ptr;
15616     }
15617   bh = bfd_link_hash_lookup (link_info->hash, "_ITB_BASE_",
15618                              FALSE, FALSE, TRUE);
15619   return (_bfd_generic_link_add_one_symbol
15620           (link_info, output_bfd, "_ITB_BASE_",
15621            BSF_GLOBAL | BSF_WEAK, sec, 0,
15622            (const char *) NULL, FALSE, get_elf_backend_data
15623            (output_bfd)->collect, &bh));
15624 } /* End EX9.IT  */
15625 \f
15626
15627 #define ELF_ARCH                                bfd_arch_nds32
15628 #define ELF_MACHINE_CODE                        EM_NDS32
15629 #define ELF_MAXPAGESIZE                         0x1000
15630 #define ELF_TARGET_ID                           NDS32_ELF_DATA
15631
15632 #define TARGET_BIG_SYM                          nds32_elf32_be_vec
15633 #define TARGET_BIG_NAME                         "elf32-nds32be"
15634 #define TARGET_LITTLE_SYM                       nds32_elf32_le_vec
15635 #define TARGET_LITTLE_NAME                      "elf32-nds32le"
15636
15637 #define elf_info_to_howto                       nds32_info_to_howto
15638 #define elf_info_to_howto_rel                   nds32_info_to_howto_rel
15639
15640 #define bfd_elf32_bfd_link_hash_table_create    nds32_elf_link_hash_table_create
15641 #define bfd_elf32_bfd_merge_private_bfd_data    nds32_elf_merge_private_bfd_data
15642 #define bfd_elf32_bfd_print_private_bfd_data    nds32_elf_print_private_bfd_data
15643 #define bfd_elf32_bfd_relax_section             nds32_elf_relax_section
15644 #define bfd_elf32_bfd_set_private_flags         nds32_elf_set_private_flags
15645
15646 #define bfd_elf32_mkobject                      nds32_elf_mkobject
15647 #define elf_backend_action_discarded            nds32_elf_action_discarded
15648 #define elf_backend_add_symbol_hook             nds32_elf_add_symbol_hook
15649 #define elf_backend_check_relocs                nds32_elf_check_relocs
15650 #define elf_backend_adjust_dynamic_symbol       nds32_elf_adjust_dynamic_symbol
15651 #define elf_backend_create_dynamic_sections     nds32_elf_create_dynamic_sections
15652 #define elf_backend_finish_dynamic_sections     nds32_elf_finish_dynamic_sections
15653 #define elf_backend_finish_dynamic_symbol       nds32_elf_finish_dynamic_symbol
15654 #define elf_backend_size_dynamic_sections       nds32_elf_size_dynamic_sections
15655 #define elf_backend_relocate_section            nds32_elf_relocate_section
15656 #define elf_backend_gc_mark_hook                nds32_elf_gc_mark_hook
15657 #define elf_backend_gc_sweep_hook               nds32_elf_gc_sweep_hook
15658 #define elf_backend_grok_prstatus               nds32_elf_grok_prstatus
15659 #define elf_backend_grok_psinfo                 nds32_elf_grok_psinfo
15660 #define elf_backend_reloc_type_class            nds32_elf_reloc_type_class
15661 #define elf_backend_copy_indirect_symbol        nds32_elf_copy_indirect_symbol
15662 #define elf_backend_link_output_symbol_hook     nds32_elf_output_symbol_hook
15663 #define elf_backend_output_arch_syms            nds32_elf_output_arch_syms
15664 #define elf_backend_object_p                    nds32_elf_object_p
15665 #define elf_backend_final_write_processing      nds32_elf_final_write_processing
15666 #define elf_backend_special_sections            nds32_elf_special_sections
15667 #define bfd_elf32_bfd_get_relocated_section_contents \
15668                                 nds32_elf_get_relocated_section_contents
15669
15670 #define elf_backend_can_gc_sections             1
15671 #define elf_backend_can_refcount                1
15672 #define elf_backend_want_got_plt                1
15673 #define elf_backend_plt_readonly                1
15674 #define elf_backend_want_plt_sym                0
15675 #define elf_backend_got_header_size             12
15676 #define elf_backend_may_use_rel_p               1
15677 #define elf_backend_default_use_rela_p          1
15678 #define elf_backend_may_use_rela_p              1
15679 #define elf_backend_dtrel_excludes_plt          1
15680
15681 #include "elf32-target.h"
15682
15683 #undef ELF_MAXPAGESIZE
15684 #define ELF_MAXPAGESIZE                         0x2000
15685
15686 #undef TARGET_BIG_SYM
15687 #define TARGET_BIG_SYM                          nds32_elf32_linux_be_vec
15688 #undef TARGET_BIG_NAME
15689 #define TARGET_BIG_NAME                         "elf32-nds32be-linux"
15690 #undef TARGET_LITTLE_SYM
15691 #define TARGET_LITTLE_SYM                       nds32_elf32_linux_le_vec
15692 #undef TARGET_LITTLE_NAME
15693 #define TARGET_LITTLE_NAME                      "elf32-nds32le-linux"
15694 #undef elf32_bed
15695 #define elf32_bed                               elf32_nds32_lin_bed
15696
15697 #include "elf32-target.h"