Pass link_info to _bfd_merge_private_bfd_data
[external/binutils.git] / bfd / elf32-nds32.c
1 /* NDS32-specific support for 32-bit ELF.
2    Copyright (C) 2012-2016 Free Software Foundation, Inc.
3    Contributed by Andes Technology Corporation.
4
5    This file is part of BFD, the Binary File Descriptor library.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
20    02110-1301, USA.  */
21
22
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "bfd_stdint.h"
26 #include "bfdlink.h"
27 #include "libbfd.h"
28 #include "elf-bfd.h"
29 #include "libiberty.h"
30 #include "bfd_stdint.h"
31 #include "elf/nds32.h"
32 #include "opcode/nds32.h"
33 #include "elf32-nds32.h"
34 #include "opcode/cgen.h"
35 #include "../opcodes/nds32-opc.h"
36
37 /* Relocation HOWTO functions.  */
38 static bfd_reloc_status_type nds32_elf_ignore_reloc
39   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
40 static bfd_reloc_status_type nds32_elf_9_pcrel_reloc
41   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42 static bfd_reloc_status_type nds32_elf_hi20_reloc
43   (bfd *, arelent *, asymbol *, void *,
44    asection *, bfd *, char **);
45 static bfd_reloc_status_type nds32_elf_lo12_reloc
46   (bfd *, arelent *, asymbol *, void *,
47    asection *, bfd *, char **);
48 static bfd_reloc_status_type nds32_elf_generic_reloc
49   (bfd *, arelent *, asymbol *, void *,
50    asection *, bfd *, char **);
51 static bfd_reloc_status_type nds32_elf_sda15_reloc
52   (bfd *, arelent *, asymbol *, void *,
53    asection *, bfd *, char **);
54
55 /* Helper functions for HOWTO.  */
56 static bfd_reloc_status_type nds32_elf_do_9_pcrel_reloc
57   (bfd *, reloc_howto_type *, asection *, bfd_byte *, bfd_vma,
58    asection *, bfd_vma, bfd_vma);
59 static void nds32_elf_relocate_hi20
60   (bfd *, int, Elf_Internal_Rela *, Elf_Internal_Rela *, bfd_byte *, bfd_vma);
61 static reloc_howto_type *bfd_elf32_bfd_reloc_type_table_lookup
62   (enum elf_nds32_reloc_type);
63 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
64   (bfd *, bfd_reloc_code_real_type);
65
66 /* Target hooks.  */
67 static void nds32_info_to_howto_rel
68   (bfd *, arelent *, Elf_Internal_Rela *dst);
69 static void nds32_info_to_howto
70   (bfd *, arelent *, Elf_Internal_Rela *dst);
71 static bfd_boolean nds32_elf_add_symbol_hook
72   (bfd *, struct bfd_link_info *, Elf_Internal_Sym *, const char **,
73    flagword *, asection **, bfd_vma *);
74 static bfd_boolean nds32_elf_relocate_section
75   (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
76    Elf_Internal_Rela *, Elf_Internal_Sym *, asection **);
77 static bfd_boolean nds32_elf_object_p (bfd *);
78 static void nds32_elf_final_write_processing (bfd *, bfd_boolean);
79 static bfd_boolean nds32_elf_set_private_flags (bfd *, flagword);
80 static bfd_boolean nds32_elf_merge_private_bfd_data
81   (bfd *, struct bfd_link_info *);
82 static bfd_boolean nds32_elf_print_private_bfd_data (bfd *, void *);
83 static bfd_boolean nds32_elf_gc_sweep_hook
84   (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
85 static bfd_boolean nds32_elf_check_relocs
86   (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
87 static asection *nds32_elf_gc_mark_hook
88   (asection *, struct bfd_link_info *, Elf_Internal_Rela *,
89    struct elf_link_hash_entry *, Elf_Internal_Sym *);
90 static bfd_boolean nds32_elf_adjust_dynamic_symbol
91   (struct bfd_link_info *, struct elf_link_hash_entry *);
92 static bfd_boolean nds32_elf_size_dynamic_sections
93   (bfd *, struct bfd_link_info *);
94 static bfd_boolean nds32_elf_create_dynamic_sections
95   (bfd *, struct bfd_link_info *);
96 static bfd_boolean nds32_elf_finish_dynamic_sections
97   (bfd *, struct bfd_link_info *info);
98 static bfd_boolean nds32_elf_finish_dynamic_symbol
99   (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
100    Elf_Internal_Sym *);
101 static bfd_boolean nds32_elf_mkobject (bfd *);
102
103 /* Nds32 helper functions.  */
104 static bfd_reloc_status_type nds32_elf_final_sda_base
105   (bfd *, struct bfd_link_info *, bfd_vma *, bfd_boolean);
106 static bfd_boolean allocate_dynrelocs (struct elf_link_hash_entry *, void *);
107 static bfd_boolean readonly_dynrelocs (struct elf_link_hash_entry *, void *);
108 static Elf_Internal_Rela *find_relocs_at_address
109   (Elf_Internal_Rela *, Elf_Internal_Rela *,
110    Elf_Internal_Rela *, enum elf_nds32_reloc_type);
111 static bfd_vma calculate_memory_address
112 (bfd *, Elf_Internal_Rela *, Elf_Internal_Sym *, Elf_Internal_Shdr *);
113 static int nds32_get_section_contents (bfd *, asection *,
114                                        bfd_byte **, bfd_boolean);
115 static bfd_boolean nds32_elf_ex9_build_hash_table
116 (bfd *, asection *, struct bfd_link_info *);
117 static bfd_boolean nds32_elf_ex9_itb_base (struct bfd_link_info *);
118 static void nds32_elf_ex9_import_table (struct bfd_link_info *);
119 static void nds32_elf_ex9_finish (struct bfd_link_info *);
120 static void nds32_elf_ex9_reloc_jmp (struct bfd_link_info *);
121 static void nds32_elf_get_insn_with_reg
122   (Elf_Internal_Rela *, uint32_t, uint32_t *);
123 static int nds32_get_local_syms (bfd *, asection *ATTRIBUTE_UNUSED,
124                                  Elf_Internal_Sym **);
125 static bfd_boolean nds32_elf_ex9_replace_instruction
126   (struct bfd_link_info *, bfd *, asection *);
127 static bfd_boolean nds32_elf_ifc_calc (struct bfd_link_info *, bfd *,
128                                        asection *);
129 static bfd_boolean nds32_elf_ifc_finish (struct bfd_link_info *);
130 static bfd_boolean nds32_elf_ifc_replace (struct bfd_link_info *);
131 static bfd_boolean nds32_elf_ifc_reloc (void);
132 static bfd_boolean  nds32_relax_fp_as_gp
133   (struct bfd_link_info *link_info, bfd *abfd, asection *sec,
134    Elf_Internal_Rela *internal_relocs, Elf_Internal_Rela *irelend,
135    Elf_Internal_Sym *isymbuf);
136 static bfd_boolean nds32_fag_remove_unused_fpbase
137   (bfd *abfd, asection *sec, Elf_Internal_Rela *internal_relocs,
138    Elf_Internal_Rela *irelend);
139 static bfd_byte *
140 nds32_elf_get_relocated_section_contents (bfd *abfd,
141                                           struct bfd_link_info *link_info,
142                                           struct bfd_link_order *link_order,
143                                           bfd_byte *data,
144                                           bfd_boolean relocatable,
145                                           asymbol **symbols);
146
147 enum
148 {
149   MACH_V1 = bfd_mach_n1h,
150   MACH_V2 = bfd_mach_n1h_v2,
151   MACH_V3 = bfd_mach_n1h_v3,
152   MACH_V3M = bfd_mach_n1h_v3m
153 };
154
155 #define MIN(a, b) ((a) > (b) ? (b) : (a))
156 #define MAX(a, b) ((a) > (b) ? (a) : (b))
157
158 /* The name of the dynamic interpreter.  This is put in the .interp
159    section.  */
160 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
161
162 /* The nop opcode we use.  */
163 #define NDS32_NOP32 0x40000009
164 #define NDS32_NOP16 0x9200
165
166 /* The size in bytes of an entry in the procedure linkage table.  */
167 #define PLT_ENTRY_SIZE 24
168 #define PLT_HEADER_SIZE 24
169
170 /* The first entry in a procedure linkage table are reserved,
171    and the initial contents are unimportant (we zero them out).
172    Subsequent entries look like this.  */
173 #define PLT0_ENTRY_WORD0  0x46f00000            /* sethi   r15, HI20(.got+4)      */
174 #define PLT0_ENTRY_WORD1  0x58f78000            /* ori     r15, r25, LO12(.got+4) */
175 #define PLT0_ENTRY_WORD2  0x05178000            /* lwi     r17, [r15+0]           */
176 #define PLT0_ENTRY_WORD3  0x04f78001            /* lwi     r15, [r15+4]           */
177 #define PLT0_ENTRY_WORD4  0x4a003c00            /* jr      r15                    */
178
179 /* $ta is change to $r15 (from $r25).  */
180 #define PLT0_PIC_ENTRY_WORD0  0x46f00000        /* sethi   r15, HI20(got[1]@GOT)  */
181 #define PLT0_PIC_ENTRY_WORD1  0x58f78000        /* ori     r15, r15, LO12(got[1]@GOT) */
182 #define PLT0_PIC_ENTRY_WORD2  0x40f7f400        /* add     r15, gp, r15           */
183 #define PLT0_PIC_ENTRY_WORD3  0x05178000        /* lwi     r17, [r15+0]           */
184 #define PLT0_PIC_ENTRY_WORD4  0x04f78001        /* lwi     r15, [r15+4]           */
185 #define PLT0_PIC_ENTRY_WORD5  0x4a003c00        /* jr      r15                    */
186
187 #define PLT_ENTRY_WORD0  0x46f00000             /* sethi   r15, HI20(&got[n+3])      */
188 #define PLT_ENTRY_WORD1  0x04f78000             /* lwi     r15, r15, LO12(&got[n+3]) */
189 #define PLT_ENTRY_WORD2  0x4a003c00             /* jr      r15                       */
190 #define PLT_ENTRY_WORD3  0x45000000             /* movi    r16, sizeof(RELA) * n     */
191 #define PLT_ENTRY_WORD4  0x48000000             /* j      .plt0.                     */
192
193 #define PLT_PIC_ENTRY_WORD0  0x46f00000         /* sethi  r15, HI20(got[n+3]@GOT)    */
194 #define PLT_PIC_ENTRY_WORD1  0x58f78000         /* ori    r15, r15,    LO12(got[n+3]@GOT) */
195 #define PLT_PIC_ENTRY_WORD2  0x38febc02         /* lw     r15, [gp+r15]              */
196 #define PLT_PIC_ENTRY_WORD3  0x4a003c00         /* jr     r15                        */
197 #define PLT_PIC_ENTRY_WORD4  0x45000000         /* movi   r16, sizeof(RELA) * n      */
198 #define PLT_PIC_ENTRY_WORD5  0x48000000         /* j      .plt0                      */
199
200 /* These are macros used to get the relocation accurate value.  */
201 #define ACCURATE_8BIT_S1        (0x100)
202 #define ACCURATE_U9BIT_S1       (0x400)
203 #define ACCURATE_12BIT_S1       (0x2000)
204 #define ACCURATE_14BIT_S1       (0x4000)
205 #define ACCURATE_19BIT          (0x40000)
206
207 /* These are macros used to get the relocation conservative value.  */
208 #define CONSERVATIVE_8BIT_S1    (0x100 - 4)
209 #define CONSERVATIVE_14BIT_S1   (0x4000 - 4)
210 #define CONSERVATIVE_16BIT_S1   (0x10000 - 4)
211 #define CONSERVATIVE_24BIT_S1   (0x1000000 - 4)
212 /* These must be more conservative because the address may be in
213    different segment.  */
214 #define CONSERVATIVE_15BIT      (0x4000 - 0x1000)
215 #define CONSERVATIVE_15BIT_S1   (0x8000 - 0x1000)
216 #define CONSERVATIVE_15BIT_S2   (0x10000 - 0x1000)
217 #define CONSERVATIVE_19BIT      (0x40000 - 0x1000)
218 #define CONSERVATIVE_20BIT      (0x80000 - 0x1000)
219
220 /* Size of small data/bss sections, used to calculate SDA_BASE.  */
221 static long got_size = 0;
222 static int is_SDA_BASE_set = 0;
223 static int is_ITB_BASE_set = 0;
224
225 /* Convert ELF-VER in eflags to string for debugging purpose.  */
226 static const char *const nds32_elfver_strtab[] =
227 {
228   "ELF-1.2",
229   "ELF-1.3",
230   "ELF-1.4",
231 };
232
233 /* The nds32 linker needs to keep track of the number of relocs that it
234    decides to copy in check_relocs for each symbol.  This is so that
235    it can discard PC relative relocs if it doesn't need them when
236    linking with -Bsymbolic.  We store the information in a field
237    extending the regular ELF linker hash table.  */
238
239 /* This structure keeps track of the number of PC relative relocs we
240    have copied for a given symbol.  */
241
242 struct elf_nds32_pcrel_relocs_copied
243 {
244   /* Next section.  */
245   struct elf_nds32_pcrel_relocs_copied *next;
246   /* A section in dynobj.  */
247   asection *section;
248   /* Number of relocs copied in this section.  */
249   bfd_size_type count;
250 };
251
252 /* The sh linker needs to keep track of the number of relocs that it
253    decides to copy as dynamic relocs in check_relocs for each symbol.
254    This is so that it can later discard them if they are found to be
255    unnecessary.  We store the information in a field extending the
256    regular ELF linker hash table.  */
257
258 struct elf_nds32_dyn_relocs
259 {
260   struct elf_nds32_dyn_relocs *next;
261
262   /* The input section of the reloc.  */
263   asection *sec;
264
265   /* Total number of relocs copied for the input section.  */
266   bfd_size_type count;
267
268   /* Number of pc-relative relocs copied for the input section.  */
269   bfd_size_type pc_count;
270 };
271
272 /* Nds32 ELF linker hash entry.  */
273
274 struct elf_nds32_link_hash_entry
275 {
276   struct elf_link_hash_entry root;
277
278   /* Track dynamic relocs copied for this symbol.  */
279   struct elf_nds32_dyn_relocs *dyn_relocs;
280
281   /* For checking relocation type.  */
282 #define GOT_UNKNOWN     0
283 #define GOT_NORMAL      1
284 #define GOT_TLS_IE      2
285   unsigned int tls_type;
286 };
287
288 /* Get the nds32 ELF linker hash table from a link_info structure.  */
289
290 #define FP_BASE_NAME "_FP_BASE_"
291 static int check_start_export_sym = 0;
292 static size_t ex9_relax_size = 0;               /* Save ex9 predicted reducing size.  */
293
294 /* The offset for executable tls relaxation.  */
295 #define TP_OFFSET 0x0
296
297 struct elf_nds32_obj_tdata
298 {
299   struct elf_obj_tdata root;
300
301   /* tls_type for each local got entry.  */
302   char *local_got_tls_type;
303 };
304
305 #define elf_nds32_tdata(bfd) \
306   ((struct elf_nds32_obj_tdata *) (bfd)->tdata.any)
307
308 #define elf32_nds32_local_got_tls_type(bfd) \
309   (elf_nds32_tdata (bfd)->local_got_tls_type)
310
311 #define elf32_nds32_hash_entry(ent) ((struct elf_nds32_link_hash_entry *)(ent))
312
313 static bfd_boolean
314 nds32_elf_mkobject (bfd *abfd)
315 {
316   return bfd_elf_allocate_object (abfd, sizeof (struct elf_nds32_obj_tdata),
317                                   NDS32_ELF_DATA);
318 }
319
320 /* Relocations used for relocation.  */
321 static reloc_howto_type nds32_elf_howto_table[] =
322 {
323   /* This reloc does nothing.  */
324   HOWTO (R_NDS32_NONE,          /* type */
325          0,                     /* rightshift */
326          3,                     /* size (0 = byte, 1 = short, 2 = long) */
327          0,                     /* bitsize */
328          FALSE,                 /* pc_relative */
329          0,                     /* bitpos */
330          complain_overflow_dont,        /* complain_on_overflow */
331          bfd_elf_generic_reloc, /* special_function */
332          "R_NDS32_NONE",        /* name */
333          FALSE,                 /* partial_inplace */
334          0,                     /* src_mask */
335          0,                     /* dst_mask */
336          FALSE),                /* pcrel_offset */
337
338   /* A 16 bit absolute relocation.  */
339   HOWTO (R_NDS32_16,            /* type */
340          0,                     /* rightshift */
341          1,                     /* size (0 = byte, 1 = short, 2 = long) */
342          16,                    /* bitsize */
343          FALSE,                 /* pc_relative */
344          0,                     /* bitpos */
345          complain_overflow_bitfield,    /* complain_on_overflow */
346          nds32_elf_generic_reloc,       /* special_function */
347          "R_NDS32_16",          /* name */
348          FALSE,                 /* partial_inplace */
349          0xffff,                /* src_mask */
350          0xffff,                /* dst_mask */
351          FALSE),                /* pcrel_offset */
352
353   /* A 32 bit absolute relocation.  */
354   HOWTO (R_NDS32_32,            /* type */
355          0,                     /* rightshift */
356          2,                     /* size (0 = byte, 1 = short, 2 = long) */
357          32,                    /* bitsize */
358          FALSE,                 /* pc_relative */
359          0,                     /* bitpos */
360          complain_overflow_bitfield,    /* complain_on_overflow */
361          nds32_elf_generic_reloc,       /* special_function */
362          "R_NDS32_32",          /* name */
363          FALSE,                 /* partial_inplace */
364          0xffffffff,            /* src_mask */
365          0xffffffff,            /* dst_mask */
366          FALSE),                /* pcrel_offset */
367
368   /* A 20 bit address.  */
369   HOWTO (R_NDS32_20,            /* type */
370          0,                     /* rightshift */
371          2,                     /* size (0 = byte, 1 = short, 2 = long) */
372          20,                    /* bitsize */
373          FALSE,                 /* pc_relative */
374          0,                     /* bitpos */
375          complain_overflow_unsigned,    /* complain_on_overflow */
376          nds32_elf_generic_reloc,       /* special_function */
377          "R_NDS32_20",          /* name */
378          FALSE,                 /* partial_inplace */
379          0xfffff,               /* src_mask */
380          0xfffff,               /* dst_mask */
381          FALSE),                /* pcrel_offset */
382
383   /* An PC Relative 9-bit relocation, shifted by 2.
384      This reloc is complicated because relocations are relative to pc & -4.
385      i.e. branches in the right insn slot use the address of the left insn
386      slot for pc.  */
387   /* ??? It's not clear whether this should have partial_inplace set or not.
388      Branch relaxing in the assembler can store the addend in the insn,
389      and if bfd_install_relocation gets called the addend may get added
390      again.  */
391   HOWTO (R_NDS32_9_PCREL,       /* type */
392          1,                     /* rightshift */
393          1,                     /* size (0 = byte, 1 = short, 2 = long) */
394          8,                     /* bitsize */
395          TRUE,                  /* pc_relative */
396          0,                     /* bitpos */
397          complain_overflow_signed,      /* complain_on_overflow */
398          nds32_elf_9_pcrel_reloc,       /* special_function */
399          "R_NDS32_9_PCREL",     /* name */
400          FALSE,                 /* partial_inplace */
401          0xff,                  /* src_mask */
402          0xff,                  /* dst_mask */
403          TRUE),                 /* pcrel_offset */
404
405   /* A relative 15 bit relocation, right shifted by 1.  */
406   HOWTO (R_NDS32_15_PCREL,      /* type */
407          1,                     /* rightshift */
408          2,                     /* size (0 = byte, 1 = short, 2 = long) */
409          14,                    /* bitsize */
410          TRUE,                  /* pc_relative */
411          0,                     /* bitpos */
412          complain_overflow_signed,      /* complain_on_overflow */
413          bfd_elf_generic_reloc, /* special_function */
414          "R_NDS32_15_PCREL",    /* name */
415          FALSE,                 /* partial_inplace */
416          0x3fff,                /* src_mask */
417          0x3fff,                /* dst_mask */
418          TRUE),                 /* pcrel_offset */
419
420   /* A relative 17 bit relocation, right shifted by 1.  */
421   HOWTO (R_NDS32_17_PCREL,      /* type */
422          1,                     /* rightshift */
423          2,                     /* size (0 = byte, 1 = short, 2 = long) */
424          16,                    /* bitsize */
425          TRUE,                  /* pc_relative */
426          0,                     /* bitpos */
427          complain_overflow_signed,      /* complain_on_overflow */
428          bfd_elf_generic_reloc, /* special_function */
429          "R_NDS32_17_PCREL",    /* name */
430          FALSE,                 /* partial_inplace */
431          0xffff,                /* src_mask */
432          0xffff,                /* dst_mask */
433          TRUE),                 /* pcrel_offset */
434
435   /* A relative 25 bit relocation, right shifted by 1.  */
436   /* ??? It's not clear whether this should have partial_inplace set or not.
437      Branch relaxing in the assembler can store the addend in the insn,
438      and if bfd_install_relocation gets called the addend may get added
439      again.  */
440   HOWTO (R_NDS32_25_PCREL,      /* type */
441          1,                     /* rightshift */
442          2,                     /* size (0 = byte, 1 = short, 2 = long) */
443          24,                    /* bitsize */
444          TRUE,                  /* pc_relative */
445          0,                     /* bitpos */
446          complain_overflow_signed,      /* complain_on_overflow */
447          bfd_elf_generic_reloc, /* special_function */
448          "R_NDS32_25_PCREL",    /* name */
449          FALSE,                 /* partial_inplace */
450          0xffffff,              /* src_mask */
451          0xffffff,              /* dst_mask */
452          TRUE),                 /* pcrel_offset */
453
454   /* High 20 bits of address when lower 12 is or'd in.  */
455   HOWTO (R_NDS32_HI20,          /* type */
456          12,                    /* rightshift */
457          2,                     /* size (0 = byte, 1 = short, 2 = long) */
458          20,                    /* bitsize */
459          FALSE,                 /* pc_relative */
460          0,                     /* bitpos */
461          complain_overflow_dont,/* complain_on_overflow */
462          nds32_elf_hi20_reloc,  /* special_function */
463          "R_NDS32_HI20",        /* name */
464          FALSE,                 /* partial_inplace */
465          0x000fffff,            /* src_mask */
466          0x000fffff,            /* dst_mask */
467          FALSE),                /* pcrel_offset */
468
469   /* Lower 12 bits of address.  */
470   HOWTO (R_NDS32_LO12S3,        /* type */
471          3,                     /* rightshift */
472          2,                     /* size (0 = byte, 1 = short, 2 = long) */
473          9,                     /* bitsize */
474          FALSE,                 /* pc_relative */
475          0,                     /* bitpos */
476          complain_overflow_dont,/* complain_on_overflow */
477          nds32_elf_lo12_reloc,  /* special_function */
478          "R_NDS32_LO12S3",      /* name */
479          FALSE,                 /* partial_inplace */
480          0x000001ff,            /* src_mask */
481          0x000001ff,            /* dst_mask */
482          FALSE),                /* pcrel_offset */
483
484   /* Lower 12 bits of address.  */
485   HOWTO (R_NDS32_LO12S2,        /* type */
486          2,                     /* rightshift */
487          2,                     /* size (0 = byte, 1 = short, 2 = long) */
488          10,                    /* bitsize */
489          FALSE,                 /* pc_relative */
490          0,                     /* bitpos */
491          complain_overflow_dont,/* complain_on_overflow */
492          nds32_elf_lo12_reloc,  /* special_function */
493          "R_NDS32_LO12S2",      /* name */
494          FALSE,                 /* partial_inplace */
495          0x000003ff,            /* src_mask */
496          0x000003ff,            /* dst_mask */
497          FALSE),                /* pcrel_offset */
498
499   /* Lower 12 bits of address.  */
500   HOWTO (R_NDS32_LO12S1,        /* type */
501          1,                     /* rightshift */
502          2,                     /* size (0 = byte, 1 = short, 2 = long) */
503          11,                    /* bitsize */
504          FALSE,                 /* pc_relative */
505          0,                     /* bitpos */
506          complain_overflow_dont,/* complain_on_overflow */
507          nds32_elf_lo12_reloc,  /* special_function */
508          "R_NDS32_LO12S1",      /* name */
509          FALSE,                 /* partial_inplace */
510          0x000007ff,            /* src_mask */
511          0x000007ff,            /* dst_mask */
512          FALSE),                /* pcrel_offset */
513
514   /* Lower 12 bits of address.  */
515   HOWTO (R_NDS32_LO12S0,        /* type */
516          0,                     /* rightshift */
517          2,                     /* size (0 = byte, 1 = short, 2 = long) */
518          12,                    /* bitsize */
519          FALSE,                 /* pc_relative */
520          0,                     /* bitpos */
521          complain_overflow_dont,/* complain_on_overflow */
522          nds32_elf_lo12_reloc,  /* special_function */
523          "R_NDS32_LO12S0",      /* name */
524          FALSE,                 /* partial_inplace */
525          0x00000fff,            /* src_mask */
526          0x00000fff,            /* dst_mask */
527          FALSE),                /* pcrel_offset */
528
529   /* Small data area 15 bits offset.  */
530   HOWTO (R_NDS32_SDA15S3,       /* type */
531          3,                     /* rightshift */
532          2,                     /* size (0 = byte, 1 = short, 2 = long) */
533          15,                    /* bitsize */
534          FALSE,                 /* pc_relative */
535          0,                     /* bitpos */
536          complain_overflow_signed,      /* complain_on_overflow */
537          nds32_elf_sda15_reloc, /* special_function */
538          "R_NDS32_SDA15S3",     /* name */
539          FALSE,                 /* partial_inplace */
540          0x00007fff,            /* src_mask */
541          0x00007fff,            /* dst_mask */
542          FALSE),                /* pcrel_offset */
543
544   /* Small data area 15 bits offset.  */
545   HOWTO (R_NDS32_SDA15S2,       /* type */
546          2,                     /* rightshift */
547          2,                     /* size (0 = byte, 1 = short, 2 = long) */
548          15,                    /* bitsize */
549          FALSE,                 /* pc_relative */
550          0,                     /* bitpos */
551          complain_overflow_signed,      /* complain_on_overflow */
552          nds32_elf_sda15_reloc, /* special_function */
553          "R_NDS32_SDA15S2",     /* name */
554          FALSE,                 /* partial_inplace */
555          0x00007fff,            /* src_mask */
556          0x00007fff,            /* dst_mask */
557          FALSE),                /* pcrel_offset */
558
559   /* Small data area 15 bits offset.  */
560   HOWTO (R_NDS32_SDA15S1,       /* type */
561          1,                     /* rightshift */
562          2,                     /* size (0 = byte, 1 = short, 2 = long) */
563          15,                    /* bitsize */
564          FALSE,                 /* pc_relative */
565          0,                     /* bitpos */
566          complain_overflow_signed,      /* complain_on_overflow */
567          nds32_elf_sda15_reloc, /* special_function */
568          "R_NDS32_SDA15S1",     /* name */
569          FALSE,                 /* partial_inplace */
570          0x00007fff,            /* src_mask */
571          0x00007fff,            /* dst_mask */
572          FALSE),                /* pcrel_offset */
573
574   /* Small data area 15 bits offset.  */
575   HOWTO (R_NDS32_SDA15S0,       /* type */
576          0,                     /* rightshift */
577          2,                     /* size (0 = byte, 1 = short, 2 = long) */
578          15,                    /* bitsize */
579          FALSE,                 /* pc_relative */
580          0,                     /* bitpos */
581          complain_overflow_signed,      /* complain_on_overflow */
582          nds32_elf_sda15_reloc, /* special_function */
583          "R_NDS32_SDA15S0",     /* name */
584          FALSE,                 /* partial_inplace */
585          0x00007fff,            /* src_mask */
586          0x00007fff,            /* dst_mask */
587          FALSE),                /* pcrel_offset */
588
589   /* GNU extension to record C++ vtable hierarchy */
590   HOWTO (R_NDS32_GNU_VTINHERIT, /* type */
591          0,                     /* rightshift */
592          2,                     /* size (0 = byte, 1 = short, 2 = long) */
593          0,                     /* bitsize */
594          FALSE,                 /* pc_relative */
595          0,                     /* bitpos */
596          complain_overflow_dont,/* complain_on_overflow */
597          NULL,                  /* special_function */
598          "R_NDS32_GNU_VTINHERIT",       /* name */
599          FALSE,                 /* partial_inplace */
600          0,                     /* src_mask */
601          0,                     /* dst_mask */
602          FALSE),                /* pcrel_offset */
603
604   /* GNU extension to record C++ vtable member usage */
605   HOWTO (R_NDS32_GNU_VTENTRY,   /* type */
606          0,                     /* rightshift */
607          2,                     /* size (0 = byte, 1 = short, 2 = long) */
608          0,                     /* bitsize */
609          FALSE,                 /* pc_relative */
610          0,                     /* bitpos */
611          complain_overflow_dont,/* complain_on_overflow */
612          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
613          "R_NDS32_GNU_VTENTRY", /* name */
614          FALSE,                 /* partial_inplace */
615          0,                     /* src_mask */
616          0,                     /* dst_mask */
617          FALSE),                /* pcrel_offset */
618
619   /* A 16 bit absolute relocation.  */
620   HOWTO (R_NDS32_16_RELA,       /* type */
621          0,                     /* rightshift */
622          1,                     /* size (0 = byte, 1 = short, 2 = long) */
623          16,                    /* bitsize */
624          FALSE,                 /* pc_relative */
625          0,                     /* bitpos */
626          complain_overflow_bitfield,    /* complain_on_overflow */
627          bfd_elf_generic_reloc, /* special_function */
628          "R_NDS32_16_RELA",     /* name */
629          FALSE,                 /* partial_inplace */
630          0xffff,                /* src_mask */
631          0xffff,                /* dst_mask */
632          FALSE),                /* pcrel_offset */
633
634   /* A 32 bit absolute relocation.  */
635   HOWTO (R_NDS32_32_RELA,       /* type */
636          0,                     /* rightshift */
637          2,                     /* size (0 = byte, 1 = short, 2 = long) */
638          32,                    /* bitsize */
639          FALSE,                 /* pc_relative */
640          0,                     /* bitpos */
641          complain_overflow_bitfield,    /* complain_on_overflow */
642          bfd_elf_generic_reloc, /* special_function */
643          "R_NDS32_32_RELA",     /* name */
644          FALSE,                 /* partial_inplace */
645          0xffffffff,            /* src_mask */
646          0xffffffff,            /* dst_mask */
647          FALSE),                /* pcrel_offset */
648
649   /* A 20 bit address.  */
650   HOWTO (R_NDS32_20_RELA,       /* type */
651          0,                     /* rightshift */
652          2,                     /* size (0 = byte, 1 = short, 2 = long) */
653          20,                    /* bitsize */
654          FALSE,                 /* pc_relative */
655          0,                     /* bitpos */
656          complain_overflow_signed,      /* complain_on_overflow */
657          bfd_elf_generic_reloc, /* special_function */
658          "R_NDS32_20_RELA",     /* name */
659          FALSE,                 /* partial_inplace */
660          0xfffff,               /* src_mask */
661          0xfffff,               /* dst_mask */
662          FALSE),                /* pcrel_offset */
663
664   HOWTO (R_NDS32_9_PCREL_RELA,  /* type */
665          1,                     /* rightshift */
666          1,                     /* size (0 = byte, 1 = short, 2 = long) */
667          8,                     /* bitsize */
668          TRUE,                  /* pc_relative */
669          0,                     /* bitpos */
670          complain_overflow_signed,      /* complain_on_overflow */
671          bfd_elf_generic_reloc, /* special_function */
672          "R_NDS32_9_PCREL_RELA",/* name */
673          FALSE,                 /* partial_inplace */
674          0xff,                  /* src_mask */
675          0xff,                  /* dst_mask */
676          TRUE),                 /* pcrel_offset */
677
678   /* A relative 15 bit relocation, right shifted by 1.  */
679   HOWTO (R_NDS32_15_PCREL_RELA, /* type */
680          1,                     /* rightshift */
681          2,                     /* size (0 = byte, 1 = short, 2 = long) */
682          14,                    /* bitsize */
683          TRUE,                  /* pc_relative */
684          0,                     /* bitpos */
685          complain_overflow_signed,      /* complain_on_overflow */
686          bfd_elf_generic_reloc, /* special_function */
687          "R_NDS32_15_PCREL_RELA",       /* name */
688          FALSE,                 /* partial_inplace */
689          0x3fff,                /* src_mask */
690          0x3fff,                /* dst_mask */
691          TRUE),                 /* pcrel_offset */
692
693   /* A relative 17 bit relocation, right shifted by 1.  */
694   HOWTO (R_NDS32_17_PCREL_RELA, /* type */
695          1,                     /* rightshift */
696          2,                     /* size (0 = byte, 1 = short, 2 = long) */
697          16,                    /* bitsize */
698          TRUE,                  /* pc_relative */
699          0,                     /* bitpos */
700          complain_overflow_signed,      /* complain_on_overflow */
701          bfd_elf_generic_reloc, /* special_function */
702          "R_NDS32_17_PCREL_RELA",       /* name */
703          FALSE,                 /* partial_inplace */
704          0xffff,                /* src_mask */
705          0xffff,                /* dst_mask */
706          TRUE),                 /* pcrel_offset */
707
708   /* A relative 25 bit relocation, right shifted by 2.  */
709   HOWTO (R_NDS32_25_PCREL_RELA, /* type */
710          1,                     /* rightshift */
711          2,                     /* size (0 = byte, 1 = short, 2 = long) */
712          24,                    /* bitsize */
713          TRUE,                  /* pc_relative */
714          0,                     /* bitpos */
715          complain_overflow_signed,      /* complain_on_overflow */
716          bfd_elf_generic_reloc, /* special_function */
717          "R_NDS32_25_PCREL_RELA",       /* name */
718          FALSE,                 /* partial_inplace */
719          0xffffff,              /* src_mask */
720          0xffffff,              /* dst_mask */
721          TRUE),                 /* pcrel_offset */
722
723   /* High 20 bits of address when lower 16 is or'd in.  */
724   HOWTO (R_NDS32_HI20_RELA,     /* type */
725          12,                    /* rightshift */
726          2,                     /* size (0 = byte, 1 = short, 2 = long) */
727          20,                    /* bitsize */
728          FALSE,                 /* pc_relative */
729          0,                     /* bitpos */
730          complain_overflow_dont,/* complain_on_overflow */
731          bfd_elf_generic_reloc, /* special_function */
732          "R_NDS32_HI20_RELA",   /* name */
733          FALSE,                 /* partial_inplace */
734          0x000fffff,            /* src_mask */
735          0x000fffff,            /* dst_mask */
736          FALSE),                /* pcrel_offset */
737
738   /* Lower 12 bits of address.  */
739   HOWTO (R_NDS32_LO12S3_RELA,   /* type */
740          3,                     /* rightshift */
741          2,                     /* size (0 = byte, 1 = short, 2 = long) */
742          9,                     /* bitsize */
743          FALSE,                 /* pc_relative */
744          0,                     /* bitpos */
745          complain_overflow_dont,/* complain_on_overflow */
746          bfd_elf_generic_reloc, /* special_function */
747          "R_NDS32_LO12S3_RELA", /* name */
748          FALSE,                 /* partial_inplace */
749          0x000001ff,            /* src_mask */
750          0x000001ff,            /* dst_mask */
751          FALSE),                /* pcrel_offset */
752
753   /* Lower 12 bits of address.  */
754   HOWTO (R_NDS32_LO12S2_RELA,   /* type */
755          2,                     /* rightshift */
756          2,                     /* size (0 = byte, 1 = short, 2 = long) */
757          10,                    /* bitsize */
758          FALSE,                 /* pc_relative */
759          0,                     /* bitpos */
760          complain_overflow_dont,/* complain_on_overflow */
761          bfd_elf_generic_reloc, /* special_function */
762          "R_NDS32_LO12S2_RELA", /* name */
763          FALSE,                 /* partial_inplace */
764          0x000003ff,            /* src_mask */
765          0x000003ff,            /* dst_mask */
766          FALSE),                /* pcrel_offset */
767
768   /* Lower 12 bits of address.  */
769   HOWTO (R_NDS32_LO12S1_RELA,   /* type */
770          1,                     /* rightshift */
771          2,                     /* size (0 = byte, 1 = short, 2 = long) */
772          11,                    /* bitsize */
773          FALSE,                 /* pc_relative */
774          0,                     /* bitpos */
775          complain_overflow_dont,/* complain_on_overflow */
776          bfd_elf_generic_reloc, /* special_function */
777          "R_NDS32_LO12S1_RELA", /* name */
778          FALSE,                 /* partial_inplace */
779          0x000007ff,            /* src_mask */
780          0x000007ff,            /* dst_mask */
781          FALSE),                /* pcrel_offset */
782
783   /* Lower 12 bits of address.  */
784   HOWTO (R_NDS32_LO12S0_RELA,   /* type */
785          0,                     /* rightshift */
786          2,                     /* size (0 = byte, 1 = short, 2 = long) */
787          12,                    /* bitsize */
788          FALSE,                 /* pc_relative */
789          0,                     /* bitpos */
790          complain_overflow_dont,/* complain_on_overflow */
791          bfd_elf_generic_reloc, /* special_function */
792          "R_NDS32_LO12S0_RELA", /* name */
793          FALSE,                 /* partial_inplace */
794          0x00000fff,            /* src_mask */
795          0x00000fff,            /* dst_mask */
796          FALSE),                /* pcrel_offset */
797
798   /* Small data area 15 bits offset.  */
799   HOWTO (R_NDS32_SDA15S3_RELA,  /* type */
800          3,                     /* rightshift */
801          2,                     /* size (0 = byte, 1 = short, 2 = long) */
802          15,                    /* bitsize */
803          FALSE,                 /* pc_relative */
804          0,                     /* bitpos */
805          complain_overflow_signed,      /* complain_on_overflow */
806          bfd_elf_generic_reloc, /* special_function */
807          "R_NDS32_SDA15S3_RELA",/* name */
808          FALSE,                 /* partial_inplace */
809          0x00007fff,            /* src_mask */
810          0x00007fff,            /* dst_mask */
811          FALSE),                /* pcrel_offset */
812
813   /* Small data area 15 bits offset.  */
814   HOWTO (R_NDS32_SDA15S2_RELA,  /* type */
815          2,                     /* rightshift */
816          2,                     /* size (0 = byte, 1 = short, 2 = long) */
817          15,                    /* bitsize */
818          FALSE,                 /* pc_relative */
819          0,                     /* bitpos */
820          complain_overflow_signed,      /* complain_on_overflow */
821          bfd_elf_generic_reloc, /* special_function */
822          "R_NDS32_SDA15S2_RELA",/* name */
823          FALSE,                 /* partial_inplace */
824          0x00007fff,            /* src_mask */
825          0x00007fff,            /* dst_mask */
826          FALSE),                /* pcrel_offset */
827
828   HOWTO (R_NDS32_SDA15S1_RELA,  /* type */
829          1,                     /* rightshift */
830          2,                     /* size (0 = byte, 1 = short, 2 = long) */
831          15,                    /* bitsize */
832          FALSE,                 /* pc_relative */
833          0,                     /* bitpos */
834          complain_overflow_signed,      /* complain_on_overflow */
835          bfd_elf_generic_reloc, /* special_function */
836          "R_NDS32_SDA15S1_RELA",/* name */
837          FALSE,                 /* partial_inplace */
838          0x00007fff,            /* src_mask */
839          0x00007fff,            /* dst_mask */
840          FALSE),                /* pcrel_offset */
841
842   HOWTO (R_NDS32_SDA15S0_RELA,  /* type */
843          0,                     /* rightshift */
844          2,                     /* size (0 = byte, 1 = short, 2 = long) */
845          15,                    /* bitsize */
846          FALSE,                 /* pc_relative */
847          0,                     /* bitpos */
848          complain_overflow_signed,      /* complain_on_overflow */
849          bfd_elf_generic_reloc, /* special_function */
850          "R_NDS32_SDA15S0_RELA",/* name */
851          FALSE,                 /* partial_inplace */
852          0x00007fff,            /* src_mask */
853          0x00007fff,            /* dst_mask */
854          FALSE),                /* pcrel_offset */
855
856   /* GNU extension to record C++ vtable hierarchy */
857   HOWTO (R_NDS32_RELA_GNU_VTINHERIT,    /* type */
858          0,                     /* rightshift */
859          2,                     /* size (0 = byte, 1 = short, 2 = long) */
860          0,                     /* bitsize */
861          FALSE,                 /* pc_relative */
862          0,                     /* bitpos */
863          complain_overflow_dont,/* complain_on_overflow */
864          NULL,                  /* special_function */
865          "R_NDS32_RELA_GNU_VTINHERIT",  /* name */
866          FALSE,                 /* partial_inplace */
867          0,                     /* src_mask */
868          0,                     /* dst_mask */
869          FALSE),                /* pcrel_offset */
870
871   /* GNU extension to record C++ vtable member usage */
872   HOWTO (R_NDS32_RELA_GNU_VTENTRY,      /* type */
873          0,                     /* rightshift */
874          2,                     /* size (0 = byte, 1 = short, 2 = long) */
875          0,                     /* bitsize */
876          FALSE,                 /* pc_relative */
877          0,                     /* bitpos */
878          complain_overflow_dont,/* complain_on_overflow */
879          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
880          "R_NDS32_RELA_GNU_VTENTRY",    /* name */
881          FALSE,                 /* partial_inplace */
882          0,                     /* src_mask */
883          0,                     /* dst_mask */
884          FALSE),                /* pcrel_offset */
885
886   /* Like R_NDS32_20, but referring to the GOT table entry for
887      the symbol.  */
888   HOWTO (R_NDS32_GOT20,         /* type */
889          0,                     /* rightshift */
890          2,                     /* size (0 = byte, 1 = short, 2 = long) */
891          20,                    /* bitsize */
892          FALSE,                 /* pc_relative */
893          0,                     /* bitpos */
894          complain_overflow_signed,      /* complain_on_overflow */
895          bfd_elf_generic_reloc, /* special_function */
896          "R_NDS32_GOT20",       /* name */
897          FALSE,                 /* partial_inplace */
898          0xfffff,               /* src_mask */
899          0xfffff,               /* dst_mask */
900          FALSE),                /* pcrel_offset */
901
902   /* Like R_NDS32_PCREL, but referring to the procedure linkage table
903      entry for the symbol.  */
904   HOWTO (R_NDS32_25_PLTREL,     /* type */
905          1,                     /* rightshift */
906          2,                     /* size (0 = byte, 1 = short, 2 = long) */
907          24,                    /* bitsize */
908          TRUE,                  /* pc_relative */
909          0,                     /* bitpos */
910          complain_overflow_signed,      /* complain_on_overflow */
911          bfd_elf_generic_reloc, /* special_function */
912          "R_NDS32_25_PLTREL",   /* name */
913          FALSE,                 /* partial_inplace */
914          0xffffff,              /* src_mask */
915          0xffffff,              /* dst_mask */
916          TRUE),                 /* pcrel_offset */
917
918   /* This is used only by the dynamic linker.  The symbol should exist
919      both in the object being run and in some shared library.  The
920      dynamic linker copies the data addressed by the symbol from the
921      shared library into the object, because the object being
922      run has to have the data at some particular address.  */
923   HOWTO (R_NDS32_COPY,          /* type */
924          0,                     /* rightshift */
925          2,                     /* size (0 = byte, 1 = short, 2 = long) */
926          32,                    /* bitsize */
927          FALSE,                 /* pc_relative */
928          0,                     /* bitpos */
929          complain_overflow_bitfield,    /* complain_on_overflow */
930          bfd_elf_generic_reloc, /* special_function */
931          "R_NDS32_COPY",        /* name */
932          FALSE,                 /* partial_inplace */
933          0xffffffff,            /* src_mask */
934          0xffffffff,            /* dst_mask */
935          FALSE),                /* pcrel_offset */
936
937   /* Like R_NDS32_20, but used when setting global offset table
938      entries.  */
939   HOWTO (R_NDS32_GLOB_DAT,      /* type */
940          0,                     /* rightshift */
941          2,                     /* size (0 = byte, 1 = short, 2 = long) */
942          32,                    /* bitsize */
943          FALSE,                 /* pc_relative */
944          0,                     /* bitpos */
945          complain_overflow_bitfield,    /* complain_on_overflow */
946          bfd_elf_generic_reloc, /* special_function */
947          "R_NDS32_GLOB_DAT",    /* name */
948          FALSE,                 /* partial_inplace */
949          0xffffffff,            /* src_mask */
950          0xffffffff,            /* dst_mask */
951          FALSE),                /* pcrel_offset */
952
953   /* Marks a procedure linkage table entry for a symbol.  */
954   HOWTO (R_NDS32_JMP_SLOT,      /* type */
955          0,                     /* rightshift */
956          2,                     /* size (0 = byte, 1 = short, 2 = long) */
957          32,                    /* bitsize */
958          FALSE,                 /* pc_relative */
959          0,                     /* bitpos */
960          complain_overflow_bitfield,    /* complain_on_overflow */
961          bfd_elf_generic_reloc, /* special_function */
962          "R_NDS32_JMP_SLOT",    /* name */
963          FALSE,                 /* partial_inplace */
964          0xffffffff,            /* src_mask */
965          0xffffffff,            /* dst_mask */
966          FALSE),                /* pcrel_offset */
967
968   /* Used only by the dynamic linker.  When the object is run, this
969      longword is set to the load address of the object, plus the
970      addend.  */
971   HOWTO (R_NDS32_RELATIVE,      /* type */
972          0,                     /* rightshift */
973          2,                     /* size (0 = byte, 1 = short, 2 = long) */
974          32,                    /* bitsize */
975          FALSE,                 /* pc_relative */
976          0,                     /* bitpos */
977          complain_overflow_bitfield,    /* complain_on_overflow */
978          bfd_elf_generic_reloc, /* special_function */
979          "R_NDS32_RELATIVE",    /* name */
980          FALSE,                 /* partial_inplace */
981          0xffffffff,            /* src_mask */
982          0xffffffff,            /* dst_mask */
983          FALSE),                /* pcrel_offset */
984
985   HOWTO (R_NDS32_GOTOFF,        /* type */
986          0,                     /* rightshift */
987          2,                     /* size (0 = byte, 1 = short, 2 = long) */
988          20,                    /* bitsize */
989          FALSE,                 /* pc_relative */
990          0,                     /* bitpos */
991          complain_overflow_signed,      /* complain_on_overflow */
992          bfd_elf_generic_reloc, /* special_function */
993          "R_NDS32_GOTOFF",      /* name */
994          FALSE,                 /* partial_inplace */
995          0xfffff,               /* src_mask */
996          0xfffff,               /* dst_mask */
997          FALSE),                /* pcrel_offset */
998
999   /* An PC Relative 20-bit relocation used when setting PIC offset
1000      table register.  */
1001   HOWTO (R_NDS32_GOTPC20,       /* type */
1002          0,                     /* rightshift */
1003          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1004          20,                    /* bitsize */
1005          TRUE,                  /* pc_relative */
1006          0,                     /* bitpos */
1007          complain_overflow_signed,      /* complain_on_overflow */
1008          bfd_elf_generic_reloc, /* special_function */
1009          "R_NDS32_GOTPC20",     /* name */
1010          FALSE,                 /* partial_inplace */
1011          0xfffff,               /* src_mask */
1012          0xfffff,               /* dst_mask */
1013          TRUE),                 /* pcrel_offset */
1014
1015   /* Like R_NDS32_HI20, but referring to the GOT table entry for
1016      the symbol.  */
1017   HOWTO (R_NDS32_GOT_HI20,      /* type */
1018          12,                    /* rightshift */
1019          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1020          20,                    /* bitsize */
1021          FALSE,                 /* pc_relative */
1022          0,                     /* bitpos */
1023          complain_overflow_dont,/* complain_on_overflow */
1024          bfd_elf_generic_reloc, /* special_function */
1025          "R_NDS32_GOT_HI20",    /* name */
1026          FALSE,                 /* partial_inplace */
1027          0x000fffff,            /* src_mask */
1028          0x000fffff,            /* dst_mask */
1029          FALSE),                /* pcrel_offset */
1030   HOWTO (R_NDS32_GOT_LO12,      /* type */
1031          0,                     /* rightshift */
1032          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1033          12,                    /* bitsize */
1034          FALSE,                 /* pc_relative */
1035          0,                     /* bitpos */
1036          complain_overflow_dont,/* complain_on_overflow */
1037          bfd_elf_generic_reloc, /* special_function */
1038          "R_NDS32_GOT_LO12",    /* name */
1039          FALSE,                 /* partial_inplace */
1040          0x00000fff,            /* src_mask */
1041          0x00000fff,            /* dst_mask */
1042          FALSE),                /* pcrel_offset */
1043
1044   /* An PC Relative relocation used when setting PIC offset table register.
1045      Like R_NDS32_HI20, but referring to the GOT table entry for
1046      the symbol.  */
1047   HOWTO (R_NDS32_GOTPC_HI20,    /* type */
1048          12,                    /* rightshift */
1049          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1050          20,                    /* bitsize */
1051          FALSE,                 /* pc_relative */
1052          0,                     /* bitpos */
1053          complain_overflow_dont,/* complain_on_overflow */
1054          bfd_elf_generic_reloc, /* special_function */
1055          "R_NDS32_GOTPC_HI20",  /* name */
1056          FALSE,                 /* partial_inplace */
1057          0x000fffff,            /* src_mask */
1058          0x000fffff,            /* dst_mask */
1059          TRUE),                 /* pcrel_offset */
1060   HOWTO (R_NDS32_GOTPC_LO12,    /* type */
1061          0,                     /* rightshift */
1062          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1063          12,                    /* bitsize */
1064          FALSE,                 /* pc_relative */
1065          0,                     /* bitpos */
1066          complain_overflow_dont,        /* complain_on_overflow */
1067          bfd_elf_generic_reloc, /* special_function */
1068          "R_NDS32_GOTPC_LO12",  /* name */
1069          FALSE,                 /* partial_inplace */
1070          0x00000fff,            /* src_mask */
1071          0x00000fff,            /* dst_mask */
1072          TRUE),                 /* pcrel_offset */
1073
1074   HOWTO (R_NDS32_GOTOFF_HI20,   /* type */
1075          12,                    /* rightshift */
1076          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1077          20,                    /* bitsize */
1078          FALSE,                 /* pc_relative */
1079          0,                     /* bitpos */
1080          complain_overflow_dont,/* complain_on_overflow */
1081          bfd_elf_generic_reloc, /* special_function */
1082          "R_NDS32_GOTOFF_HI20", /* name */
1083          FALSE,                 /* partial_inplace */
1084          0x000fffff,            /* src_mask */
1085          0x000fffff,            /* dst_mask */
1086          FALSE),                /* pcrel_offset */
1087   HOWTO (R_NDS32_GOTOFF_LO12,   /* type */
1088          0,                     /* rightshift */
1089          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1090          12,                    /* bitsize */
1091          FALSE,                 /* pc_relative */
1092          0,                     /* bitpos */
1093          complain_overflow_dont,/* complain_on_overflow */
1094          bfd_elf_generic_reloc, /* special_function */
1095          "R_NDS32_GOTOFF_LO12", /* name */
1096          FALSE,                 /* partial_inplace */
1097          0x00000fff,            /* src_mask */
1098          0x00000fff,            /* dst_mask */
1099          FALSE),                /* pcrel_offset */
1100
1101   /* Alignment hint for relaxable instruction.  This is used with
1102      R_NDS32_LABEL as a pair.  Relax this instruction from 4 bytes to 2
1103      in order to make next label aligned on word boundary.  */
1104   HOWTO (R_NDS32_INSN16,        /* type */
1105          0,                     /* rightshift */
1106          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1107          32,                    /* bitsize */
1108          FALSE,                 /* pc_relative */
1109          0,                     /* bitpos */
1110          complain_overflow_dont,/* complain_on_overflow */
1111          nds32_elf_ignore_reloc,/* special_function */
1112          "R_NDS32_INSN16",      /* name */
1113          FALSE,                 /* partial_inplace */
1114          0x00000fff,            /* src_mask */
1115          0x00000fff,            /* dst_mask */
1116          FALSE),                /* pcrel_offset */
1117
1118   /* Alignment hint for label.  */
1119   HOWTO (R_NDS32_LABEL,         /* type */
1120          0,                     /* rightshift */
1121          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1122          32,                    /* bitsize */
1123          FALSE,                 /* pc_relative */
1124          0,                     /* bitpos */
1125          complain_overflow_dont,/* complain_on_overflow */
1126          nds32_elf_ignore_reloc,/* special_function */
1127          "R_NDS32_LABEL",       /* name */
1128          FALSE,                 /* partial_inplace */
1129          0xffffffff,            /* src_mask */
1130          0xffffffff,            /* dst_mask */
1131          FALSE),                /* pcrel_offset */
1132
1133   /* Relax hint for unconditional call sequence  */
1134   HOWTO (R_NDS32_LONGCALL1,     /* type */
1135          0,                     /* rightshift */
1136          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1137          32,                    /* bitsize */
1138          FALSE,                 /* pc_relative */
1139          0,                     /* bitpos */
1140          complain_overflow_dont,/* complain_on_overflow */
1141          nds32_elf_ignore_reloc,/* special_function */
1142          "R_NDS32_LONGCALL1",   /* name */
1143          FALSE,                 /* partial_inplace */
1144          0xffffffff,            /* src_mask */
1145          0xffffffff,            /* dst_mask */
1146          FALSE),                /* pcrel_offset */
1147
1148   /* Relax hint for conditional call sequence.  */
1149   HOWTO (R_NDS32_LONGCALL2,     /* type */
1150          0,                     /* rightshift */
1151          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1152          32,                    /* bitsize */
1153          FALSE,                 /* pc_relative */
1154          0,                     /* bitpos */
1155          complain_overflow_dont,/* complain_on_overflow */
1156          nds32_elf_ignore_reloc,/* special_function */
1157          "R_NDS32_LONGCALL2",   /* name */
1158          FALSE,                 /* partial_inplace */
1159          0xffffffff,            /* src_mask */
1160          0xffffffff,            /* dst_mask */
1161          FALSE),                /* pcrel_offset */
1162
1163   /* Relax hint for conditional call sequence.  */
1164   HOWTO (R_NDS32_LONGCALL3,     /* type */
1165          0,                     /* rightshift */
1166          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1167          32,                    /* bitsize */
1168          FALSE,                 /* pc_relative */
1169          0,                     /* bitpos */
1170          complain_overflow_dont,/* complain_on_overflow */
1171          nds32_elf_ignore_reloc,/* special_function */
1172          "R_NDS32_LONGCALL3",   /* name */
1173          FALSE,                 /* partial_inplace */
1174          0xffffffff,            /* src_mask */
1175          0xffffffff,            /* dst_mask */
1176          FALSE),                /* pcrel_offset */
1177
1178   /* Relax hint for unconditional branch sequence.  */
1179   HOWTO (R_NDS32_LONGJUMP1,     /* type */
1180          0,                     /* rightshift */
1181          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1182          32,                    /* bitsize */
1183          FALSE,                 /* pc_relative */
1184          0,                     /* bitpos */
1185          complain_overflow_dont,/* complain_on_overflow */
1186          nds32_elf_ignore_reloc,/* special_function */
1187          "R_NDS32_LONGJUMP1",   /* name */
1188          FALSE,                 /* partial_inplace */
1189          0xffffffff,            /* src_mask */
1190          0xffffffff,            /* dst_mask */
1191          FALSE),                /* pcrel_offset */
1192
1193   /* Relax hint for conditional branch sequence.  */
1194   HOWTO (R_NDS32_LONGJUMP2,     /* type */
1195          0,                     /* rightshift */
1196          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1197          32,                    /* bitsize */
1198          FALSE,                 /* pc_relative */
1199          0,                     /* bitpos */
1200          complain_overflow_dont,/* complain_on_overflow */
1201          nds32_elf_ignore_reloc,/* special_function */
1202          "R_NDS32_LONGJUMP2",   /* name */
1203          FALSE,                 /* partial_inplace */
1204          0xffffffff,            /* src_mask */
1205          0xffffffff,            /* dst_mask */
1206          FALSE),                /* pcrel_offset */
1207
1208   /* Relax hint for conditional branch sequence.  */
1209   HOWTO (R_NDS32_LONGJUMP3,     /* type */
1210          0,                     /* rightshift */
1211          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1212          32,                    /* bitsize */
1213          FALSE,                 /* pc_relative */
1214          0,                     /* bitpos */
1215          complain_overflow_dont,/* complain_on_overflow */
1216          nds32_elf_ignore_reloc,/* special_function */
1217          "R_NDS32_LONGJUMP3",   /* name */
1218          FALSE,                 /* partial_inplace */
1219          0xffffffff,            /* src_mask */
1220          0xffffffff,            /* dst_mask */
1221          FALSE),                /* pcrel_offset */
1222
1223   /* Relax hint for load/store sequence.   */
1224   HOWTO (R_NDS32_LOADSTORE,     /* type */
1225          0,                     /* rightshift */
1226          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1227          32,                    /* bitsize */
1228          FALSE,                 /* pc_relative */
1229          0,                     /* bitpos */
1230          complain_overflow_dont,/* complain_on_overflow */
1231          nds32_elf_ignore_reloc,/* special_function */
1232          "R_NDS32_LOADSTORE",   /* name */
1233          FALSE,                 /* partial_inplace */
1234          0xffffffff,            /* src_mask */
1235          0xffffffff,            /* dst_mask */
1236          FALSE),                /* pcrel_offset */
1237
1238   /* Relax hint for load/store sequence.  */
1239   HOWTO (R_NDS32_9_FIXED_RELA,  /* type */
1240          0,                     /* rightshift */
1241          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1242          16,                    /* bitsize */
1243          FALSE,                 /* pc_relative */
1244          0,                     /* bitpos */
1245          complain_overflow_dont,/* complain_on_overflow */
1246          nds32_elf_ignore_reloc,/* special_function */
1247          "R_NDS32_9_FIXED_RELA",/* name */
1248          FALSE,                 /* partial_inplace */
1249          0x000000ff,            /* src_mask */
1250          0x000000ff,            /* dst_mask */
1251          FALSE),                /* pcrel_offset */
1252
1253   /* Relax hint for load/store sequence.  */
1254   HOWTO (R_NDS32_15_FIXED_RELA, /* type */
1255          0,                     /* rightshift */
1256          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1257          32,                    /* bitsize */
1258          FALSE,                 /* pc_relative */
1259          0,                     /* bitpos */
1260          complain_overflow_dont,/* complain_on_overflow */
1261          nds32_elf_ignore_reloc,/* special_function */
1262          "R_NDS32_15_FIXED_RELA",       /* name */
1263          FALSE,                 /* partial_inplace */
1264          0x00003fff,            /* src_mask */
1265          0x00003fff,            /* dst_mask */
1266          FALSE),                /* pcrel_offset */
1267
1268   /* Relax hint for load/store sequence.  */
1269   HOWTO (R_NDS32_17_FIXED_RELA, /* type */
1270          0,                     /* rightshift */
1271          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1272          32,                    /* bitsize */
1273          FALSE,                 /* pc_relative */
1274          0,                     /* bitpos */
1275          complain_overflow_dont,/* complain_on_overflow */
1276          nds32_elf_ignore_reloc,/* special_function */
1277          "R_NDS32_17_FIXED_RELA",       /* name */
1278          FALSE,                 /* partial_inplace */
1279          0x0000ffff,            /* src_mask */
1280          0x0000ffff,            /* dst_mask */
1281          FALSE),                /* pcrel_offset */
1282
1283   /* Relax hint for load/store sequence.  */
1284   HOWTO (R_NDS32_25_FIXED_RELA, /* type */
1285          0,                     /* rightshift */
1286          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1287          32,                    /* bitsize */
1288          FALSE,                 /* pc_relative */
1289          0,                     /* bitpos */
1290          complain_overflow_dont,/* complain_on_overflow */
1291          nds32_elf_ignore_reloc,/* special_function */
1292          "R_NDS32_25_FIXED_RELA",       /* name */
1293          FALSE,                 /* partial_inplace */
1294          0x00ffffff,            /* src_mask */
1295          0x00ffffff,            /* dst_mask */
1296          FALSE),                /* pcrel_offset */
1297
1298   /* High 20 bits of PLT symbol offset relative to PC.  */
1299   HOWTO (R_NDS32_PLTREL_HI20,   /* type */
1300          12,                    /* rightshift */
1301          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1302          20,                    /* bitsize */
1303          FALSE,                 /* pc_relative */
1304          0,                     /* bitpos */
1305          complain_overflow_dont,/* complain_on_overflow */
1306          bfd_elf_generic_reloc, /* special_function */
1307          "R_NDS32_PLTREL_HI20", /* name */
1308          FALSE,                 /* partial_inplace */
1309          0x000fffff,            /* src_mask */
1310          0x000fffff,            /* dst_mask */
1311          FALSE),                /* pcrel_offset */
1312
1313   /* Low 12 bits of PLT symbol offset relative to PC.  */
1314   HOWTO (R_NDS32_PLTREL_LO12,   /* type */
1315          0,                     /* rightshift */
1316          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1317          12,                    /* bitsize */
1318          FALSE,                 /* pc_relative */
1319          0,                     /* bitpos */
1320          complain_overflow_dont,/* complain_on_overflow */
1321          bfd_elf_generic_reloc, /* special_function */
1322          "R_NDS32_PLTREL_LO12", /* name */
1323          FALSE,                 /* partial_inplace */
1324          0x00000fff,            /* src_mask */
1325          0x00000fff,            /* dst_mask */
1326          FALSE),                /* pcrel_offset */
1327
1328   /* High 20 bits of PLT symbol offset relative to GOT (GP).  */
1329   HOWTO (R_NDS32_PLT_GOTREL_HI20,       /* type */
1330          12,                    /* rightshift */
1331          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1332          20,                    /* bitsize */
1333          FALSE,                 /* pc_relative */
1334          0,                     /* bitpos */
1335          complain_overflow_dont,/* complain_on_overflow */
1336          bfd_elf_generic_reloc, /* special_function */
1337          "R_NDS32_PLT_GOTREL_HI20",     /* name */
1338          FALSE,                 /* partial_inplace */
1339          0x000fffff,            /* src_mask */
1340          0x000fffff,            /* dst_mask */
1341          FALSE),                /* pcrel_offset */
1342
1343   /* Low 12 bits of PLT symbol offset relative to GOT (GP).  */
1344   HOWTO (R_NDS32_PLT_GOTREL_LO12,       /* type */
1345          0,                     /* rightshift */
1346          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1347          12,                    /* bitsize */
1348          FALSE,                 /* pc_relative */
1349          0,                     /* bitpos */
1350          complain_overflow_dont,/* complain_on_overflow */
1351          bfd_elf_generic_reloc, /* special_function */
1352          "R_NDS32_PLT_GOTREL_LO12",     /* name */
1353          FALSE,                 /* partial_inplace */
1354          0x00000fff,            /* src_mask */
1355          0x00000fff,            /* dst_mask */
1356          FALSE),                /* pcrel_offset */
1357
1358   /* Small data area 12 bits offset.  */
1359   HOWTO (R_NDS32_SDA12S2_DP_RELA,       /* type */
1360          2,                     /* rightshift */
1361          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1362          12,                    /* bitsize */
1363          FALSE,                 /* pc_relative */
1364          0,                     /* bitpos */
1365          complain_overflow_signed,      /* complain_on_overflow */
1366          bfd_elf_generic_reloc, /* special_function */
1367          "R_NDS32_SDA12S2_DP_RELA",     /* name */
1368          FALSE,                 /* partial_inplace */
1369          0x00000fff,            /* src_mask */
1370          0x00000fff,            /* dst_mask */
1371          FALSE),                /* pcrel_offset */
1372
1373   /* Small data area 12 bits offset.  */
1374   HOWTO (R_NDS32_SDA12S2_SP_RELA,       /* type */
1375          2,                     /* rightshift */
1376          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1377          12,                    /* bitsize */
1378          FALSE,                 /* pc_relative */
1379          0,                     /* bitpos */
1380          complain_overflow_signed,      /* complain_on_overflow */
1381          bfd_elf_generic_reloc, /* special_function */
1382          "R_NDS32_SDA12S2_SP_RELA",     /* name */
1383          FALSE,                 /* partial_inplace */
1384          0x00000fff,            /* src_mask */
1385          0x00000fff,            /* dst_mask */
1386          FALSE),                /* pcrel_offset */
1387   /* Lower 12 bits of address.  */
1388
1389   HOWTO (R_NDS32_LO12S2_DP_RELA,        /* type */
1390          2,                     /* rightshift */
1391          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1392          10,                    /* bitsize */
1393          FALSE,                 /* pc_relative */
1394          0,                     /* bitpos */
1395          complain_overflow_dont,/* complain_on_overflow */
1396          bfd_elf_generic_reloc, /* special_function */
1397          "R_NDS32_LO12S2_DP_RELA",      /* name */
1398          FALSE,                 /* partial_inplace */
1399          0x000003ff,            /* src_mask */
1400          0x000003ff,            /* dst_mask */
1401          FALSE),                /* pcrel_offset */
1402
1403   /* Lower 12 bits of address.  */
1404   HOWTO (R_NDS32_LO12S2_SP_RELA,/* type */
1405          2,                     /* rightshift */
1406          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1407          10,                    /* bitsize */
1408          FALSE,                 /* pc_relative */
1409          0,                     /* bitpos */
1410          complain_overflow_dont,/* complain_on_overflow */
1411          bfd_elf_generic_reloc, /* special_function */
1412          "R_NDS32_LO12S2_SP_RELA",      /* name */
1413          FALSE,                 /* partial_inplace */
1414          0x000003ff,            /* src_mask */
1415          0x000003ff,            /* dst_mask */
1416          FALSE),                /* pcrel_offset */
1417   /* Lower 12 bits of address.  Special identity for or case.  */
1418   HOWTO (R_NDS32_LO12S0_ORI_RELA,       /* type */
1419          0,                     /* rightshift */
1420          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1421          12,                    /* bitsize */
1422          FALSE,                 /* pc_relative */
1423          0,                     /* bitpos */
1424          complain_overflow_dont,/* complain_on_overflow */
1425          bfd_elf_generic_reloc, /* special_function */
1426          "R_NDS32_LO12S0_ORI_RELA",     /* name */
1427          FALSE,                 /* partial_inplace */
1428          0x00000fff,            /* src_mask */
1429          0x00000fff,            /* dst_mask */
1430          FALSE),                /* pcrel_offset */
1431   /* Small data area 19 bits offset.  */
1432   HOWTO (R_NDS32_SDA16S3_RELA,  /* type */
1433          3,                     /* rightshift */
1434          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1435          16,                    /* bitsize */
1436          FALSE,                 /* pc_relative */
1437          0,                     /* bitpos */
1438          complain_overflow_signed,      /* complain_on_overflow */
1439          bfd_elf_generic_reloc, /* special_function */
1440          "R_NDS32_SDA16S3_RELA",/* name */
1441          FALSE,                 /* partial_inplace */
1442          0x0000ffff,            /* src_mask */
1443          0x0000ffff,            /* dst_mask */
1444          FALSE),                /* pcrel_offset */
1445
1446   /* Small data area 15 bits offset.  */
1447   HOWTO (R_NDS32_SDA17S2_RELA,  /* type */
1448          2,                     /* rightshift */
1449          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1450          17,                    /* bitsize */
1451          FALSE,                 /* pc_relative */
1452          0,                     /* bitpos */
1453          complain_overflow_signed,      /* complain_on_overflow */
1454          bfd_elf_generic_reloc, /* special_function */
1455          "R_NDS32_SDA17S2_RELA",/* name */
1456          FALSE,                 /* partial_inplace */
1457          0x0001ffff,            /* src_mask */
1458          0x0001ffff,            /* dst_mask */
1459          FALSE),                /* pcrel_offset */
1460
1461   HOWTO (R_NDS32_SDA18S1_RELA,  /* type */
1462          1,                     /* rightshift */
1463          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1464          18,                    /* bitsize */
1465          FALSE,                 /* pc_relative */
1466          0,                     /* bitpos */
1467          complain_overflow_signed,      /* complain_on_overflow */
1468          bfd_elf_generic_reloc, /* special_function */
1469          "R_NDS32_SDA18S1_RELA",/* name */
1470          FALSE,                 /* partial_inplace */
1471          0x0003ffff,            /* src_mask */
1472          0x0003ffff,            /* dst_mask */
1473          FALSE),                /* pcrel_offset */
1474
1475   HOWTO (R_NDS32_SDA19S0_RELA,  /* type */
1476          0,                     /* rightshift */
1477          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1478          19,                    /* bitsize */
1479          FALSE,                 /* pc_relative */
1480          0,                     /* bitpos */
1481          complain_overflow_signed,      /* complain_on_overflow */
1482          bfd_elf_generic_reloc, /* special_function */
1483          "R_NDS32_SDA19S0_RELA",/* name */
1484          FALSE,                 /* partial_inplace */
1485          0x0007ffff,            /* src_mask */
1486          0x0007ffff,            /* dst_mask */
1487          FALSE),                /* pcrel_offset */
1488   HOWTO (R_NDS32_DWARF2_OP1_RELA,       /* type */
1489          0,                     /* rightshift */
1490          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1491          8,                     /* bitsize */
1492          FALSE,                 /* pc_relative */
1493          0,                     /* bitpos */
1494          complain_overflow_dont,/* complain_on_overflow */
1495          nds32_elf_ignore_reloc,/* special_function */
1496          "R_NDS32_DWARF2_OP1_RELA",     /* name */
1497          FALSE,                 /* partial_inplace */
1498          0xff,                  /* src_mask */
1499          0xff,                  /* dst_mask */
1500          FALSE),                /* pcrel_offset */
1501   HOWTO (R_NDS32_DWARF2_OP2_RELA,       /* type */
1502          0,                     /* rightshift */
1503          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1504          16,                    /* bitsize */
1505          FALSE,                 /* pc_relative */
1506          0,                     /* bitpos */
1507          complain_overflow_dont,/* complain_on_overflow */
1508          nds32_elf_ignore_reloc,/* special_function */
1509          "R_NDS32_DWARF2_OP2_RELA",     /* name */
1510          FALSE,                 /* partial_inplace */
1511          0xffff,                /* src_mask */
1512          0xffff,                /* dst_mask */
1513          FALSE),                /* pcrel_offset */
1514   HOWTO (R_NDS32_DWARF2_LEB_RELA,       /* type */
1515          0,                     /* rightshift */
1516          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1517          32,                    /* bitsize */
1518          FALSE,                 /* pc_relative */
1519          0,                     /* bitpos */
1520          complain_overflow_dont,/* complain_on_overflow */
1521          nds32_elf_ignore_reloc,/* special_function */
1522          "R_NDS32_DWARF2_LEB_RELA",     /* name */
1523          FALSE,                 /* partial_inplace */
1524          0xffffffff,            /* src_mask */
1525          0xffffffff,            /* dst_mask */
1526          FALSE),                /* pcrel_offset */
1527   HOWTO (R_NDS32_UPDATE_TA_RELA,/* type */
1528          0,                     /* rightshift */
1529          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1530          16,                    /* bitsize */
1531          FALSE,                 /* pc_relative */
1532          0,                     /* bitpos */
1533          complain_overflow_dont,/* complain_on_overflow */
1534          nds32_elf_ignore_reloc,/* special_function */
1535          "R_NDS32_UPDATE_TA_RELA",      /* name */
1536          FALSE,                 /* partial_inplace */
1537          0xffff,                /* src_mask */
1538          0xffff,                /* dst_mask */
1539          FALSE),                /* pcrel_offset */
1540   /* Like R_NDS32_PCREL, but referring to the procedure linkage table
1541      entry for the symbol.  */
1542   HOWTO (R_NDS32_9_PLTREL,      /* type */
1543          1,                     /* rightshift */
1544          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1545          8,                     /* bitsize */
1546          TRUE,                  /* pc_relative */
1547          0,                     /* bitpos */
1548          complain_overflow_signed,      /* complain_on_overflow */
1549          bfd_elf_generic_reloc, /* special_function */
1550          "R_NDS32_9_PLTREL",    /* name */
1551          FALSE,                 /* partial_inplace */
1552          0xff,                  /* src_mask */
1553          0xff,                  /* dst_mask */
1554          TRUE),                 /* pcrel_offset */
1555   /* Low 20 bits of PLT symbol offset relative to GOT (GP).  */
1556   HOWTO (R_NDS32_PLT_GOTREL_LO20,       /* type */
1557          0,                     /* rightshift */
1558          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1559          20,                    /* bitsize */
1560          FALSE,                 /* pc_relative */
1561          0,                     /* bitpos */
1562          complain_overflow_dont,/* complain_on_overflow */
1563          bfd_elf_generic_reloc, /* special_function */
1564          "R_NDS32_PLT_GOTREL_LO20",     /* name */
1565          FALSE,                 /* partial_inplace */
1566          0x000fffff,            /* src_mask */
1567          0x000fffff,            /* dst_mask */
1568          FALSE),                /* pcrel_offset */
1569   /* low 15 bits of PLT symbol offset relative to GOT (GP) */
1570   HOWTO (R_NDS32_PLT_GOTREL_LO15,       /* type */
1571          0,                     /* rightshift */
1572          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1573          15,                    /* bitsize */
1574          FALSE,                 /* pc_relative */
1575          0,                     /* bitpos */
1576          complain_overflow_dont,/* complain_on_overflow */
1577          bfd_elf_generic_reloc, /* special_function */
1578          "R_NDS32_PLT_GOTREL_LO15",     /* name */
1579          FALSE,                 /* partial_inplace */
1580          0x00007fff,            /* src_mask */
1581          0x00007fff,            /* dst_mask */
1582          FALSE),                /* pcrel_offset */
1583   /* Low 19 bits of PLT symbol offset relative to GOT (GP).  */
1584   HOWTO (R_NDS32_PLT_GOTREL_LO19,       /* type */
1585          0,                     /* rightshift */
1586          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1587          19,                    /* bitsize */
1588          FALSE,                 /* pc_relative */
1589          0,                     /* bitpos */
1590          complain_overflow_dont,/* complain_on_overflow */
1591          bfd_elf_generic_reloc, /* special_function */
1592          "R_NDS32_PLT_GOTREL_LO19",     /* name */
1593          FALSE,                 /* partial_inplace */
1594          0x0007ffff,            /* src_mask */
1595          0x0007ffff,            /* dst_mask */
1596          FALSE),                /* pcrel_offset */
1597   HOWTO (R_NDS32_GOT_LO15,      /* type */
1598          0,                     /* rightshift */
1599          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1600          15,                    /* bitsize */
1601          FALSE,                 /* pc_relative */
1602          0,                     /* bitpos */
1603          complain_overflow_dont,/* complain_on_overflow */
1604          bfd_elf_generic_reloc, /* special_function */
1605          "R_NDS32_GOT_LO15",    /* name */
1606          FALSE,                 /* partial_inplace */
1607          0x00007fff,            /* src_mask */
1608          0x00007fff,            /* dst_mask */
1609          FALSE),                /* pcrel_offset */
1610   HOWTO (R_NDS32_GOT_LO19,      /* type */
1611          0,                     /* rightshift */
1612          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1613          19,                    /* bitsize */
1614          FALSE,                 /* pc_relative */
1615          0,                     /* bitpos */
1616          complain_overflow_dont,/* complain_on_overflow */
1617          bfd_elf_generic_reloc, /* special_function */
1618          "R_NDS32_GOT_LO19",    /* name */
1619          FALSE,                 /* partial_inplace */
1620          0x0007ffff,            /* src_mask */
1621          0x0007ffff,            /* dst_mask */
1622          FALSE),                /* pcrel_offset */
1623   HOWTO (R_NDS32_GOTOFF_LO15,   /* type */
1624          0,                     /* rightshift */
1625          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1626          15,                    /* bitsize */
1627          FALSE,                 /* pc_relative */
1628          0,                     /* bitpos */
1629          complain_overflow_dont,/* complain_on_overflow */
1630          bfd_elf_generic_reloc, /* special_function */
1631          "R_NDS32_GOTOFF_LO15", /* name */
1632          FALSE,                 /* partial_inplace */
1633          0x00007fff,            /* src_mask */
1634          0x00007fff,            /* dst_mask */
1635          FALSE),                /* pcrel_offset */
1636   HOWTO (R_NDS32_GOTOFF_LO19,   /* type */
1637          0,                     /* rightshift */
1638          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1639          19,                    /* bitsize */
1640          FALSE,                 /* pc_relative */
1641          0,                     /* bitpos */
1642          complain_overflow_dont,/* complain_on_overflow */
1643          bfd_elf_generic_reloc, /* special_function */
1644          "R_NDS32_GOTOFF_LO19", /* name */
1645          FALSE,                 /* partial_inplace */
1646          0x0007ffff,            /* src_mask */
1647          0x0007ffff,            /* dst_mask */
1648          FALSE),                /* pcrel_offset */
1649   /* GOT 15 bits offset.  */
1650   HOWTO (R_NDS32_GOT15S2_RELA,  /* type */
1651          2,                     /* rightshift */
1652          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1653          15,                    /* bitsize */
1654          FALSE,                 /* pc_relative */
1655          0,                     /* bitpos */
1656          complain_overflow_signed,      /* complain_on_overflow */
1657          bfd_elf_generic_reloc, /* special_function */
1658          "R_NDS32_GOT15S2_RELA",/* name */
1659          FALSE,                 /* partial_inplace */
1660          0x00007fff,            /* src_mask */
1661          0x00007fff,            /* dst_mask */
1662          FALSE),                /* pcrel_offset */
1663   /* GOT 17 bits offset.  */
1664   HOWTO (R_NDS32_GOT17S2_RELA,  /* type */
1665          2,                     /* rightshift */
1666          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1667          17,                    /* bitsize */
1668          FALSE,                 /* pc_relative */
1669          0,                     /* bitpos */
1670          complain_overflow_signed,      /* complain_on_overflow */
1671          bfd_elf_generic_reloc, /* special_function */
1672          "R_NDS32_GOT17S2_RELA",/* name */
1673          FALSE,                 /* partial_inplace */
1674          0x0001ffff,            /* src_mask */
1675          0x0001ffff,            /* dst_mask */
1676          FALSE),                /* pcrel_offset */
1677   /* A 5 bit address.  */
1678   HOWTO (R_NDS32_5_RELA,        /* type */
1679          0,                     /* rightshift */
1680          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1681          5,                     /* bitsize */
1682          FALSE,                 /* pc_relative */
1683          0,                     /* bitpos */
1684          complain_overflow_signed,      /* complain_on_overflow */
1685          bfd_elf_generic_reloc, /* special_function */
1686          "R_NDS32_5_RELA",      /* name */
1687          FALSE,                 /* partial_inplace */
1688          0x1f,                  /* src_mask */
1689          0x1f,                  /* dst_mask */
1690          FALSE),                /* pcrel_offset */
1691   HOWTO (R_NDS32_10_UPCREL_RELA,/* type */
1692          1,                     /* rightshift */
1693          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1694          9,                     /* bitsize */
1695          TRUE,                  /* pc_relative */
1696          0,                     /* bitpos */
1697          complain_overflow_unsigned,    /* complain_on_overflow */
1698          bfd_elf_generic_reloc, /* special_function */
1699          "R_NDS32_10_UPCREL_RELA",      /* name */
1700          FALSE,                 /* partial_inplace */
1701          0x1ff,                 /* src_mask */
1702          0x1ff,                 /* dst_mask */
1703          TRUE),                 /* pcrel_offset */
1704   HOWTO (R_NDS32_SDA_FP7U2_RELA,/* type */
1705          2,                     /* rightshift */
1706          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1707          7,                     /* bitsize */
1708          FALSE,                 /* pc_relative */
1709          0,                     /* bitpos */
1710          complain_overflow_unsigned,    /* complain_on_overflow */
1711          bfd_elf_generic_reloc, /* special_function */
1712          "R_NDS32_SDA_FP7U2_RELA",      /* name */
1713          FALSE,                 /* partial_inplace */
1714          0x0000007f,            /* src_mask */
1715          0x0000007f,            /* dst_mask */
1716          FALSE),                /* pcrel_offset */
1717   HOWTO (R_NDS32_WORD_9_PCREL_RELA,     /* type */
1718          1,                     /* rightshift */
1719          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1720          8,                     /* bitsize */
1721          TRUE,                  /* pc_relative */
1722          0,                     /* bitpos */
1723          complain_overflow_signed,      /* complain_on_overflow */
1724          bfd_elf_generic_reloc, /* special_function */
1725          "R_NDS32_WORD_9_PCREL_RELA",   /* name */
1726          FALSE,                 /* partial_inplace */
1727          0xff,                  /* src_mask */
1728          0xff,                  /* dst_mask */
1729          TRUE),                 /* pcrel_offset */
1730   HOWTO (R_NDS32_25_ABS_RELA,   /* type */
1731          1,                     /* rightshift */
1732          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1733          24,                    /* bitsize */
1734          FALSE,                 /* pc_relative */
1735          0,                     /* bitpos */
1736          complain_overflow_dont,/* complain_on_overflow */
1737          bfd_elf_generic_reloc, /* special_function */
1738          "R_NDS32_25_ABS_RELA", /* name */
1739          FALSE,                 /* partial_inplace */
1740          0xffffff,              /* src_mask */
1741          0xffffff,              /* dst_mask */
1742          FALSE),                /* pcrel_offset */
1743
1744   /* A relative 17 bit relocation for ifc, right shifted by 1.  */
1745   HOWTO (R_NDS32_17IFC_PCREL_RELA,      /* type */
1746          1,                     /* rightshift */
1747          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1748          16,                    /* bitsize */
1749          TRUE,                  /* pc_relative */
1750          0,                     /* bitpos */
1751          complain_overflow_signed,      /* complain_on_overflow */
1752          bfd_elf_generic_reloc, /* special_function */
1753          "R_NDS32_17IFC_PCREL_RELA",    /* name */
1754          FALSE,                 /* partial_inplace */
1755          0xffff,                /* src_mask */
1756          0xffff,                /* dst_mask */
1757          TRUE),                 /* pcrel_offset */
1758
1759   /* A relative unsigned 10 bit relocation for ifc, right shifted by 1.  */
1760   HOWTO (R_NDS32_10IFCU_PCREL_RELA,     /* type */
1761          1,                     /* rightshift */
1762          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1763          9,                     /* bitsize */
1764          TRUE,                  /* pc_relative */
1765          0,                     /* bitpos */
1766          complain_overflow_unsigned,    /* complain_on_overflow */
1767          bfd_elf_generic_reloc, /* special_function */
1768          "R_NDS32_10IFCU_PCREL_RELA",   /* name */
1769          FALSE,                 /* partial_inplace */
1770          0x1ff,                 /* src_mask */
1771          0x1ff,                 /* dst_mask */
1772          TRUE),                 /* pcrel_offset */
1773
1774   /* Like R_NDS32_HI20, but referring to the TLS entry for the symbol.  */
1775   HOWTO (R_NDS32_TLS_LE_HI20,   /* type */
1776          12,                    /* rightshift */
1777          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1778          20,                    /* bitsize */
1779          FALSE,                 /* pc_relative */
1780          0,                     /* bitpos */
1781          complain_overflow_dont,        /* complain_on_overflow */
1782          bfd_elf_generic_reloc, /* special_function */
1783          "R_NDS32_TLS_LE_HI20", /* name */
1784          FALSE,                 /* partial_inplace */
1785          0x000fffff,            /* src_mask */
1786          0x000fffff,            /* dst_mask */
1787          FALSE),                /* pcrel_offset */
1788   HOWTO (R_NDS32_TLS_LE_LO12,   /* type */
1789          0,                     /* rightshift */
1790          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1791          12,                    /* bitsize */
1792          FALSE,                 /* pc_relative */
1793          0,                     /* bitpos */
1794          complain_overflow_dont,        /* complain_on_overflow */
1795          bfd_elf_generic_reloc, /* special_function */
1796          "R_NDS32_TLS_LE_LO12", /* name */
1797          FALSE,                 /* partial_inplace */
1798          0x00000fff,            /* src_mask */
1799          0x00000fff,            /* dst_mask */
1800          FALSE),                /* pcrel_offset */
1801
1802   /* Like R_NDS32_HI20, but referring to the TLS entry for the symbol.  */
1803   HOWTO (R_NDS32_TLS_IE_HI20,   /* type */
1804          12,                    /* rightshift */
1805          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1806          20,                    /* bitsize */
1807          FALSE,                 /* pc_relative */
1808          0,                     /* bitpos */
1809          complain_overflow_dont,        /* complain_on_overflow */
1810          bfd_elf_generic_reloc, /* special_function */
1811          "R_NDS32_TLS_IE_HI20", /* name */
1812          FALSE,                 /* partial_inplace */
1813          0x000fffff,            /* src_mask */
1814          0x000fffff,            /* dst_mask */
1815          FALSE),                /* pcrel_offset */
1816   HOWTO (R_NDS32_TLS_IE_LO12S2, /* type */
1817          2,                     /* rightshift */
1818          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1819          10,                    /* bitsize */
1820          FALSE,                 /* pc_relative */
1821          0,                     /* bitpos */
1822          complain_overflow_dont,        /* complain_on_overflow */
1823          bfd_elf_generic_reloc, /* special_function */
1824          "R_NDS32_TLS_IE_LO12S2",       /* name */
1825          FALSE,                 /* partial_inplace */
1826          0x000003ff,            /* src_mask */
1827          0x000003ff,            /* dst_mask */
1828          FALSE),                /* pcrel_offset */
1829   /* Mark a TLS IE entry in GOT.  */
1830   HOWTO (R_NDS32_TLS_TPOFF,     /* type */
1831          0,                     /* rightshift */
1832          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1833          32,                    /* bitsize */
1834          FALSE,                 /* pc_relative */
1835          0,                     /* bitpos */
1836          complain_overflow_bitfield,    /* complain_on_overflow */
1837          bfd_elf_generic_reloc, /* special_function */
1838          "R_NDS32_TLS_TPOFF",   /* name */
1839          FALSE,                 /* partial_inplace */
1840          0xffffffff,            /* src_mask */
1841          0xffffffff,            /* dst_mask */
1842          FALSE),                /* pcrel_offset */
1843   /* A 20 bit address.  */
1844   HOWTO (R_NDS32_TLS_LE_20,     /* type */
1845          0,                     /* rightshift */
1846          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1847          20,                    /* bitsize */
1848          FALSE,         /* pc_relative */
1849          0,                     /* bitpos */
1850          complain_overflow_signed,      /* complain_on_overflow */
1851          bfd_elf_generic_reloc, /* special_function */
1852          "R_NDS32_TLS_LE_20",   /* name */
1853          FALSE,         /* partial_inplace */
1854          0xfffff,               /* src_mask */
1855          0xfffff,               /* dst_mask */
1856          FALSE),                /* pcrel_offset */
1857   HOWTO (R_NDS32_TLS_LE_15S0,   /* type */
1858          0,                     /* rightshift */
1859          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1860          15,                    /* bitsize */
1861          FALSE,         /* pc_relative */
1862          0,                     /* bitpos */
1863          complain_overflow_signed,      /* complain_on_overflow */
1864          bfd_elf_generic_reloc, /* special_function */
1865          "R_NDS32_TLS_LE_15S0", /* name */
1866          FALSE,         /* partial_inplace */
1867          0x7fff,                /* src_mask */
1868          0x7fff,                /* dst_mask */
1869          FALSE),                /* pcrel_offset */
1870   HOWTO (R_NDS32_TLS_LE_15S1,   /* type */
1871          1,                     /* rightshift */
1872          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1873          15,                    /* bitsize */
1874          FALSE,         /* pc_relative */
1875          0,                     /* bitpos */
1876          complain_overflow_signed,      /* complain_on_overflow */
1877          bfd_elf_generic_reloc, /* special_function */
1878          "R_NDS32_TLS_LE_15S1", /* name */
1879          FALSE,         /* partial_inplace */
1880          0x7fff,                /* src_mask */
1881          0x7fff,                /* dst_mask */
1882          FALSE),                /* pcrel_offset */
1883   HOWTO (R_NDS32_TLS_LE_15S2,   /* type */
1884          2,                     /* rightshift */
1885          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1886          15,                    /* bitsize */
1887          FALSE,         /* pc_relative */
1888          0,                     /* bitpos */
1889          complain_overflow_signed,      /* complain_on_overflow */
1890          bfd_elf_generic_reloc, /* special_function */
1891          "R_NDS32_TLS_LE_15S2", /* name */
1892          FALSE,         /* partial_inplace */
1893          0x7fff,                /* src_mask */
1894          0x7fff,                /* dst_mask */
1895          FALSE),                /* pcrel_offset */
1896
1897   /* Relax hint for unconditional call sequence  */
1898   HOWTO (R_NDS32_LONGCALL4,     /* type */
1899          0,                     /* rightshift */
1900          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1901          32,                    /* bitsize */
1902          FALSE,                 /* pc_relative */
1903          0,                     /* bitpos */
1904          complain_overflow_dont,        /* complain_on_overflow */
1905          nds32_elf_ignore_reloc,        /* special_function */
1906          "R_NDS32_LONGCALL4",   /* name */
1907          FALSE,                 /* partial_inplace */
1908          0xffffffff,            /* src_mask */
1909          0xffffffff,            /* dst_mask */
1910          FALSE),                /* pcrel_offset */
1911
1912   /* Relax hint for conditional call sequence.  */
1913   HOWTO (R_NDS32_LONGCALL5,     /* type */
1914          0,                     /* rightshift */
1915          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1916          32,                    /* bitsize */
1917          FALSE,                 /* pc_relative */
1918          0,                     /* bitpos */
1919          complain_overflow_dont,        /* complain_on_overflow */
1920          nds32_elf_ignore_reloc,        /* special_function */
1921          "R_NDS32_LONGCALL5",   /* name */
1922          FALSE,                 /* partial_inplace */
1923          0xffffffff,            /* src_mask */
1924          0xffffffff,            /* dst_mask */
1925          FALSE),                /* pcrel_offset */
1926
1927   /* Relax hint for conditional call sequence.  */
1928   HOWTO (R_NDS32_LONGCALL6,     /* type */
1929          0,                     /* rightshift */
1930          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1931          32,                    /* bitsize */
1932          FALSE,                 /* pc_relative */
1933          0,                     /* bitpos */
1934          complain_overflow_dont,        /* complain_on_overflow */
1935          nds32_elf_ignore_reloc,        /* special_function */
1936          "R_NDS32_LONGCALL6",   /* name */
1937          FALSE,                 /* partial_inplace */
1938          0xffffffff,            /* src_mask */
1939          0xffffffff,            /* dst_mask */
1940          FALSE),                /* pcrel_offset */
1941
1942   /* Relax hint for unconditional branch sequence.  */
1943   HOWTO (R_NDS32_LONGJUMP4,     /* type */
1944          0,                     /* rightshift */
1945          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1946          32,                    /* bitsize */
1947          FALSE,                 /* pc_relative */
1948          0,                     /* bitpos */
1949          complain_overflow_dont,        /* complain_on_overflow */
1950          nds32_elf_ignore_reloc,        /* special_function */
1951          "R_NDS32_LONGJUMP4",   /* name */
1952          FALSE,                 /* partial_inplace */
1953          0xffffffff,            /* src_mask */
1954          0xffffffff,            /* dst_mask */
1955          FALSE),                /* pcrel_offset */
1956
1957   /* Relax hint for conditional branch sequence.  */
1958   HOWTO (R_NDS32_LONGJUMP5,     /* type */
1959          0,                     /* rightshift */
1960          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1961          32,                    /* bitsize */
1962          FALSE,                 /* pc_relative */
1963          0,                     /* bitpos */
1964          complain_overflow_dont,        /* complain_on_overflow */
1965          nds32_elf_ignore_reloc,        /* special_function */
1966          "R_NDS32_LONGJUMP5",   /* name */
1967          FALSE,                 /* partial_inplace */
1968          0xffffffff,            /* src_mask */
1969          0xffffffff,            /* dst_mask */
1970          FALSE),                /* pcrel_offset */
1971
1972   /* Relax hint for conditional branch sequence.  */
1973   HOWTO (R_NDS32_LONGJUMP6,     /* type */
1974          0,                     /* rightshift */
1975          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1976          32,                    /* bitsize */
1977          FALSE,                 /* pc_relative */
1978          0,                     /* bitpos */
1979          complain_overflow_dont,        /* complain_on_overflow */
1980          nds32_elf_ignore_reloc,        /* special_function */
1981          "R_NDS32_LONGJUMP6",   /* name */
1982          FALSE,                 /* partial_inplace */
1983          0xffffffff,            /* src_mask */
1984          0xffffffff,            /* dst_mask */
1985          FALSE),                /* pcrel_offset */
1986
1987   /* Relax hint for conditional branch sequence.  */
1988   HOWTO (R_NDS32_LONGJUMP7,     /* type */
1989          0,                     /* rightshift */
1990          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1991          32,                    /* bitsize */
1992          FALSE,                 /* pc_relative */
1993          0,                     /* bitpos */
1994          complain_overflow_dont,        /* complain_on_overflow */
1995          nds32_elf_ignore_reloc,        /* special_function */
1996          "R_NDS32_LONGJUMP7",   /* name */
1997          FALSE,                 /* partial_inplace */
1998          0xffffffff,            /* src_mask */
1999          0xffffffff,            /* dst_mask */
2000          FALSE),                /* pcrel_offset */
2001 };
2002
2003 /* Relocations used for relaxation.  */
2004 static reloc_howto_type nds32_elf_relax_howto_table[] =
2005 {
2006   HOWTO (R_NDS32_RELAX_ENTRY,   /* type */
2007          0,                     /* rightshift */
2008          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2009          32,                    /* bitsize */
2010          FALSE,                 /* pc_relative */
2011          0,                     /* bitpos */
2012          complain_overflow_dont,/* complain_on_overflow */
2013          nds32_elf_ignore_reloc,/* special_function */
2014          "R_NDS32_RELAX_ENTRY", /* name */
2015          FALSE,                 /* partial_inplace */
2016          0xffffffff,            /* src_mask */
2017          0xffffffff,            /* dst_mask */
2018          FALSE),                /* pcrel_offset */
2019   HOWTO (R_NDS32_GOT_SUFF,      /* type */
2020          0,                     /* rightshift */
2021          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2022          32,                    /* bitsize */
2023          FALSE,                 /* pc_relative */
2024          0,                     /* bitpos */
2025          complain_overflow_dont,/* complain_on_overflow */
2026          nds32_elf_ignore_reloc,/* special_function */
2027          "R_NDS32_GOT_SUFF",    /* name */
2028          FALSE,                 /* partial_inplace */
2029          0xffffffff,            /* src_mask */
2030          0xffffffff,            /* dst_mask */
2031          FALSE),                /* pcrel_offset */
2032   HOWTO (R_NDS32_GOTOFF_SUFF,   /* type */
2033          0,                     /* rightshift */
2034          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2035          32,                    /* bitsize */
2036          FALSE,                 /* pc_relative */
2037          0,                     /* bitpos */
2038          complain_overflow_bitfield,    /* complain_on_overflow */
2039          nds32_elf_ignore_reloc,/* special_function */
2040          "R_NDS32_GOTOFF_SUFF", /* name */
2041          FALSE,                 /* partial_inplace */
2042          0xffffffff,            /* src_mask */
2043          0xffffffff,            /* dst_mask */
2044          FALSE),                /* pcrel_offset */
2045   HOWTO (R_NDS32_PLT_GOT_SUFF,  /* type */
2046          0,                     /* rightshift */
2047          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2048          32,                    /* bitsize */
2049          FALSE,                 /* pc_relative */
2050          0,                     /* bitpos */
2051          complain_overflow_dont,/* complain_on_overflow */
2052          nds32_elf_ignore_reloc,/* special_function */
2053          "R_NDS32_PLT_GOT_SUFF",/* name */
2054          FALSE,                 /* partial_inplace */
2055          0xffffffff,            /* src_mask */
2056          0xffffffff,            /* dst_mask */
2057          FALSE),                /* pcrel_offset */
2058   HOWTO (R_NDS32_MULCALL_SUFF,  /* type */
2059          0,                     /* rightshift */
2060          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2061          32,                    /* bitsize */
2062          FALSE,                 /* pc_relative */
2063          0,                     /* bitpos */
2064          complain_overflow_dont,/* complain_on_overflow */
2065          nds32_elf_ignore_reloc,/* special_function */
2066          "R_NDS32_MULCALL_SUFF",/* name */
2067          FALSE,                 /* partial_inplace */
2068          0xffffffff,            /* src_mask */
2069          0xffffffff,            /* dst_mask */
2070          FALSE),                /* pcrel_offset */
2071   HOWTO (R_NDS32_PTR,           /* type */
2072          0,                     /* rightshift */
2073          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2074          32,                    /* bitsize */
2075          FALSE,                 /* pc_relative */
2076          0,                     /* bitpos */
2077          complain_overflow_dont,/* complain_on_overflow */
2078          nds32_elf_ignore_reloc,/* special_function */
2079          "R_NDS32_PTR",         /* name */
2080          FALSE,                 /* partial_inplace */
2081          0xffffffff,            /* src_mask */
2082          0xffffffff,            /* dst_mask */
2083          FALSE),                /* pcrel_offset */
2084   HOWTO (R_NDS32_PTR_COUNT,     /* type */
2085          0,                     /* rightshift */
2086          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2087          32,                    /* bitsize */
2088          FALSE,                 /* pc_relative */
2089          0,                     /* bitpos */
2090          complain_overflow_dont,/* complain_on_overflow */
2091          nds32_elf_ignore_reloc,/* special_function */
2092          "R_NDS32_PTR_COUNT",   /* name */
2093          FALSE,                 /* partial_inplace */
2094          0xffffffff,            /* src_mask */
2095          0xffffffff,            /* dst_mask */
2096          FALSE),                /* pcrel_offset */
2097   HOWTO (R_NDS32_PTR_RESOLVED,  /* type */
2098          0,                     /* rightshift */
2099          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2100          32,                    /* bitsize */
2101          FALSE,                 /* pc_relative */
2102          0,                     /* bitpos */
2103          complain_overflow_dont,/* complain_on_overflow */
2104          nds32_elf_ignore_reloc,/* special_function */
2105          "R_NDS32_PTR_RESOLVED",/* name */
2106          FALSE,                 /* partial_inplace */
2107          0xffffffff,            /* src_mask */
2108          0xffffffff,            /* dst_mask */
2109          FALSE),                /* pcrel_offset */
2110   HOWTO (R_NDS32_PLTBLOCK,      /* type */
2111          0,                     /* rightshift */
2112          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2113          32,                    /* bitsize */
2114          FALSE,                 /* pc_relative */
2115          0,                     /* bitpos */
2116          complain_overflow_dont,/* complain_on_overflow */
2117          nds32_elf_ignore_reloc,/* special_function */
2118          "R_NDS32_PLTBLOCK",    /* name */
2119          FALSE,                 /* partial_inplace */
2120          0xffffffff,            /* src_mask */
2121          0xffffffff,            /* dst_mask */
2122          FALSE),                /* pcrel_offset */
2123   HOWTO (R_NDS32_RELAX_REGION_BEGIN,    /* type */
2124          0,                     /* rightshift */
2125          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2126          32,                    /* bitsize */
2127          FALSE,                 /* pc_relative */
2128          0,                     /* bitpos */
2129          complain_overflow_dont,/* complain_on_overflow */
2130          nds32_elf_ignore_reloc,/* special_function */
2131          "R_NDS32_RELAX_REGION_BEGIN",  /* name */
2132          FALSE,                 /* partial_inplace */
2133          0xffffffff,            /* src_mask */
2134          0xffffffff,            /* dst_mask */
2135          FALSE),                /* pcrel_offset */
2136   HOWTO (R_NDS32_RELAX_REGION_END,      /* type */
2137          0,                     /* rightshift */
2138          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2139          32,                    /* bitsize */
2140          FALSE,                 /* pc_relative */
2141          0,                     /* bitpos */
2142          complain_overflow_dont,/* complain_on_overflow */
2143          nds32_elf_ignore_reloc,/* special_function */
2144          "R_NDS32_RELAX_REGION_END",    /* name */
2145          FALSE,                 /* partial_inplace */
2146          0xffffffff,            /* src_mask */
2147          0xffffffff,            /* dst_mask */
2148          FALSE),                /* pcrel_offset */
2149   HOWTO (R_NDS32_MINUEND,       /* type */
2150          0,                     /* rightshift */
2151          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2152          32,                    /* bitsize */
2153          FALSE,                 /* pc_relative */
2154          0,                     /* bitpos */
2155          complain_overflow_dont,/* complain_on_overflow */
2156          nds32_elf_ignore_reloc,/* special_function */
2157          "R_NDS32_MINUEND",     /* name */
2158          FALSE,                 /* partial_inplace */
2159          0xffffffff,            /* src_mask */
2160          0xffffffff,            /* dst_mask */
2161          FALSE),                /* pcrel_offset */
2162   HOWTO (R_NDS32_SUBTRAHEND,    /* type */
2163          0,                     /* rightshift */
2164          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2165          32,                    /* bitsize */
2166          FALSE,                 /* pc_relative */
2167          0,                     /* bitpos */
2168          complain_overflow_dont,/* complain_on_overflow */
2169          nds32_elf_ignore_reloc,/* special_function */
2170          "R_NDS32_SUBTRAHEND",  /* name */
2171          FALSE,                 /* partial_inplace */
2172          0xffffffff,            /* src_mask */
2173          0xffffffff,            /* dst_mask */
2174          FALSE),                /* pcrel_offset */
2175   HOWTO (R_NDS32_DIFF8,         /* type */
2176          0,                     /* rightshift */
2177          0,                     /* size (0 = byte, 1 = short, 2 = long) */
2178          8,                     /* bitsize */
2179          FALSE,                 /* pc_relative */
2180          0,                     /* bitpos */
2181          complain_overflow_dont,/* complain_on_overflow */
2182          nds32_elf_ignore_reloc,/* special_function */
2183          "R_NDS32_DIFF8",       /* name */
2184          FALSE,                 /* partial_inplace */
2185          0x000000ff,            /* src_mask */
2186          0x000000ff,            /* dst_mask */
2187          FALSE),                /* pcrel_offset */
2188   HOWTO (R_NDS32_DIFF16,        /* type */
2189          0,                     /* rightshift */
2190          1,                     /* size (0 = byte, 1 = short, 2 = long) */
2191          16,                    /* bitsize */
2192          FALSE,                 /* pc_relative */
2193          0,                     /* bitpos */
2194          complain_overflow_dont,/* complain_on_overflow */
2195          nds32_elf_ignore_reloc,/* special_function */
2196          "R_NDS32_DIFF16",      /* name */
2197          FALSE,                 /* partial_inplace */
2198          0x0000ffff,            /* src_mask */
2199          0x0000ffff,            /* dst_mask */
2200          FALSE),                /* pcrel_offset */
2201   HOWTO (R_NDS32_DIFF32,        /* type */
2202          0,                     /* rightshift */
2203          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2204          32,                    /* bitsize */
2205          FALSE,                 /* pc_relative */
2206          0,                     /* bitpos */
2207          complain_overflow_dont,/* complain_on_overflow */
2208          nds32_elf_ignore_reloc,/* special_function */
2209          "R_NDS32_DIFF32",      /* name */
2210          FALSE,                 /* partial_inplace */
2211          0xffffffff,            /* src_mask */
2212          0xffffffff,            /* dst_mask */
2213          FALSE),                /* pcrel_offset */
2214   HOWTO (R_NDS32_DIFF_ULEB128,  /* type */
2215          0,                     /* rightshift */
2216          0,                     /* size (0 = byte, 1 = short, 2 = long) */
2217          0,                     /* bitsize */
2218          FALSE,                 /* pc_relative */
2219          0,                     /* bitpos */
2220          complain_overflow_dont,/* complain_on_overflow */
2221          nds32_elf_ignore_reloc,/* special_function */
2222          "R_NDS32_DIFF_ULEB128",/* name */
2223          FALSE,                 /* partial_inplace */
2224          0xffffffff,            /* src_mask */
2225          0xffffffff,            /* dst_mask */
2226          FALSE),                /* pcrel_offset */
2227   HOWTO (R_NDS32_DATA,          /* type */
2228          0,                     /* rightshift */
2229          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2230          32,                    /* bitsize */
2231          FALSE,                 /* pc_relative */
2232          0,                     /* bitpos */
2233          complain_overflow_dont,/* complain_on_overflow */
2234          nds32_elf_ignore_reloc,/* special_function */
2235          "R_NDS32_DATA",        /* name */
2236          FALSE,                 /* partial_inplace */
2237          0xffffffff,            /* src_mask */
2238          0xffffffff,            /* dst_mask */
2239          FALSE),                /* pcrel_offset */
2240   HOWTO (R_NDS32_TRAN,          /* type */
2241          0,                     /* rightshift */
2242          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2243          32,                    /* bitsize */
2244          FALSE,                 /* pc_relative */
2245          0,                     /* bitpos */
2246          complain_overflow_dont,/* complain_on_overflow */
2247          nds32_elf_ignore_reloc,/* special_function */
2248          "R_NDS32_TRAN",        /* name */
2249          FALSE,                 /* partial_inplace */
2250          0xffffffff,            /* src_mask */
2251          0xffffffff,            /* dst_mask */
2252          FALSE),                /* pcrel_offset */
2253   HOWTO (R_NDS32_TLS_LE_ADD,    /* type */
2254          0,                     /* rightshift */
2255          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2256          32,                    /* bitsize */
2257          FALSE,                 /* pc_relative */
2258          0,                     /* bitpos */
2259          complain_overflow_dont,        /* complain_on_overflow */
2260          nds32_elf_ignore_reloc,        /* special_function */
2261          "R_NDS32_TLS_LE_ADD",  /* name */
2262          FALSE,                 /* partial_inplace */
2263          0xffffffff,            /* src_mask */
2264          0xffffffff,            /* dst_mask */
2265          FALSE),                /* pcrel_offset */
2266   HOWTO (R_NDS32_TLS_LE_LS,     /* type */
2267          0,                     /* rightshift */
2268          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2269          32,                    /* bitsize */
2270          FALSE,                 /* pc_relative */
2271          0,                     /* bitpos */
2272          complain_overflow_dont,        /* complain_on_overflow */
2273          nds32_elf_ignore_reloc,        /* special_function */
2274          "R_NDS32_TLS_LE_LS",   /* name */
2275          FALSE,                 /* partial_inplace */
2276          0xffffffff,            /* src_mask */
2277          0xffffffff,            /* dst_mask */
2278          FALSE),                /* pcrel_offset */
2279   HOWTO (R_NDS32_EMPTY,         /* type */
2280          0,                     /* rightshift */
2281          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2282          32,                    /* bitsize */
2283          FALSE,                 /* pc_relative */
2284          0,                     /* bitpos */
2285          complain_overflow_dont,        /* complain_on_overflow */
2286          nds32_elf_ignore_reloc,        /* special_function */
2287          "R_NDS32_EMPTY",               /* name */
2288          FALSE,                 /* partial_inplace */
2289          0xffffffff,            /* src_mask */
2290          0xffffffff,            /* dst_mask */
2291          FALSE),                /* pcrel_offset */
2292 };
2293
2294 \f
2295 /* nds32_insertion_sort sorts an array with nmemb elements of size size.
2296    This prototype is the same as qsort ().  */
2297
2298 void
2299 nds32_insertion_sort (void *base, size_t nmemb, size_t size,
2300                       int (*compar) (const void *lhs, const void *rhs))
2301 {
2302   char *ptr = (char *) base;
2303   int i, j;
2304   char *tmp = xmalloc (size);
2305
2306   /* If i is less than j, i is inserted before j.
2307
2308      |---- j ----- i --------------|
2309       \          / \              /
2310          sorted         unsorted
2311    */
2312
2313   for (i = 1; i < (int) nmemb; i++)
2314     {
2315       for (j = (i - 1); j >= 0; j--)
2316         if (compar (ptr + i * size, ptr + j * size) >= 0)
2317           break;
2318
2319       j++;
2320
2321       if (i == j)
2322         continue; /* i is in order.  */
2323
2324       memcpy (tmp, ptr + i * size, size);
2325       memmove (ptr + (j + 1) * size, ptr + j * size, (i - j) * size);
2326       memcpy (ptr + j * size, tmp, size);
2327     }
2328   free (tmp);
2329 }
2330
2331 /* Sort relocation by r_offset.
2332
2333    We didn't use qsort () in stdlib, because quick-sort is not a stable sorting
2334    algorithm.  Relocations at the same r_offset must keep their order.
2335    For example, RELAX_ENTRY must be the very first relocation entry.
2336
2337    Currently, this function implements insertion-sort.
2338
2339    FIXME: If we already sort them in assembler, why bother sort them
2340           here again?  */
2341
2342 static int
2343 compar_reloc (const void *lhs, const void *rhs)
2344 {
2345   const Elf_Internal_Rela *l = (const Elf_Internal_Rela *) lhs;
2346   const Elf_Internal_Rela *r = (const Elf_Internal_Rela *) rhs;
2347
2348   if (l->r_offset > r->r_offset)
2349     return 1;
2350   else if (l->r_offset == r->r_offset)
2351     return 0;
2352   else
2353     return -1;
2354 }
2355
2356 /* Functions listed below are only used for old relocs.
2357    * nds32_elf_9_pcrel_reloc
2358    * nds32_elf_do_9_pcrel_reloc
2359    * nds32_elf_hi20_reloc
2360    * nds32_elf_relocate_hi20
2361    * nds32_elf_lo12_reloc
2362    * nds32_elf_sda15_reloc
2363    * nds32_elf_generic_reloc
2364    */
2365
2366 /* Handle the R_NDS32_9_PCREL & R_NDS32_9_PCREL_RELA reloc.  */
2367
2368 static bfd_reloc_status_type
2369 nds32_elf_9_pcrel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2370                          void *data, asection *input_section, bfd *output_bfd,
2371                          char **error_message ATTRIBUTE_UNUSED)
2372 {
2373   /* This part is from bfd_elf_generic_reloc.  */
2374   if (output_bfd != (bfd *) NULL
2375       && (symbol->flags & BSF_SECTION_SYM) == 0
2376       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2377     {
2378       reloc_entry->address += input_section->output_offset;
2379       return bfd_reloc_ok;
2380     }
2381
2382   if (output_bfd != NULL)
2383     {
2384       /* FIXME: See bfd_perform_relocation.  Is this right?  */
2385       return bfd_reloc_continue;
2386     }
2387
2388   return nds32_elf_do_9_pcrel_reloc (abfd, reloc_entry->howto,
2389                                      input_section,
2390                                      data, reloc_entry->address,
2391                                      symbol->section,
2392                                      (symbol->value
2393                                       + symbol->section->output_section->vma
2394                                       + symbol->section->output_offset),
2395                                      reloc_entry->addend);
2396 }
2397
2398 /* Utility to actually perform an R_NDS32_9_PCREL reloc.  */
2399 #define N_ONES(n) (((((bfd_vma) 1 << ((n) - 1)) - 1) << 1) | 1)
2400
2401 static bfd_reloc_status_type
2402 nds32_elf_do_9_pcrel_reloc (bfd *abfd, reloc_howto_type *howto,
2403                             asection *input_section, bfd_byte *data,
2404                             bfd_vma offset,
2405                             asection *symbol_section ATTRIBUTE_UNUSED,
2406                             bfd_vma symbol_value, bfd_vma addend)
2407 {
2408   bfd_signed_vma relocation;
2409   unsigned short x;
2410   bfd_reloc_status_type status;
2411
2412   /* Sanity check the address (offset in section).  */
2413   if (offset > bfd_get_section_limit (abfd, input_section))
2414     return bfd_reloc_outofrange;
2415
2416   relocation = symbol_value + addend;
2417   /* Make it pc relative.  */
2418   relocation -= (input_section->output_section->vma
2419                  + input_section->output_offset);
2420   /* These jumps mask off the lower two bits of the current address
2421      before doing pcrel calculations.  */
2422   relocation -= (offset & -(bfd_vma) 2);
2423
2424   if (relocation < -ACCURATE_8BIT_S1 || relocation >= ACCURATE_8BIT_S1)
2425     status = bfd_reloc_overflow;
2426   else
2427     status = bfd_reloc_ok;
2428
2429   x = bfd_getb16 (data + offset);
2430
2431   relocation >>= howto->rightshift;
2432   relocation <<= howto->bitpos;
2433   x = (x & ~howto->dst_mask)
2434       | (((x & howto->src_mask) + relocation) & howto->dst_mask);
2435
2436   bfd_putb16 ((bfd_vma) x, data + offset);
2437
2438   return status;
2439 }
2440
2441 /* Handle the R_NDS32_HI20_[SU]LO relocs.
2442    HI20_SLO is for the add3 and load/store with displacement instructions.
2443    HI20 is for the or3 instruction.
2444    For R_NDS32_HI20_SLO, the lower 16 bits are sign extended when added to
2445    the high 16 bytes so if the lower 16 bits are negative (bit 15 == 1) then
2446    we must add one to the high 16 bytes (which will get subtracted off when
2447    the low 16 bits are added).
2448    These relocs have to be done in combination with an R_NDS32_LO12 reloc
2449    because there is a carry from the LO12 to the HI20.  Here we just save
2450    the information we need; we do the actual relocation when we see the LO12.
2451    This code is copied from the elf32-mips.c.  We also support an arbitrary
2452    number of HI20 relocs to be associated with a single LO12 reloc.  The
2453    assembler sorts the relocs to ensure each HI20 immediately precedes its
2454    LO12.  However if there are multiple copies, the assembler may not find
2455    the real LO12 so it picks the first one it finds.  */
2456
2457 struct nds32_hi20
2458 {
2459   struct nds32_hi20 *next;
2460   bfd_byte *addr;
2461   bfd_vma addend;
2462 };
2463
2464 static struct nds32_hi20 *nds32_hi20_list;
2465
2466 static bfd_reloc_status_type
2467 nds32_elf_hi20_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2468                       asymbol *symbol, void *data, asection *input_section,
2469                       bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
2470 {
2471   bfd_reloc_status_type ret;
2472   bfd_vma relocation;
2473   struct nds32_hi20 *n;
2474
2475   /* This part is from bfd_elf_generic_reloc.
2476      If we're relocating, and this an external symbol, we don't want
2477      to change anything.  */
2478   if (output_bfd != (bfd *) NULL
2479       && (symbol->flags & BSF_SECTION_SYM) == 0 && reloc_entry->addend == 0)
2480     {
2481       reloc_entry->address += input_section->output_offset;
2482       return bfd_reloc_ok;
2483     }
2484
2485   /* Sanity check the address (offset in section).  */
2486   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2487     return bfd_reloc_outofrange;
2488
2489   ret = bfd_reloc_ok;
2490   if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
2491     ret = bfd_reloc_undefined;
2492
2493   if (bfd_is_com_section (symbol->section))
2494     relocation = 0;
2495   else
2496     relocation = symbol->value;
2497
2498   relocation += symbol->section->output_section->vma;
2499   relocation += symbol->section->output_offset;
2500   relocation += reloc_entry->addend;
2501
2502   /* Save the information, and let LO12 do the actual relocation.  */
2503   n = (struct nds32_hi20 *) bfd_malloc ((bfd_size_type) sizeof *n);
2504   if (n == NULL)
2505     return bfd_reloc_outofrange;
2506
2507   n->addr = (bfd_byte *) data + reloc_entry->address;
2508   n->addend = relocation;
2509   n->next = nds32_hi20_list;
2510   nds32_hi20_list = n;
2511
2512   if (output_bfd != (bfd *) NULL)
2513     reloc_entry->address += input_section->output_offset;
2514
2515   return ret;
2516 }
2517
2518 /* Handle an NDS32 ELF HI20 reloc.  */
2519
2520 static void
2521 nds32_elf_relocate_hi20 (bfd *input_bfd ATTRIBUTE_UNUSED,
2522                          int type ATTRIBUTE_UNUSED, Elf_Internal_Rela *relhi,
2523                          Elf_Internal_Rela *rello, bfd_byte *contents,
2524                          bfd_vma addend)
2525 {
2526   unsigned long insn;
2527   bfd_vma addlo;
2528
2529   insn = bfd_getb32 (contents + relhi->r_offset);
2530
2531   addlo = bfd_getb32 (contents + rello->r_offset);
2532   addlo &= 0xfff;
2533
2534   addend += ((insn & 0xfffff) << 20) + addlo;
2535
2536   insn = (insn & 0xfff00000) | ((addend >> 12) & 0xfffff);
2537   bfd_putb32 (insn, contents + relhi->r_offset);
2538 }
2539
2540 /* Do an R_NDS32_LO12 relocation.  This is a straightforward 12 bit
2541    inplace relocation; this function exists in order to do the
2542    R_NDS32_HI20_[SU]LO relocation described above.  */
2543
2544 static bfd_reloc_status_type
2545 nds32_elf_lo12_reloc (bfd *input_bfd, arelent *reloc_entry, asymbol *symbol,
2546                       void *data, asection *input_section, bfd *output_bfd,
2547                       char **error_message)
2548 {
2549   /* This part is from bfd_elf_generic_reloc.
2550      If we're relocating, and this an external symbol, we don't want
2551      to change anything.  */
2552   if (output_bfd != NULL && (symbol->flags & BSF_SECTION_SYM) == 0
2553       && reloc_entry->addend == 0)
2554     {
2555       reloc_entry->address += input_section->output_offset;
2556       return bfd_reloc_ok;
2557     }
2558
2559   if (nds32_hi20_list != NULL)
2560     {
2561       struct nds32_hi20 *l;
2562
2563       l = nds32_hi20_list;
2564       while (l != NULL)
2565         {
2566           unsigned long insn;
2567           unsigned long val;
2568           unsigned long vallo;
2569           struct nds32_hi20 *next;
2570
2571           /* Do the HI20 relocation.  Note that we actually don't need
2572              to know anything about the LO12 itself, except where to
2573              find the low 12 bits of the addend needed by the LO12.  */
2574           insn = bfd_getb32 (l->addr);
2575           vallo = bfd_getb32 ((bfd_byte *) data + reloc_entry->address);
2576           vallo &= 0xfff;
2577           switch (reloc_entry->howto->type)
2578             {
2579             case R_NDS32_LO12S3:
2580               vallo <<= 3;
2581               break;
2582
2583             case R_NDS32_LO12S2:
2584               vallo <<= 2;
2585               break;
2586
2587             case R_NDS32_LO12S1:
2588               vallo <<= 1;
2589               break;
2590
2591             case R_NDS32_LO12S0:
2592               vallo <<= 0;
2593               break;
2594             }
2595
2596           val = ((insn & 0xfffff) << 12) + vallo;
2597           val += l->addend;
2598
2599           insn = (insn & ~(bfd_vma) 0xfffff) | ((val >> 12) & 0xfffff);
2600           bfd_putb32 ((bfd_vma) insn, l->addr);
2601
2602           next = l->next;
2603           free (l);
2604           l = next;
2605         }
2606
2607       nds32_hi20_list = NULL;
2608     }
2609
2610   /* Now do the LO12 reloc in the usual way.
2611      ??? It would be nice to call bfd_elf_generic_reloc here,
2612      but we have partial_inplace set.  bfd_elf_generic_reloc will
2613      pass the handling back to bfd_install_relocation which will install
2614      a section relative addend which is wrong.  */
2615   return nds32_elf_generic_reloc (input_bfd, reloc_entry, symbol, data,
2616                                   input_section, output_bfd, error_message);
2617 }
2618
2619 /* Do generic partial_inplace relocation.
2620    This is a local replacement for bfd_elf_generic_reloc.  */
2621
2622 static bfd_reloc_status_type
2623 nds32_elf_generic_reloc (bfd *input_bfd, arelent *reloc_entry,
2624                          asymbol *symbol, void *data, asection *input_section,
2625                          bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
2626 {
2627   bfd_reloc_status_type ret;
2628   bfd_vma relocation;
2629   bfd_byte *inplace_address;
2630
2631   /* This part is from bfd_elf_generic_reloc.
2632      If we're relocating, and this an external symbol, we don't want
2633      to change anything.  */
2634   if (output_bfd != NULL && (symbol->flags & BSF_SECTION_SYM) == 0
2635       && reloc_entry->addend == 0)
2636     {
2637       reloc_entry->address += input_section->output_offset;
2638       return bfd_reloc_ok;
2639     }
2640
2641   /* Now do the reloc in the usual way.
2642      ??? It would be nice to call bfd_elf_generic_reloc here,
2643      but we have partial_inplace set.  bfd_elf_generic_reloc will
2644      pass the handling back to bfd_install_relocation which will install
2645      a section relative addend which is wrong.  */
2646
2647   /* Sanity check the address (offset in section).  */
2648   if (reloc_entry->address > bfd_get_section_limit (input_bfd, input_section))
2649     return bfd_reloc_outofrange;
2650
2651   ret = bfd_reloc_ok;
2652   if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
2653     ret = bfd_reloc_undefined;
2654
2655   if (bfd_is_com_section (symbol->section) || output_bfd != (bfd *) NULL)
2656     relocation = 0;
2657   else
2658     relocation = symbol->value;
2659
2660   /* Only do this for a final link.  */
2661   if (output_bfd == (bfd *) NULL)
2662     {
2663       relocation += symbol->section->output_section->vma;
2664       relocation += symbol->section->output_offset;
2665     }
2666
2667   relocation += reloc_entry->addend;
2668   switch (reloc_entry->howto->type)
2669     {
2670     case R_NDS32_LO12S3:
2671       relocation >>= 3;
2672       break;
2673
2674     case R_NDS32_LO12S2:
2675       relocation >>= 2;
2676       break;
2677
2678     case R_NDS32_LO12S1:
2679       relocation >>= 1;
2680       break;
2681
2682     case R_NDS32_LO12S0:
2683     default:
2684       relocation >>= 0;
2685       break;
2686     }
2687
2688   inplace_address = (bfd_byte *) data + reloc_entry->address;
2689
2690 #define DOIT(x)                                         \
2691   x = ((x & ~reloc_entry->howto->dst_mask) |            \
2692   (((x & reloc_entry->howto->src_mask) +  relocation) & \
2693   reloc_entry->howto->dst_mask))
2694
2695   switch (reloc_entry->howto->size)
2696     {
2697     case 1:
2698       {
2699         short x = bfd_getb16 (inplace_address);
2700
2701         DOIT (x);
2702         bfd_putb16 ((bfd_vma) x, inplace_address);
2703       }
2704       break;
2705     case 2:
2706       {
2707         unsigned long x = bfd_getb32 (inplace_address);
2708
2709         DOIT (x);
2710         bfd_putb32 ((bfd_vma) x, inplace_address);
2711       }
2712       break;
2713     default:
2714       BFD_ASSERT (0);
2715     }
2716
2717   if (output_bfd != (bfd *) NULL)
2718     reloc_entry->address += input_section->output_offset;
2719
2720   return ret;
2721 }
2722
2723 /* Handle the R_NDS32_SDA15 reloc.
2724    This reloc is used to compute the address of objects in the small data area
2725    and to perform loads and stores from that area.
2726    The lower 15 bits are sign extended and added to the register specified
2727    in the instruction, which is assumed to point to _SDA_BASE_.
2728
2729    Since the lower 15 bits offset is left-shifted 0, 1 or 2 bits depending on
2730    the access size, this must be taken care of.  */
2731
2732 static bfd_reloc_status_type
2733 nds32_elf_sda15_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2734                        asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2735                        asection *input_section, bfd *output_bfd,
2736                        char **error_message ATTRIBUTE_UNUSED)
2737 {
2738   /* This part is from bfd_elf_generic_reloc.  */
2739   if (output_bfd != (bfd *) NULL
2740       && (symbol->flags & BSF_SECTION_SYM) == 0
2741       && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2742     {
2743       reloc_entry->address += input_section->output_offset;
2744       return bfd_reloc_ok;
2745     }
2746
2747   if (output_bfd != NULL)
2748     {
2749       /* FIXME: See bfd_perform_relocation.  Is this right?  */
2750       return bfd_reloc_continue;
2751     }
2752
2753   /* FIXME: not sure what to do here yet.  But then again, the linker
2754      may never call us.  */
2755   abort ();
2756 }
2757
2758 /* nds32_elf_ignore_reloc is the special function for
2759    relocation types which don't need to be relocated
2760    like relaxation relocation types.
2761    This function simply return bfd_reloc_ok when it is
2762    invoked.  */
2763
2764 static bfd_reloc_status_type
2765 nds32_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2766                         asymbol *symbol ATTRIBUTE_UNUSED,
2767                         void *data ATTRIBUTE_UNUSED, asection *input_section,
2768                         bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
2769 {
2770   if (output_bfd != NULL)
2771     reloc_entry->address += input_section->output_offset;
2772
2773   return bfd_reloc_ok;
2774 }
2775 \f
2776
2777 /* Map BFD reloc types to NDS32 ELF reloc types.  */
2778
2779 struct nds32_reloc_map_entry
2780 {
2781   bfd_reloc_code_real_type bfd_reloc_val;
2782   unsigned char elf_reloc_val;
2783 };
2784
2785 static const struct nds32_reloc_map_entry nds32_reloc_map[] =
2786 {
2787   {BFD_RELOC_NONE, R_NDS32_NONE},
2788   {BFD_RELOC_16, R_NDS32_16_RELA},
2789   {BFD_RELOC_32, R_NDS32_32_RELA},
2790   {BFD_RELOC_NDS32_20, R_NDS32_20_RELA},
2791   {BFD_RELOC_NDS32_5, R_NDS32_5_RELA},
2792   {BFD_RELOC_NDS32_9_PCREL, R_NDS32_9_PCREL_RELA},
2793   {BFD_RELOC_NDS32_WORD_9_PCREL, R_NDS32_WORD_9_PCREL_RELA},
2794   {BFD_RELOC_NDS32_15_PCREL, R_NDS32_15_PCREL_RELA},
2795   {BFD_RELOC_NDS32_17_PCREL, R_NDS32_17_PCREL_RELA},
2796   {BFD_RELOC_NDS32_25_PCREL, R_NDS32_25_PCREL_RELA},
2797   {BFD_RELOC_NDS32_10_UPCREL, R_NDS32_10_UPCREL_RELA},
2798   {BFD_RELOC_NDS32_HI20, R_NDS32_HI20_RELA},
2799   {BFD_RELOC_NDS32_LO12S3, R_NDS32_LO12S3_RELA},
2800   {BFD_RELOC_NDS32_LO12S2, R_NDS32_LO12S2_RELA},
2801   {BFD_RELOC_NDS32_LO12S1, R_NDS32_LO12S1_RELA},
2802   {BFD_RELOC_NDS32_LO12S0, R_NDS32_LO12S0_RELA},
2803   {BFD_RELOC_NDS32_LO12S0_ORI, R_NDS32_LO12S0_ORI_RELA},
2804   {BFD_RELOC_NDS32_SDA15S3, R_NDS32_SDA15S3_RELA},
2805   {BFD_RELOC_NDS32_SDA15S2, R_NDS32_SDA15S2_RELA},
2806   {BFD_RELOC_NDS32_SDA15S1, R_NDS32_SDA15S1_RELA},
2807   {BFD_RELOC_NDS32_SDA15S0, R_NDS32_SDA15S0_RELA},
2808   {BFD_RELOC_VTABLE_INHERIT, R_NDS32_RELA_GNU_VTINHERIT},
2809   {BFD_RELOC_VTABLE_ENTRY, R_NDS32_RELA_GNU_VTENTRY},
2810
2811   {BFD_RELOC_NDS32_GOT20, R_NDS32_GOT20},
2812   {BFD_RELOC_NDS32_9_PLTREL, R_NDS32_9_PLTREL},
2813   {BFD_RELOC_NDS32_25_PLTREL, R_NDS32_25_PLTREL},
2814   {BFD_RELOC_NDS32_COPY, R_NDS32_COPY},
2815   {BFD_RELOC_NDS32_GLOB_DAT, R_NDS32_GLOB_DAT},
2816   {BFD_RELOC_NDS32_JMP_SLOT, R_NDS32_JMP_SLOT},
2817   {BFD_RELOC_NDS32_RELATIVE, R_NDS32_RELATIVE},
2818   {BFD_RELOC_NDS32_GOTOFF, R_NDS32_GOTOFF},
2819   {BFD_RELOC_NDS32_GOTPC20, R_NDS32_GOTPC20},
2820   {BFD_RELOC_NDS32_GOT_HI20, R_NDS32_GOT_HI20},
2821   {BFD_RELOC_NDS32_GOT_LO12, R_NDS32_GOT_LO12},
2822   {BFD_RELOC_NDS32_GOT_LO15, R_NDS32_GOT_LO15},
2823   {BFD_RELOC_NDS32_GOT_LO19, R_NDS32_GOT_LO19},
2824   {BFD_RELOC_NDS32_GOTPC_HI20, R_NDS32_GOTPC_HI20},
2825   {BFD_RELOC_NDS32_GOTPC_LO12, R_NDS32_GOTPC_LO12},
2826   {BFD_RELOC_NDS32_GOTOFF_HI20, R_NDS32_GOTOFF_HI20},
2827   {BFD_RELOC_NDS32_GOTOFF_LO12, R_NDS32_GOTOFF_LO12},
2828   {BFD_RELOC_NDS32_GOTOFF_LO15, R_NDS32_GOTOFF_LO15},
2829   {BFD_RELOC_NDS32_GOTOFF_LO19, R_NDS32_GOTOFF_LO19},
2830   {BFD_RELOC_NDS32_INSN16, R_NDS32_INSN16},
2831   {BFD_RELOC_NDS32_LABEL, R_NDS32_LABEL},
2832   {BFD_RELOC_NDS32_LONGCALL1, R_NDS32_LONGCALL1},
2833   {BFD_RELOC_NDS32_LONGCALL2, R_NDS32_LONGCALL2},
2834   {BFD_RELOC_NDS32_LONGCALL3, R_NDS32_LONGCALL3},
2835   {BFD_RELOC_NDS32_LONGCALL4, R_NDS32_LONGCALL4},
2836   {BFD_RELOC_NDS32_LONGCALL5, R_NDS32_LONGCALL5},
2837   {BFD_RELOC_NDS32_LONGCALL6, R_NDS32_LONGCALL6},
2838   {BFD_RELOC_NDS32_LONGJUMP1, R_NDS32_LONGJUMP1},
2839   {BFD_RELOC_NDS32_LONGJUMP2, R_NDS32_LONGJUMP2},
2840   {BFD_RELOC_NDS32_LONGJUMP3, R_NDS32_LONGJUMP3},
2841   {BFD_RELOC_NDS32_LONGJUMP4, R_NDS32_LONGJUMP4},
2842   {BFD_RELOC_NDS32_LONGJUMP5, R_NDS32_LONGJUMP5},
2843   {BFD_RELOC_NDS32_LONGJUMP6, R_NDS32_LONGJUMP6},
2844   {BFD_RELOC_NDS32_LONGJUMP7, R_NDS32_LONGJUMP7},
2845   {BFD_RELOC_NDS32_LOADSTORE, R_NDS32_LOADSTORE},
2846   {BFD_RELOC_NDS32_9_FIXED, R_NDS32_9_FIXED_RELA},
2847   {BFD_RELOC_NDS32_15_FIXED, R_NDS32_15_FIXED_RELA},
2848   {BFD_RELOC_NDS32_17_FIXED, R_NDS32_17_FIXED_RELA},
2849   {BFD_RELOC_NDS32_25_FIXED, R_NDS32_25_FIXED_RELA},
2850   {BFD_RELOC_NDS32_PLTREL_HI20, R_NDS32_PLTREL_HI20},
2851   {BFD_RELOC_NDS32_PLTREL_LO12, R_NDS32_PLTREL_LO12},
2852   {BFD_RELOC_NDS32_PLT_GOTREL_HI20, R_NDS32_PLT_GOTREL_HI20},
2853   {BFD_RELOC_NDS32_PLT_GOTREL_LO12, R_NDS32_PLT_GOTREL_LO12},
2854   {BFD_RELOC_NDS32_PLT_GOTREL_LO15, R_NDS32_PLT_GOTREL_LO15},
2855   {BFD_RELOC_NDS32_PLT_GOTREL_LO19, R_NDS32_PLT_GOTREL_LO19},
2856   {BFD_RELOC_NDS32_PLT_GOTREL_LO20, R_NDS32_PLT_GOTREL_LO20},
2857   {BFD_RELOC_NDS32_SDA12S2_DP, R_NDS32_SDA12S2_DP_RELA},
2858   {BFD_RELOC_NDS32_SDA12S2_SP, R_NDS32_SDA12S2_SP_RELA},
2859   {BFD_RELOC_NDS32_LO12S2_DP, R_NDS32_LO12S2_DP_RELA},
2860   {BFD_RELOC_NDS32_LO12S2_SP, R_NDS32_LO12S2_SP_RELA},
2861   {BFD_RELOC_NDS32_SDA16S3, R_NDS32_SDA16S3_RELA},
2862   {BFD_RELOC_NDS32_SDA17S2, R_NDS32_SDA17S2_RELA},
2863   {BFD_RELOC_NDS32_SDA18S1, R_NDS32_SDA18S1_RELA},
2864   {BFD_RELOC_NDS32_SDA19S0, R_NDS32_SDA19S0_RELA},
2865   {BFD_RELOC_NDS32_SDA_FP7U2_RELA, R_NDS32_SDA_FP7U2_RELA},
2866   {BFD_RELOC_NDS32_DWARF2_OP1, R_NDS32_DWARF2_OP1_RELA},
2867   {BFD_RELOC_NDS32_DWARF2_OP2, R_NDS32_DWARF2_OP2_RELA},
2868   {BFD_RELOC_NDS32_DWARF2_LEB, R_NDS32_DWARF2_LEB_RELA},
2869   {BFD_RELOC_NDS32_UPDATE_TA, R_NDS32_UPDATE_TA_RELA},
2870   {BFD_RELOC_NDS32_GOT_SUFF, R_NDS32_GOT_SUFF},
2871   {BFD_RELOC_NDS32_GOTOFF_SUFF, R_NDS32_GOTOFF_SUFF},
2872   {BFD_RELOC_NDS32_GOT15S2, R_NDS32_GOT15S2_RELA},
2873   {BFD_RELOC_NDS32_GOT17S2, R_NDS32_GOT17S2_RELA},
2874   {BFD_RELOC_NDS32_PTR, R_NDS32_PTR},
2875   {BFD_RELOC_NDS32_PTR_COUNT, R_NDS32_PTR_COUNT},
2876   {BFD_RELOC_NDS32_PLT_GOT_SUFF, R_NDS32_PLT_GOT_SUFF},
2877   {BFD_RELOC_NDS32_PTR_RESOLVED, R_NDS32_PTR_RESOLVED},
2878   {BFD_RELOC_NDS32_RELAX_ENTRY, R_NDS32_RELAX_ENTRY},
2879   {BFD_RELOC_NDS32_MULCALL_SUFF, R_NDS32_MULCALL_SUFF},
2880   {BFD_RELOC_NDS32_PLTBLOCK, R_NDS32_PLTBLOCK},
2881   {BFD_RELOC_NDS32_RELAX_REGION_BEGIN, R_NDS32_RELAX_REGION_BEGIN},
2882   {BFD_RELOC_NDS32_RELAX_REGION_END, R_NDS32_RELAX_REGION_END},
2883   {BFD_RELOC_NDS32_MINUEND, R_NDS32_MINUEND},
2884   {BFD_RELOC_NDS32_SUBTRAHEND, R_NDS32_SUBTRAHEND},
2885   {BFD_RELOC_NDS32_EMPTY, R_NDS32_EMPTY},
2886
2887   {BFD_RELOC_NDS32_DIFF8, R_NDS32_DIFF8},
2888   {BFD_RELOC_NDS32_DIFF16, R_NDS32_DIFF16},
2889   {BFD_RELOC_NDS32_DIFF32, R_NDS32_DIFF32},
2890   {BFD_RELOC_NDS32_DIFF_ULEB128, R_NDS32_DIFF_ULEB128},
2891   {BFD_RELOC_NDS32_25_ABS, R_NDS32_25_ABS_RELA},
2892   {BFD_RELOC_NDS32_DATA, R_NDS32_DATA},
2893   {BFD_RELOC_NDS32_TRAN, R_NDS32_TRAN},
2894   {BFD_RELOC_NDS32_17IFC_PCREL, R_NDS32_17IFC_PCREL_RELA},
2895   {BFD_RELOC_NDS32_10IFCU_PCREL, R_NDS32_10IFCU_PCREL_RELA},
2896   {BFD_RELOC_NDS32_TLS_LE_HI20, R_NDS32_TLS_LE_HI20},
2897   {BFD_RELOC_NDS32_TLS_LE_LO12, R_NDS32_TLS_LE_LO12},
2898   {BFD_RELOC_NDS32_TLS_LE_ADD, R_NDS32_TLS_LE_ADD},
2899   {BFD_RELOC_NDS32_TLS_LE_LS, R_NDS32_TLS_LE_LS},
2900   {BFD_RELOC_NDS32_TLS_IE_HI20, R_NDS32_TLS_IE_HI20},
2901   {BFD_RELOC_NDS32_TLS_IE_LO12S2, R_NDS32_TLS_IE_LO12S2},
2902   {BFD_RELOC_NDS32_TLS_TPOFF, R_NDS32_TLS_TPOFF},
2903   {BFD_RELOC_NDS32_TLS_LE_20, R_NDS32_TLS_LE_20},
2904   {BFD_RELOC_NDS32_TLS_LE_15S0, R_NDS32_TLS_LE_15S0},
2905   {BFD_RELOC_NDS32_TLS_LE_15S1, R_NDS32_TLS_LE_15S1},
2906   {BFD_RELOC_NDS32_TLS_LE_15S2, R_NDS32_TLS_LE_15S2},
2907 };
2908
2909 /* Patch tag.  */
2910
2911 static reloc_howto_type *
2912 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2913                                  const char *r_name)
2914 {
2915   unsigned int i;
2916
2917   for (i = 0; i < ARRAY_SIZE (nds32_elf_howto_table); i++)
2918     if (nds32_elf_howto_table[i].name != NULL
2919         && strcasecmp (nds32_elf_howto_table[i].name, r_name) == 0)
2920       return &nds32_elf_howto_table[i];
2921
2922   for (i = 0; i < ARRAY_SIZE (nds32_elf_relax_howto_table); i++)
2923     if (nds32_elf_relax_howto_table[i].name != NULL
2924         && strcasecmp (nds32_elf_relax_howto_table[i].name, r_name) == 0)
2925       return &nds32_elf_relax_howto_table[i];
2926
2927   return NULL;
2928 }
2929
2930 static reloc_howto_type *
2931 bfd_elf32_bfd_reloc_type_table_lookup (enum elf_nds32_reloc_type code)
2932 {
2933   if (code < R_NDS32_RELAX_ENTRY)
2934     {
2935       BFD_ASSERT (code < ARRAY_SIZE (nds32_elf_howto_table));
2936       return &nds32_elf_howto_table[code];
2937     }
2938   else
2939     {
2940       BFD_ASSERT ((size_t) (code - R_NDS32_RELAX_ENTRY)
2941                   < ARRAY_SIZE (nds32_elf_relax_howto_table));
2942       return &nds32_elf_relax_howto_table[code - R_NDS32_RELAX_ENTRY];
2943     }
2944 }
2945
2946 static reloc_howto_type *
2947 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2948                                  bfd_reloc_code_real_type code)
2949 {
2950   unsigned int i;
2951
2952   for (i = 0; i < ARRAY_SIZE (nds32_reloc_map); i++)
2953     {
2954       if (nds32_reloc_map[i].bfd_reloc_val == code)
2955         return bfd_elf32_bfd_reloc_type_table_lookup
2956                  (nds32_reloc_map[i].elf_reloc_val);
2957     }
2958
2959   return NULL;
2960 }
2961
2962 /* Set the howto pointer for an NDS32 ELF reloc.  */
2963
2964 static void
2965 nds32_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2966                          Elf_Internal_Rela *dst)
2967 {
2968   enum elf_nds32_reloc_type r_type;
2969
2970   r_type = ELF32_R_TYPE (dst->r_info);
2971   if (r_type > R_NDS32_GNU_VTENTRY)
2972     {
2973       _bfd_error_handler (_("%B: invalid NDS32 reloc number: %d"), abfd, r_type);
2974       r_type = 0;
2975     }
2976   cache_ptr->howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
2977 }
2978
2979 static void
2980 nds32_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2981                      Elf_Internal_Rela *dst)
2982 {
2983   BFD_ASSERT ((ELF32_R_TYPE (dst->r_info) == R_NDS32_NONE)
2984               || ((ELF32_R_TYPE (dst->r_info) > R_NDS32_GNU_VTENTRY)
2985                   && (ELF32_R_TYPE (dst->r_info) < R_NDS32_max)));
2986   cache_ptr->howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (dst->r_info));
2987 }
2988
2989 /* Support for core dump NOTE sections.
2990    Reference to include/linux/elfcore.h in Linux.  */
2991
2992 static bfd_boolean
2993 nds32_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2994 {
2995   int offset;
2996   size_t size;
2997
2998   switch (note->descsz)
2999     {
3000     case 0x114:
3001       /* Linux/NDS32 32-bit, ABI1 */
3002
3003       /* pr_cursig */
3004       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3005
3006       /* pr_pid */
3007       elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
3008
3009       /* pr_reg */
3010       offset = 72;
3011       size = 200;
3012       break;
3013
3014     case 0xfc:
3015       /* Linux/NDS32 32-bit */
3016
3017       /* pr_cursig */
3018       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3019
3020       /* pr_pid */
3021       elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
3022
3023       /* pr_reg */
3024       offset = 72;
3025       size = 176;
3026       break;
3027
3028     default:
3029       return FALSE;
3030     }
3031
3032   /* Make a ".reg" section.  */
3033   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3034                                           size, note->descpos + offset);
3035 }
3036
3037 static bfd_boolean
3038 nds32_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3039 {
3040   switch (note->descsz)
3041     {
3042     case 124:
3043       /* Linux/NDS32 */
3044
3045       /* __kernel_uid_t, __kernel_gid_t are short on NDS32 platform.  */
3046       elf_tdata (abfd)->core->program =
3047         _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
3048       elf_tdata (abfd)->core->command =
3049         _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
3050       break;
3051
3052     default:
3053       return FALSE;
3054     }
3055
3056   /* Note that for some reason, a spurious space is tacked
3057      onto the end of the args in some (at least one anyway)
3058      implementations, so strip it off if it exists.  */
3059   {
3060     char *command = elf_tdata (abfd)->core->command;
3061     int n = strlen (command);
3062
3063     if (0 < n && command[n - 1] == ' ')
3064       command[n - 1] = '\0';
3065   }
3066
3067   return TRUE;
3068 }
3069
3070 /* Hook called by the linker routine which adds symbols from an object
3071    file.  We must handle the special NDS32 section numbers here.
3072    We also keep watching for whether we need to create the sdata special
3073    linker sections.  */
3074
3075 static bfd_boolean
3076 nds32_elf_add_symbol_hook (bfd *abfd,
3077                            struct bfd_link_info *info ATTRIBUTE_UNUSED,
3078                            Elf_Internal_Sym *sym,
3079                            const char **namep ATTRIBUTE_UNUSED,
3080                            flagword *flagsp ATTRIBUTE_UNUSED,
3081                            asection **secp, bfd_vma *valp)
3082 {
3083   switch (sym->st_shndx)
3084     {
3085     case SHN_COMMON:
3086       /* Common symbols less than the GP size are automatically
3087          treated as SHN_MIPS_SCOMMON symbols.  */
3088       if (sym->st_size > elf_gp_size (abfd)
3089           || ELF_ST_TYPE (sym->st_info) == STT_TLS)
3090         break;
3091
3092       /* st_value is the alignemnt constraint.
3093          That might be its actual size if it is an array or structure.  */
3094       switch (sym->st_value)
3095         {
3096         case 1:
3097           *secp = bfd_make_section_old_way (abfd, ".scommon_b");
3098           break;
3099         case 2:
3100           *secp = bfd_make_section_old_way (abfd, ".scommon_h");
3101           break;
3102         case 4:
3103           *secp = bfd_make_section_old_way (abfd, ".scommon_w");
3104           break;
3105         case 8:
3106           *secp = bfd_make_section_old_way (abfd, ".scommon_d");
3107           break;
3108         default:
3109           return TRUE;
3110         }
3111
3112       (*secp)->flags |= SEC_IS_COMMON;
3113       *valp = sym->st_size;
3114       break;
3115     }
3116
3117   return TRUE;
3118 }
3119
3120
3121 /* This function can figure out the best location for a base register to access
3122    data relative to this base register
3123    INPUT:
3124    sda_d0: size of first DOUBLE WORD data section
3125    sda_w0: size of first WORD data section
3126    sda_h0: size of first HALF WORD data section
3127    sda_b : size of BYTE data section
3128    sda_hi: size of second HALF WORD data section
3129    sda_w1: size of second WORD data section
3130    sda_d1: size of second DOUBLE WORD data section
3131    OUTPUT:
3132    offset (always positive) from the beginning of sda_d0 if OK
3133    a negative error value if fail
3134    NOTE:
3135    these 7 sections have to be located back to back if exist
3136    a pass in 0 value for non-existing section   */
3137
3138 /* Due to the interpretation of simm15 field of load/store depending on
3139    data accessing size, the organization of base register relative data shall
3140    like the following figure
3141    -------------------------------------------
3142    |  DOUBLE WORD sized data (range +/- 128K)
3143    -------------------------------------------
3144    |  WORD sized data (range +/- 64K)
3145    -------------------------------------------
3146    |  HALF WORD sized data (range +/- 32K)
3147    -------------------------------------------
3148    |  BYTE sized data (range +/- 16K)
3149    -------------------------------------------
3150    |  HALF WORD sized data (range +/- 32K)
3151    -------------------------------------------
3152    |  WORD sized data (range +/- 64K)
3153    -------------------------------------------
3154    |  DOUBLE WORD sized data (range +/- 128K)
3155    -------------------------------------------
3156    Its base register shall be set to access these data freely.  */
3157
3158 /* We have to figure out the SDA_BASE value, so that we can adjust the
3159    symbol value correctly.  We look up the symbol _SDA_BASE_ in the output
3160    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
3161    target data.  We don't need to adjust the symbol value for an
3162    external symbol if we are producing relocatable output.  */
3163
3164 static asection *sda_rela_sec = NULL;
3165
3166 #define SDA_SECTION_NUM 10
3167
3168 static bfd_reloc_status_type
3169 nds32_elf_final_sda_base (bfd *output_bfd, struct bfd_link_info *info,
3170                           bfd_vma *psb, bfd_boolean add_symbol)
3171 {
3172   int relax_fp_as_gp;
3173   struct elf_nds32_link_hash_table *table;
3174   struct bfd_link_hash_entry *h, *h2;
3175   long unsigned int total = 0;
3176
3177   h = bfd_link_hash_lookup (info->hash, "_SDA_BASE_", FALSE, FALSE, TRUE);
3178   if (!h || (h->type != bfd_link_hash_defined && h->type != bfd_link_hash_defweak))
3179     {
3180       asection *first = NULL, *final = NULL, *temp;
3181       bfd_vma sda_base;
3182       /* The first section must be 4-byte aligned to promise _SDA_BASE_ being
3183          4 byte-aligned.  Therefore, it has to set the first section ".data"
3184          4 byte-aligned.  */
3185       static const char sec_name[SDA_SECTION_NUM][10] =
3186         {
3187           ".data", ".got", ".sdata_d", ".sdata_w", ".sdata_h", ".sdata_b",
3188           ".sbss_b", ".sbss_h", ".sbss_w", ".sbss_d"
3189         };
3190       size_t i = 0;
3191
3192       if (output_bfd->sections == NULL)
3193         {
3194           *psb = elf_gp (output_bfd);
3195           return bfd_reloc_ok;
3196         }
3197
3198       /* Get the first and final section.  */
3199       while (i < sizeof (sec_name) / sizeof (sec_name [0]))
3200         {
3201           temp = bfd_get_section_by_name (output_bfd, sec_name[i]);
3202           if (temp && !first && (temp->size != 0 || temp->rawsize != 0))
3203             first = temp;
3204           if (temp && (temp->size != 0 || temp->rawsize != 0))
3205             final = temp;
3206
3207           /* Summarize the sections in order to check if joining .bss.  */
3208           if (temp && temp->size != 0)
3209             total += temp->size;
3210           else if (temp && temp->rawsize != 0)
3211             total += temp->rawsize;
3212
3213           i++;
3214         }
3215
3216       /* Check .bss size.  */
3217       temp = bfd_get_section_by_name (output_bfd, ".bss");
3218       if (temp)
3219         {
3220           if (temp->size != 0)
3221             total += temp->size;
3222           else if (temp->rawsize != 0)
3223             total += temp->rawsize;
3224
3225           if (total < 0x80000)
3226             {
3227               if (!first && (temp->size != 0 || temp->rawsize != 0))
3228                 first = temp;
3229               if ((temp->size != 0 || temp->rawsize != 0))
3230                 final = temp;
3231             }
3232         }
3233
3234       if (first && final)
3235         {
3236           /* The middle of data region.  */
3237           sda_base = final->vma / 2 + final->rawsize / 2 + first->vma / 2;
3238
3239           /* Find the section sda_base located.  */
3240           i = 0;
3241           while (i < sizeof (sec_name) / sizeof (sec_name [0]))
3242             {
3243               final = bfd_get_section_by_name (output_bfd, sec_name[i]);
3244               if (final && (final->size != 0 || final->rawsize != 0)
3245                   && sda_base >= final->vma)
3246                 {
3247                   first = final;
3248                   i++;
3249                 }
3250               else
3251                 break;
3252             }
3253         }
3254       else
3255         {
3256           /* There is not any data section in output bfd, and set _SDA_BASE_ in
3257              first output section.  */
3258           first = output_bfd->sections;
3259           while (first && first->size == 0 && first->rawsize == 0)
3260             first = first->next;
3261           if (!first)
3262             {
3263               *psb = elf_gp (output_bfd);
3264               return bfd_reloc_ok;
3265             }
3266           sda_base = first->vma + first->rawsize;
3267         }
3268
3269       sda_base -= first->vma;
3270       sda_base = sda_base & (~7);
3271
3272       if (!_bfd_generic_link_add_one_symbol
3273              (info, output_bfd, "_SDA_BASE_", BSF_GLOBAL | BSF_WEAK, first,
3274               (bfd_vma) sda_base, (const char *) NULL, FALSE,
3275               get_elf_backend_data (output_bfd)->collect, &h))
3276         return FALSE;
3277
3278       sda_rela_sec = first;
3279
3280       table = nds32_elf_hash_table (info);
3281       relax_fp_as_gp = table->relax_fp_as_gp;
3282       if (relax_fp_as_gp)
3283         {
3284           h2 = bfd_link_hash_lookup (info->hash, FP_BASE_NAME,
3285                                      FALSE, FALSE, FALSE);
3286           /* Define a weak FP_BASE_NAME here to prevent the undefined symbol.
3287              And set FP equal to SDA_BASE to do relaxation for
3288              la $fp, _FP_BASE_.  */
3289           if (!_bfd_generic_link_add_one_symbol
3290                  (info, output_bfd, FP_BASE_NAME, BSF_GLOBAL | BSF_WEAK,
3291                   first, (bfd_vma) sda_base, (const char *) NULL,
3292                   FALSE, get_elf_backend_data (output_bfd)->collect, &h2))
3293             return FALSE;
3294         }
3295     }
3296
3297   if (add_symbol == TRUE)
3298     {
3299       if (h)
3300         {
3301           /* Now set gp.  */
3302           elf_gp (output_bfd) = (h->u.def.value
3303                                  + h->u.def.section->output_section->vma
3304                                  + h->u.def.section->output_offset);
3305         }
3306       else
3307         {
3308           _bfd_error_handler (_("error: Can't find symbol: _SDA_BASE_."));
3309           return bfd_reloc_dangerous;
3310         }
3311     }
3312
3313   *psb = h->u.def.value + h->u.def.section->output_section->vma
3314          + h->u.def.section->output_offset;
3315   return bfd_reloc_ok;
3316 }
3317 \f
3318
3319 /* Return size of a PLT entry.  */
3320 #define elf_nds32_sizeof_plt(info) PLT_ENTRY_SIZE
3321
3322
3323 /* Create an entry in an nds32 ELF linker hash table.  */
3324
3325 static struct bfd_hash_entry *
3326 nds32_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
3327                              struct bfd_hash_table *table,
3328                              const char *string)
3329 {
3330   struct elf_nds32_link_hash_entry *ret;
3331
3332   ret = (struct elf_nds32_link_hash_entry *) entry;
3333
3334   /* Allocate the structure if it has not already been allocated by a
3335      subclass.  */
3336   if (ret == NULL)
3337     ret = (struct elf_nds32_link_hash_entry *)
3338        bfd_hash_allocate (table, sizeof (struct elf_nds32_link_hash_entry));
3339
3340   if (ret == NULL)
3341     return (struct bfd_hash_entry *) ret;
3342
3343   /* Call the allocation method of the superclass.  */
3344   ret = (struct elf_nds32_link_hash_entry *)
3345     _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, table, string);
3346
3347   if (ret != NULL)
3348     {
3349       struct elf_nds32_link_hash_entry *eh;
3350
3351       eh = (struct elf_nds32_link_hash_entry *) ret;
3352       eh->dyn_relocs = NULL;
3353       eh->tls_type = GOT_UNKNOWN;
3354     }
3355
3356   return (struct bfd_hash_entry *) ret;
3357 }
3358
3359 /* Create an nds32 ELF linker hash table.  */
3360
3361 static struct bfd_link_hash_table *
3362 nds32_elf_link_hash_table_create (bfd *abfd)
3363 {
3364   struct elf_nds32_link_hash_table *ret;
3365
3366   bfd_size_type amt = sizeof (struct elf_nds32_link_hash_table);
3367
3368   ret = (struct elf_nds32_link_hash_table *) bfd_zmalloc (amt);
3369   if (ret == NULL)
3370     return NULL;
3371
3372   /* patch tag.  */
3373   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
3374                                       nds32_elf_link_hash_newfunc,
3375                                       sizeof (struct elf_nds32_link_hash_entry),
3376                                       NDS32_ELF_DATA))
3377     {
3378       free (ret);
3379       return NULL;
3380     }
3381
3382   ret->sgot = NULL;
3383   ret->sgotplt = NULL;
3384   ret->srelgot = NULL;
3385   ret->splt = NULL;
3386   ret->srelplt = NULL;
3387   ret->sdynbss = NULL;
3388   ret->srelbss = NULL;
3389   ret->sym_ld_script = NULL;
3390   ret->ex9_export_file = NULL;
3391   ret->ex9_import_file = NULL;
3392
3393   return &ret->root.root;
3394 }
3395
3396 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
3397    shortcuts to them in our hash table.  */
3398
3399 static bfd_boolean
3400 create_got_section (bfd *dynobj, struct bfd_link_info *info)
3401 {
3402   struct elf_nds32_link_hash_table *htab;
3403
3404   if (!_bfd_elf_create_got_section (dynobj, info))
3405     return FALSE;
3406
3407   htab = nds32_elf_hash_table (info);
3408   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
3409   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
3410   if (!htab->sgot || !htab->sgotplt)
3411     abort ();
3412
3413   /* _bfd_elf_create_got_section will create it for us.  */
3414   htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
3415   if (htab->srelgot == NULL
3416       || !bfd_set_section_flags (dynobj, htab->srelgot,
3417                                  (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
3418                                   | SEC_IN_MEMORY | SEC_LINKER_CREATED
3419                                   | SEC_READONLY))
3420       || !bfd_set_section_alignment (dynobj, htab->srelgot, 2))
3421     return FALSE;
3422
3423   return TRUE;
3424 }
3425
3426 /* Create dynamic sections when linking against a dynamic object.  */
3427
3428 static bfd_boolean
3429 nds32_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
3430 {
3431   struct elf_nds32_link_hash_table *htab;
3432   flagword flags, pltflags;
3433   register asection *s;
3434   const struct elf_backend_data *bed;
3435   int ptralign = 2;             /* 32-bit  */
3436
3437   bed = get_elf_backend_data (abfd);
3438
3439   htab = nds32_elf_hash_table (info);
3440
3441   /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3442      .rel[a].bss sections.  */
3443
3444   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3445            | SEC_LINKER_CREATED);
3446
3447   pltflags = flags;
3448   pltflags |= SEC_CODE;
3449   if (bed->plt_not_loaded)
3450     pltflags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
3451   if (bed->plt_readonly)
3452     pltflags |= SEC_READONLY;
3453
3454   s = bfd_make_section (abfd, ".plt");
3455   htab->splt = s;
3456   if (s == NULL
3457       || !bfd_set_section_flags (abfd, s, pltflags)
3458       || !bfd_set_section_alignment (abfd, s, bed->plt_alignment))
3459     return FALSE;
3460
3461   if (bed->want_plt_sym)
3462     {
3463       /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3464          .plt section.  */
3465       struct bfd_link_hash_entry *bh = NULL;
3466       struct elf_link_hash_entry *h;
3467
3468       if (!(_bfd_generic_link_add_one_symbol
3469             (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
3470              (bfd_vma) 0, (const char *) NULL, FALSE,
3471              get_elf_backend_data (abfd)->collect, &bh)))
3472         return FALSE;
3473
3474       h = (struct elf_link_hash_entry *) bh;
3475       h->def_regular = 1;
3476       h->type = STT_OBJECT;
3477
3478       if (bfd_link_pic (info) && !bfd_elf_link_record_dynamic_symbol (info, h))
3479         return FALSE;
3480     }
3481
3482   s = bfd_make_section (abfd,
3483                         bed->default_use_rela_p ? ".rela.plt" : ".rel.plt");
3484   htab->srelplt = s;
3485   if (s == NULL
3486       || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
3487       || !bfd_set_section_alignment (abfd, s, ptralign))
3488     return FALSE;
3489
3490   if (htab->sgot == NULL && !create_got_section (abfd, info))
3491     return FALSE;
3492
3493   {
3494     const char *secname;
3495     char *relname;
3496     flagword secflags;
3497     asection *sec;
3498
3499     for (sec = abfd->sections; sec; sec = sec->next)
3500       {
3501         secflags = bfd_get_section_flags (abfd, sec);
3502         if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
3503             || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
3504           continue;
3505         secname = bfd_get_section_name (abfd, sec);
3506         relname = (char *) bfd_malloc ((bfd_size_type) strlen (secname) + 6);
3507         strcpy (relname, ".rela");
3508         strcat (relname, secname);
3509         if (bfd_get_section_by_name (abfd, secname))
3510           continue;
3511         s = bfd_make_section (abfd, relname);
3512         if (s == NULL
3513             || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
3514             || !bfd_set_section_alignment (abfd, s, ptralign))
3515           return FALSE;
3516       }
3517   }
3518
3519   if (bed->want_dynbss)
3520     {
3521       /* The .dynbss section is a place to put symbols which are defined
3522          by dynamic objects, are referenced by regular objects, and are
3523          not functions.  We must allocate space for them in the process
3524          image and use a R_*_COPY reloc to tell the dynamic linker to
3525          initialize them at run time.  The linker script puts the .dynbss
3526          section into the .bss section of the final image.  */
3527       s = bfd_make_section (abfd, ".dynbss");
3528       htab->sdynbss = s;
3529       if (s == NULL
3530           || !bfd_set_section_flags (abfd, s, SEC_ALLOC | SEC_LINKER_CREATED))
3531         return FALSE;
3532       /* The .rel[a].bss section holds copy relocs.  This section is not
3533          normally needed.  We need to create it here, though, so that the
3534          linker will map it to an output section.  We can't just create it
3535          only if we need it, because we will not know whether we need it
3536          until we have seen all the input files, and the first time the
3537          main linker code calls BFD after examining all the input files
3538          (size_dynamic_sections) the input sections have already been
3539          mapped to the output sections.  If the section turns out not to
3540          be needed, we can discard it later.  We will never need this
3541          section when generating a shared object, since they do not use
3542          copy relocs.  */
3543       if (!bfd_link_pic (info))
3544         {
3545           s = bfd_make_section (abfd, (bed->default_use_rela_p
3546                                        ? ".rela.bss" : ".rel.bss"));
3547           htab->srelbss = s;
3548           if (s == NULL
3549               || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
3550               || !bfd_set_section_alignment (abfd, s, ptralign))
3551             return FALSE;
3552         }
3553     }
3554
3555   return TRUE;
3556 }
3557
3558 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
3559 static void
3560 nds32_elf_copy_indirect_symbol (struct bfd_link_info *info,
3561                                 struct elf_link_hash_entry *dir,
3562                                 struct elf_link_hash_entry *ind)
3563 {
3564   struct elf_nds32_link_hash_entry *edir, *eind;
3565
3566   edir = (struct elf_nds32_link_hash_entry *) dir;
3567   eind = (struct elf_nds32_link_hash_entry *) ind;
3568
3569   if (eind->dyn_relocs != NULL)
3570     {
3571       if (edir->dyn_relocs != NULL)
3572         {
3573           struct elf_nds32_dyn_relocs **pp;
3574           struct elf_nds32_dyn_relocs *p;
3575
3576           if (ind->root.type == bfd_link_hash_indirect)
3577             abort ();
3578
3579           /* Add reloc counts against the weak sym to the strong sym
3580              list.  Merge any entries against the same section.  */
3581           for (pp = &eind->dyn_relocs; (p = *pp) != NULL;)
3582             {
3583               struct elf_nds32_dyn_relocs *q;
3584
3585               for (q = edir->dyn_relocs; q != NULL; q = q->next)
3586                 if (q->sec == p->sec)
3587                   {
3588                     q->pc_count += p->pc_count;
3589                     q->count += p->count;
3590                     *pp = p->next;
3591                     break;
3592                   }
3593               if (q == NULL)
3594                 pp = &p->next;
3595             }
3596           *pp = edir->dyn_relocs;
3597         }
3598
3599       edir->dyn_relocs = eind->dyn_relocs;
3600       eind->dyn_relocs = NULL;
3601     }
3602
3603   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3604 }
3605 \f
3606
3607 /* Adjust a symbol defined by a dynamic object and referenced by a
3608    regular object.  The current definition is in some section of the
3609    dynamic object, but we're not including those sections.  We have to
3610    change the definition to something the rest of the link can
3611    understand.  */
3612
3613 static bfd_boolean
3614 nds32_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
3615                                  struct elf_link_hash_entry *h)
3616 {
3617   struct elf_nds32_link_hash_table *htab;
3618   struct elf_nds32_link_hash_entry *eh;
3619   struct elf_nds32_dyn_relocs *p;
3620   bfd *dynobj;
3621   asection *s;
3622   unsigned int power_of_two;
3623
3624   dynobj = elf_hash_table (info)->dynobj;
3625
3626   /* Make sure we know what is going on here.  */
3627   BFD_ASSERT (dynobj != NULL
3628               && (h->needs_plt
3629                   || h->u.weakdef != NULL
3630                   || (h->def_dynamic && h->ref_regular && !h->def_regular)));
3631
3632
3633   /* If this is a function, put it in the procedure linkage table.  We
3634      will fill in the contents of the procedure linkage table later,
3635      when we know the address of the .got section.  */
3636   if (h->type == STT_FUNC || h->needs_plt)
3637     {
3638       if (!bfd_link_pic (info)
3639           && !h->def_dynamic
3640           && !h->ref_dynamic
3641           && h->root.type != bfd_link_hash_undefweak
3642           && h->root.type != bfd_link_hash_undefined)
3643         {
3644           /* This case can occur if we saw a PLT reloc in an input
3645              file, but the symbol was never referred to by a dynamic
3646              object.  In such a case, we don't actually need to build
3647              a procedure linkage table, and we can just do a PCREL
3648              reloc instead.  */
3649           h->plt.offset = (bfd_vma) - 1;
3650           h->needs_plt = 0;
3651         }
3652
3653       return TRUE;
3654     }
3655   else
3656     h->plt.offset = (bfd_vma) - 1;
3657
3658   /* If this is a weak symbol, and there is a real definition, the
3659      processor independent code will have arranged for us to see the
3660      real definition first, and we can just use the same value.  */
3661   if (h->u.weakdef != NULL)
3662     {
3663       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
3664                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
3665       h->root.u.def.section = h->u.weakdef->root.u.def.section;
3666       h->root.u.def.value = h->u.weakdef->root.u.def.value;
3667       return TRUE;
3668     }
3669
3670   /* This is a reference to a symbol defined by a dynamic object which
3671      is not a function.  */
3672
3673   /* If we are creating a shared library, we must presume that the
3674      only references to the symbol are via the global offset table.
3675      For such cases we need not do anything here; the relocations will
3676      be handled correctly by relocate_section.  */
3677   if (bfd_link_pic (info))
3678     return TRUE;
3679
3680   /* If there are no references to this symbol that do not use the
3681      GOT, we don't need to generate a copy reloc.  */
3682   if (!h->non_got_ref)
3683     return TRUE;
3684
3685   /* If -z nocopyreloc was given, we won't generate them either.  */
3686   if (info->nocopyreloc)
3687     {
3688       h->non_got_ref = 0;
3689       return TRUE;
3690     }
3691
3692   eh = (struct elf_nds32_link_hash_entry *) h;
3693   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3694     {
3695       s = p->sec->output_section;
3696       if (s != NULL && (s->flags & (SEC_READONLY | SEC_HAS_CONTENTS)) != 0)
3697         break;
3698     }
3699
3700   /* If we didn't find any dynamic relocs in sections which needs the
3701      copy reloc, then we'll be keeping the dynamic relocs and avoiding
3702      the copy reloc.  */
3703   if (p == NULL)
3704     {
3705       h->non_got_ref = 0;
3706       return TRUE;
3707     }
3708
3709   /* We must allocate the symbol in our .dynbss section, which will
3710      become part of the .bss section of the executable.  There will be
3711      an entry for this symbol in the .dynsym section.  The dynamic
3712      object will contain position independent code, so all references
3713      from the dynamic object to this symbol will go through the global
3714      offset table.  The dynamic linker will use the .dynsym entry to
3715      determine the address it must put in the global offset table, so
3716      both the dynamic object and the regular object will refer to the
3717      same memory location for the variable.  */
3718
3719   htab = nds32_elf_hash_table (info);
3720   s = htab->sdynbss;
3721   BFD_ASSERT (s != NULL);
3722
3723   /* We must generate a R_NDS32_COPY reloc to tell the dynamic linker
3724      to copy the initial value out of the dynamic object and into the
3725      runtime process image.  We need to remember the offset into the
3726      .rela.bss section we are going to use.  */
3727   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
3728     {
3729       asection *srel;
3730
3731       srel = htab->srelbss;
3732       BFD_ASSERT (srel != NULL);
3733       srel->size += sizeof (Elf32_External_Rela);
3734       h->needs_copy = 1;
3735     }
3736
3737   /* We need to figure out the alignment required for this symbol.  I
3738      have no idea how ELF linkers handle this.  */
3739   power_of_two = bfd_log2 (h->size);
3740   if (power_of_two > 3)
3741     power_of_two = 3;
3742
3743   /* Apply the required alignment.  */
3744   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
3745   if (power_of_two > bfd_get_section_alignment (dynobj, s))
3746     {
3747       if (!bfd_set_section_alignment (dynobj, s, power_of_two))
3748         return FALSE;
3749     }
3750
3751   /* Define the symbol as being at this point in the section.  */
3752   h->root.u.def.section = s;
3753   h->root.u.def.value = s->size;
3754
3755   /* Increment the section size to make room for the symbol.  */
3756   s->size += h->size;
3757
3758   return TRUE;
3759 }
3760
3761 /* Allocate space in .plt, .got and associated reloc sections for
3762    dynamic relocs.  */
3763
3764 static bfd_boolean
3765 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3766 {
3767   struct bfd_link_info *info;
3768   struct elf_nds32_link_hash_table *htab;
3769   struct elf_nds32_link_hash_entry *eh;
3770   struct elf_nds32_dyn_relocs *p;
3771
3772   if (h->root.type == bfd_link_hash_indirect)
3773     return TRUE;
3774
3775   if (h->root.type == bfd_link_hash_warning)
3776     /* When warning symbols are created, they **replace** the "real"
3777        entry in the hash table, thus we never get to see the real
3778        symbol in a hash traversal.  So look at it now.  */
3779     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3780
3781   info = (struct bfd_link_info *) inf;
3782   htab = nds32_elf_hash_table (info);
3783
3784   eh = (struct elf_nds32_link_hash_entry *) h;
3785
3786   if (htab->root.dynamic_sections_created && h->plt.refcount > 0)
3787     {
3788       /* Make sure this symbol is output as a dynamic symbol.
3789          Undefined weak syms won't yet be marked as dynamic.  */
3790       if (h->dynindx == -1 && !h->forced_local)
3791         {
3792           if (!bfd_elf_link_record_dynamic_symbol (info, h))
3793             return FALSE;
3794         }
3795
3796       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
3797         {
3798           asection *s = htab->splt;
3799
3800           /* If this is the first .plt entry, make room for the special
3801              first entry.  */
3802           if (s->size == 0)
3803             s->size += PLT_ENTRY_SIZE;
3804
3805           h->plt.offset = s->size;
3806
3807           /* If this symbol is not defined in a regular file, and we are
3808              not generating a shared library, then set the symbol to this
3809              location in the .plt.  This is required to make function
3810              pointers compare as equal between the normal executable and
3811              the shared library.  */
3812           if (!bfd_link_pic (info) && !h->def_regular)
3813             {
3814               h->root.u.def.section = s;
3815               h->root.u.def.value = h->plt.offset;
3816             }
3817
3818           /* Make room for this entry.  */
3819           s->size += PLT_ENTRY_SIZE;
3820
3821           /* We also need to make an entry in the .got.plt section, which
3822              will be placed in the .got section by the linker script.  */
3823           htab->sgotplt->size += 4;
3824
3825           /* We also need to make an entry in the .rel.plt section.  */
3826           htab->srelplt->size += sizeof (Elf32_External_Rela);
3827         }
3828       else
3829         {
3830           h->plt.offset = (bfd_vma) - 1;
3831           h->needs_plt = 0;
3832         }
3833     }
3834   else
3835     {
3836       h->plt.offset = (bfd_vma) - 1;
3837       h->needs_plt = 0;
3838     }
3839
3840   if (h->got.refcount > 0)
3841     {
3842       asection *s;
3843       bfd_boolean dyn;
3844       int tls_type = elf32_nds32_hash_entry (h)->tls_type;
3845
3846       /* Make sure this symbol is output as a dynamic symbol.
3847          Undefined weak syms won't yet be marked as dynamic.  */
3848       if (h->dynindx == -1 && !h->forced_local)
3849         {
3850           if (!bfd_elf_link_record_dynamic_symbol (info, h))
3851             return FALSE;
3852         }
3853
3854       s = htab->sgot;
3855       h->got.offset = s->size;
3856
3857       if (tls_type == GOT_UNKNOWN)
3858         abort ();
3859       else if (tls_type == GOT_NORMAL
3860                || tls_type == GOT_TLS_IE)
3861         /* Need a GOT slot.  */
3862         s->size += 4;
3863
3864       dyn = htab->root.dynamic_sections_created;
3865       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h))
3866         htab->srelgot->size += sizeof (Elf32_External_Rela);
3867     }
3868   else
3869     h->got.offset = (bfd_vma) - 1;
3870
3871   if (eh->dyn_relocs == NULL)
3872     return TRUE;
3873
3874   /* In the shared -Bsymbolic case, discard space allocated for
3875      dynamic pc-relative relocs against symbols which turn out to be
3876      defined in regular objects.  For the normal shared case, discard
3877      space for pc-relative relocs that have become local due to symbol
3878      visibility changes.  */
3879
3880   if (bfd_link_pic (info))
3881     {
3882       if (h->def_regular && (h->forced_local || info->symbolic))
3883         {
3884           struct elf_nds32_dyn_relocs **pp;
3885
3886           for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
3887             {
3888               p->count -= p->pc_count;
3889               p->pc_count = 0;
3890               if (p->count == 0)
3891                 *pp = p->next;
3892               else
3893                 pp = &p->next;
3894             }
3895         }
3896     }
3897   else
3898     {
3899       /* For the non-shared case, discard space for relocs against
3900          symbols which turn out to need copy relocs or are not dynamic.  */
3901
3902       if (!h->non_got_ref
3903           && ((h->def_dynamic
3904                && !h->def_regular)
3905               || (htab->root.dynamic_sections_created
3906                   && (h->root.type == bfd_link_hash_undefweak
3907                       || h->root.type == bfd_link_hash_undefined))))
3908         {
3909           /* Make sure this symbol is output as a dynamic symbol.
3910              Undefined weak syms won't yet be marked as dynamic.  */
3911           if (h->dynindx == -1 && !h->forced_local)
3912             {
3913               if (!bfd_elf_link_record_dynamic_symbol (info, h))
3914                 return FALSE;
3915             }
3916
3917           /* If that succeeded, we know we'll be keeping all the
3918              relocs.  */
3919           if (h->dynindx != -1)
3920             goto keep;
3921         }
3922
3923       eh->dyn_relocs = NULL;
3924
3925     keep:;
3926     }
3927
3928   /* Finally, allocate space.  */
3929   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3930     {
3931       asection *sreloc = elf_section_data (p->sec)->sreloc;
3932       sreloc->size += p->count * sizeof (Elf32_External_Rela);
3933     }
3934
3935   return TRUE;
3936 }
3937
3938 /* Find any dynamic relocs that apply to read-only sections.  */
3939
3940 static bfd_boolean
3941 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3942 {
3943   struct elf_nds32_link_hash_entry *eh;
3944   struct elf_nds32_dyn_relocs *p;
3945
3946   if (h->root.type == bfd_link_hash_warning)
3947     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3948
3949   eh = (struct elf_nds32_link_hash_entry *) h;
3950   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3951     {
3952       asection *s = p->sec->output_section;
3953
3954       if (s != NULL && (s->flags & SEC_READONLY) != 0)
3955         {
3956           struct bfd_link_info *info = (struct bfd_link_info *) inf;
3957
3958           info->flags |= DF_TEXTREL;
3959
3960           /* Not an error, just cut short the traversal.  */
3961           return FALSE;
3962         }
3963     }
3964   return TRUE;
3965 }
3966
3967 /* Set the sizes of the dynamic sections.  */
3968
3969 static bfd_boolean
3970 nds32_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3971                                  struct bfd_link_info *info)
3972 {
3973   struct elf_nds32_link_hash_table *htab;
3974   bfd *dynobj;
3975   asection *s;
3976   bfd_boolean relocs;
3977   bfd *ibfd;
3978
3979   htab = nds32_elf_hash_table (info);
3980   dynobj = htab->root.dynobj;
3981   BFD_ASSERT (dynobj != NULL);
3982
3983   if (htab->root.dynamic_sections_created)
3984     {
3985       /* Set the contents of the .interp section to the interpreter.  */
3986       if (!bfd_link_pic (info) && !info->nointerp)
3987         {
3988           s = bfd_get_section_by_name (dynobj, ".interp");
3989           BFD_ASSERT (s != NULL);
3990           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3991           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3992         }
3993     }
3994
3995   /* Set up .got offsets for local syms, and space for local dynamic
3996      relocs.  */
3997   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3998     {
3999       bfd_signed_vma *local_got;
4000       bfd_signed_vma *end_local_got;
4001       bfd_size_type locsymcount;
4002       Elf_Internal_Shdr *symtab_hdr;
4003       asection *srel;
4004
4005       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
4006         continue;
4007
4008       for (s = ibfd->sections; s != NULL; s = s->next)
4009         {
4010           struct elf_nds32_dyn_relocs *p;
4011
4012           for (p = ((struct elf_nds32_dyn_relocs *)
4013                     elf_section_data (s)->local_dynrel);
4014                p != NULL; p = p->next)
4015             {
4016               if (!bfd_is_abs_section (p->sec)
4017                   && bfd_is_abs_section (p->sec->output_section))
4018                 {
4019                   /* Input section has been discarded, either because
4020                      it is a copy of a linkonce section or due to
4021                      linker script /DISCARD/, so we'll be discarding
4022                      the relocs too.  */
4023                 }
4024               else if (p->count != 0)
4025                 {
4026                   srel = elf_section_data (p->sec)->sreloc;
4027                   srel->size += p->count * sizeof (Elf32_External_Rela);
4028                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
4029                     info->flags |= DF_TEXTREL;
4030                 }
4031             }
4032         }
4033
4034       local_got = elf_local_got_refcounts (ibfd);
4035       if (!local_got)
4036         continue;
4037
4038       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4039       locsymcount = symtab_hdr->sh_info;
4040       end_local_got = local_got + locsymcount;
4041       s = htab->sgot;
4042       srel = htab->srelgot;
4043       for (; local_got < end_local_got; ++local_got)
4044         {
4045           if (*local_got > 0)
4046             {
4047               *local_got = s->size;
4048               s->size += 4;
4049               if (bfd_link_pic (info))
4050                 srel->size += sizeof (Elf32_External_Rela);
4051             }
4052           else
4053             *local_got = (bfd_vma) - 1;
4054         }
4055     }
4056
4057   /* Allocate global sym .plt and .got entries, and space for global
4058      sym dynamic relocs.  */
4059   elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (void *) info);
4060
4061   /* We now have determined the sizes of the various dynamic sections.
4062      Allocate memory for them.  */
4063   relocs = FALSE;
4064   for (s = dynobj->sections; s != NULL; s = s->next)
4065     {
4066       if ((s->flags & SEC_LINKER_CREATED) == 0)
4067         continue;
4068
4069       if (s == htab->splt)
4070         {
4071           /* Strip this section if we don't need it; see the
4072              comment below.  */
4073         }
4074       else if (s == htab->sgot)
4075         {
4076           got_size += s->size;
4077         }
4078       else if (s == htab->sgotplt)
4079         {
4080           got_size += s->size;
4081         }
4082       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
4083         {
4084           if (s->size != 0 && s != htab->srelplt)
4085             relocs = TRUE;
4086
4087           /* We use the reloc_count field as a counter if we need
4088              to copy relocs into the output file.  */
4089           s->reloc_count = 0;
4090         }
4091       else
4092         {
4093           /* It's not one of our sections, so don't allocate space.  */
4094           continue;
4095         }
4096
4097       if (s->size == 0)
4098         {
4099           /* If we don't need this section, strip it from the
4100              output file.  This is mostly to handle .rela.bss and
4101              .rela.plt.  We must create both sections in
4102              create_dynamic_sections, because they must be created
4103              before the linker maps input sections to output
4104              sections.  The linker does that before
4105              adjust_dynamic_symbol is called, and it is that
4106              function which decides whether anything needs to go
4107              into these sections.  */
4108           s->flags |= SEC_EXCLUDE;
4109           continue;
4110         }
4111
4112       /* Allocate memory for the section contents.  We use bfd_zalloc
4113          here in case unused entries are not reclaimed before the
4114          section's contents are written out.  This should not happen,
4115          but this way if it does, we get a R_NDS32_NONE reloc instead
4116          of garbage.  */
4117       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
4118       if (s->contents == NULL)
4119         return FALSE;
4120     }
4121
4122
4123   if (htab->root.dynamic_sections_created)
4124     {
4125       /* Add some entries to the .dynamic section.  We fill in the
4126          values later, in nds32_elf_finish_dynamic_sections, but we
4127          must add the entries now so that we get the correct size for
4128          the .dynamic section.  The DT_DEBUG entry is filled in by the
4129          dynamic linker and used by the debugger.  */
4130 #define add_dynamic_entry(TAG, VAL) \
4131   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
4132
4133       if (!bfd_link_pic (info))
4134         {
4135           if (!add_dynamic_entry (DT_DEBUG, 0))
4136             return FALSE;
4137         }
4138
4139       if (htab->splt->size != 0)
4140         {
4141           if (!add_dynamic_entry (DT_PLTGOT, 0)
4142               || !add_dynamic_entry (DT_PLTRELSZ, 0)
4143               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
4144               || !add_dynamic_entry (DT_JMPREL, 0))
4145             return FALSE;
4146         }
4147
4148       if (relocs)
4149         {
4150           if (!add_dynamic_entry (DT_RELA, 0)
4151               || !add_dynamic_entry (DT_RELASZ, 0)
4152               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
4153             return FALSE;
4154
4155           /* If any dynamic relocs apply to a read-only section,
4156              then we need a DT_TEXTREL entry.  */
4157           if ((info->flags & DF_TEXTREL) == 0)
4158             elf_link_hash_traverse (&htab->root, readonly_dynrelocs,
4159                                     (void *) info);
4160
4161           if ((info->flags & DF_TEXTREL) != 0)
4162             {
4163               if (!add_dynamic_entry (DT_TEXTREL, 0))
4164                 return FALSE;
4165             }
4166         }
4167     }
4168 #undef add_dynamic_entry
4169
4170   return TRUE;
4171 }
4172
4173 static bfd_reloc_status_type
4174 nds32_relocate_contents (reloc_howto_type *howto, bfd *input_bfd,
4175                          bfd_vma relocation, bfd_byte *location)
4176 {
4177   int size;
4178   bfd_vma x = 0;
4179   bfd_reloc_status_type flag;
4180   unsigned int rightshift = howto->rightshift;
4181   unsigned int bitpos = howto->bitpos;
4182
4183   /* If the size is negative, negate RELOCATION.  This isn't very
4184      general.  */
4185   if (howto->size < 0)
4186     relocation = -relocation;
4187
4188   /* Get the value we are going to relocate.  */
4189   size = bfd_get_reloc_size (howto);
4190   switch (size)
4191     {
4192     default:
4193       abort ();
4194       break;
4195     case 0:
4196       return bfd_reloc_ok;
4197     case 2:
4198       x = bfd_getb16 (location);
4199       break;
4200     case 4:
4201       x = bfd_getb32 (location);
4202       break;
4203     }
4204
4205   /* Check for overflow.  FIXME: We may drop bits during the addition
4206      which we don't check for.  We must either check at every single
4207      operation, which would be tedious, or we must do the computations
4208      in a type larger than bfd_vma, which would be inefficient.  */
4209   flag = bfd_reloc_ok;
4210   if (howto->complain_on_overflow != complain_overflow_dont)
4211     {
4212       bfd_vma addrmask, fieldmask, signmask, ss;
4213       bfd_vma a, b, sum;
4214
4215       /* Get the values to be added together.  For signed and unsigned
4216          relocations, we assume that all values should be truncated to
4217          the size of an address.  For bitfields, all the bits matter.
4218          See also bfd_check_overflow.  */
4219       fieldmask = N_ONES (howto->bitsize);
4220       signmask = ~fieldmask;
4221       addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
4222       a = (relocation & addrmask) >> rightshift;
4223       b = (x & howto->src_mask & addrmask) >> bitpos;
4224
4225       switch (howto->complain_on_overflow)
4226         {
4227         case complain_overflow_signed:
4228           /* If any sign bits are set, all sign bits must be set.
4229              That is, A must be a valid negative address after
4230              shifting.  */
4231           signmask = ~(fieldmask >> 1);
4232           /* Fall through.  */
4233
4234         case complain_overflow_bitfield:
4235           /* Much like the signed check, but for a field one bit
4236              wider.  We allow a bitfield to represent numbers in the
4237              range -2**n to 2**n-1, where n is the number of bits in the
4238              field.  Note that when bfd_vma is 32 bits, a 32-bit reloc
4239              can't overflow, which is exactly what we want.  */
4240           ss = a & signmask;
4241           if (ss != 0 && ss != ((addrmask >> rightshift) & signmask))
4242             flag = bfd_reloc_overflow;
4243
4244           /* We only need this next bit of code if the sign bit of B
4245              is below the sign bit of A.  This would only happen if
4246              SRC_MASK had fewer bits than BITSIZE.  Note that if
4247              SRC_MASK has more bits than BITSIZE, we can get into
4248              trouble; we would need to verify that B is in range, as
4249              we do for A above.  */
4250           ss = ((~howto->src_mask) >> 1) & howto->src_mask;
4251           ss >>= bitpos;
4252
4253           /* Set all the bits above the sign bit.  */
4254           b = (b ^ ss) - ss;
4255
4256           /* Now we can do the addition.  */
4257           sum = a + b;
4258
4259           /* See if the result has the correct sign.  Bits above the
4260              sign bit are junk now; ignore them.  If the sum is
4261              positive, make sure we did not have all negative inputs;
4262              if the sum is negative, make sure we did not have all
4263              positive inputs.  The test below looks only at the sign
4264              bits, and it really just
4265              SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
4266
4267              We mask with addrmask here to explicitly allow an address
4268              wrap-around.  The Linux kernel relies on it, and it is
4269              the only way to write assembler code which can run when
4270              loaded at a location 0x80000000 away from the location at
4271              which it is linked.  */
4272           if (((~(a ^ b)) & (a ^ sum)) & signmask & addrmask)
4273             flag = bfd_reloc_overflow;
4274
4275           break;
4276
4277         case complain_overflow_unsigned:
4278           /* Checking for an unsigned overflow is relatively easy:
4279              trim the addresses and add, and trim the result as well.
4280              Overflow is normally indicated when the result does not
4281              fit in the field.  However, we also need to consider the
4282              case when, e.g., fieldmask is 0x7fffffff or smaller, an
4283              input is 0x80000000, and bfd_vma is only 32 bits; then we
4284              will get sum == 0, but there is an overflow, since the
4285              inputs did not fit in the field.  Instead of doing a
4286              separate test, we can check for this by or-ing in the
4287              operands when testing for the sum overflowing its final
4288              field.  */
4289           sum = (a + b) & addrmask;
4290           if ((a | b | sum) & signmask)
4291             flag = bfd_reloc_overflow;
4292           break;
4293
4294         default:
4295           abort ();
4296         }
4297     }
4298
4299   /* Put RELOCATION in the right bits.  */
4300   relocation >>= (bfd_vma) rightshift;
4301   relocation <<= (bfd_vma) bitpos;
4302
4303   /* Add RELOCATION to the right bits of X.  */
4304   /* FIXME : 090616
4305      Because the relaxation may generate duplicate relocation at one address,
4306      an addition to immediate in the instruction may cause the relocation added
4307      several times.
4308      This bug should be fixed in assembler, but a check is also needed here.  */
4309   if (howto->partial_inplace)
4310     x = ((x & ~howto->dst_mask)
4311          | (((x & howto->src_mask) + relocation) & howto->dst_mask));
4312   else
4313     x = ((x & ~howto->dst_mask) | ((relocation) & howto->dst_mask));
4314
4315
4316   /* Put the relocated value back in the object file.  */
4317   switch (size)
4318     {
4319     default:
4320     case 0:
4321     case 1:
4322     case 8:
4323       abort ();
4324       break;
4325     case 2:
4326       bfd_putb16 (x, location);
4327       break;
4328     case 4:
4329       bfd_putb32 (x, location);
4330       break;
4331     }
4332
4333   return flag;
4334 }
4335
4336 static bfd_reloc_status_type
4337 nds32_elf_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
4338                                asection *input_section, bfd_byte *contents,
4339                                bfd_vma address, bfd_vma value, bfd_vma addend)
4340 {
4341   bfd_vma relocation;
4342
4343   /* Sanity check the address.  */
4344   if (address > bfd_get_section_limit (input_bfd, input_section))
4345     return bfd_reloc_outofrange;
4346
4347   /* This function assumes that we are dealing with a basic relocation
4348      against a symbol.  We want to compute the value of the symbol to
4349      relocate to.  This is just VALUE, the value of the symbol, plus
4350      ADDEND, any addend associated with the reloc.  */
4351   relocation = value + addend;
4352
4353   /* If the relocation is PC relative, we want to set RELOCATION to
4354      the distance between the symbol (currently in RELOCATION) and the
4355      location we are relocating.  Some targets (e.g., i386-aout)
4356      arrange for the contents of the section to be the negative of the
4357      offset of the location within the section; for such targets
4358      pcrel_offset is FALSE.  Other targets (e.g., m88kbcs or ELF)
4359      simply leave the contents of the section as zero; for such
4360      targets pcrel_offset is TRUE.  If pcrel_offset is FALSE we do not
4361      need to subtract out the offset of the location within the
4362      section (which is just ADDRESS).  */
4363   if (howto->pc_relative)
4364     {
4365       relocation -= (input_section->output_section->vma
4366                      + input_section->output_offset);
4367       if (howto->pcrel_offset)
4368         relocation -= address;
4369     }
4370
4371   return nds32_relocate_contents (howto, input_bfd, relocation,
4372                                   contents + address);
4373 }
4374
4375 static bfd_boolean
4376 nds32_elf_output_symbol_hook (struct bfd_link_info *info,
4377                               const char *name,
4378                               Elf_Internal_Sym *elfsym ATTRIBUTE_UNUSED,
4379                               asection *input_sec,
4380                               struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
4381 {
4382   const char *source;
4383   FILE *sym_ld_script = NULL;
4384   struct elf_nds32_link_hash_table *table;
4385
4386   table = nds32_elf_hash_table (info);
4387   sym_ld_script = table->sym_ld_script;
4388   if (!sym_ld_script)
4389     return TRUE;
4390
4391   if (!h || !name || *name == '\0')
4392     return TRUE;
4393
4394   if (input_sec->flags & SEC_EXCLUDE)
4395     return TRUE;
4396
4397   if (!check_start_export_sym)
4398     {
4399       fprintf (sym_ld_script, "SECTIONS\n{\n");
4400       check_start_export_sym = 1;
4401     }
4402
4403   if (h->root.type == bfd_link_hash_defined
4404       || h->root.type == bfd_link_hash_defweak)
4405     {
4406       if (!h->root.u.def.section->output_section)
4407         return TRUE;
4408
4409       if (bfd_is_const_section (input_sec))
4410         source = input_sec->name;
4411       else
4412         source = input_sec->owner->filename;
4413
4414       fprintf (sym_ld_script, "\t%s = 0x%08lx;\t /* %s */\n",
4415                h->root.root.string,
4416                (long) (h->root.u.def.value
4417                 + h->root.u.def.section->output_section->vma
4418                 + h->root.u.def.section->output_offset), source);
4419     }
4420
4421   return TRUE;
4422 }
4423
4424 /* Relocate an NDS32/D ELF section.
4425    There is some attempt to make this function usable for many architectures,
4426    both for RELA and REL type relocs, if only to serve as a learning tool.
4427
4428    The RELOCATE_SECTION function is called by the new ELF backend linker
4429    to handle the relocations for a section.
4430
4431    The relocs are always passed as Rela structures; if the section
4432    actually uses Rel structures, the r_addend field will always be
4433    zero.
4434
4435    This function is responsible for adjust the section contents as
4436    necessary, and (if using Rela relocs and generating a
4437    relocatable output file) adjusting the reloc addend as
4438    necessary.
4439
4440    This function does not have to worry about setting the reloc
4441    address or the reloc symbol index.
4442
4443    LOCAL_SYMS is a pointer to the swapped in local symbols.
4444
4445    LOCAL_SECTIONS is an array giving the section in the input file
4446    corresponding to the st_shndx field of each local symbol.
4447
4448    The global hash table entry for the global symbols can be found
4449    via elf_sym_hashes (input_bfd).
4450
4451    When generating relocatable output, this function must handle
4452    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
4453    going to be the section symbol corresponding to the output
4454    section, which means that the addend must be adjusted
4455    accordingly.  */
4456
4457 static bfd_vma
4458 dtpoff_base (struct bfd_link_info *info)
4459 {
4460   /* If tls_sec is NULL, we should have signalled an error already.  */
4461   if (elf_hash_table (info)->tls_sec == NULL)
4462     return 0;
4463   return elf_hash_table (info)->tls_sec->vma;
4464 }
4465
4466 static bfd_boolean
4467 nds32_elf_relocate_section (bfd *                  output_bfd ATTRIBUTE_UNUSED,
4468                             struct bfd_link_info * info,
4469                             bfd *                  input_bfd,
4470                             asection *             input_section,
4471                             bfd_byte *             contents,
4472                             Elf_Internal_Rela *    relocs,
4473                             Elf_Internal_Sym *     local_syms,
4474                             asection **            local_sections)
4475 {
4476   Elf_Internal_Shdr *symtab_hdr;
4477   struct elf_link_hash_entry **sym_hashes;
4478   Elf_Internal_Rela *rel, *relend;
4479   bfd_boolean ret = TRUE;               /* Assume success.  */
4480   int align = 0;
4481   bfd_reloc_status_type r;
4482   const char *errmsg = NULL;
4483   bfd_vma gp;
4484   struct elf_nds32_link_hash_table *htab;
4485   bfd *dynobj;
4486   bfd_vma *local_got_offsets;
4487   asection *sgot, *splt, *sreloc;
4488   bfd_vma high_address;
4489   struct elf_nds32_link_hash_table *table;
4490   int eliminate_gc_relocs;
4491   bfd_vma fpbase_addr;
4492
4493   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4494   sym_hashes = elf_sym_hashes (input_bfd);
4495   htab = nds32_elf_hash_table (info);
4496   high_address = bfd_get_section_limit (input_bfd, input_section);
4497
4498   dynobj = htab->root.dynobj;
4499   local_got_offsets = elf_local_got_offsets (input_bfd);
4500
4501   sgot = htab->sgot;
4502   splt = htab->splt;
4503   sreloc = NULL;
4504
4505   rel = relocs;
4506   relend = relocs + input_section->reloc_count;
4507
4508   table = nds32_elf_hash_table (info);
4509   eliminate_gc_relocs = table->eliminate_gc_relocs;
4510   /* By this time, we can adjust the value of _SDA_BASE_.  */
4511   if ((!bfd_link_relocatable (info)))
4512     {
4513       is_SDA_BASE_set = 1;
4514       r = nds32_elf_final_sda_base (output_bfd, info, &gp, TRUE);
4515       if (r != bfd_reloc_ok)
4516         return FALSE;
4517     }
4518
4519   if (is_ITB_BASE_set == 0)
4520     {
4521       /* Set the _ITB_BASE_.  */
4522       if (!nds32_elf_ex9_itb_base (info))
4523         {
4524           _bfd_error_handler (_("%B: error: Cannot set _ITB_BASE_"),
4525                               output_bfd);
4526           bfd_set_error (bfd_error_bad_value);
4527         }
4528     }
4529
4530   if (table->target_optimize & NDS32_RELAX_JUMP_IFC_ON)
4531     if (!nds32_elf_ifc_reloc ())
4532       _bfd_error_handler (_("error: IFC relocation error."));
4533
4534  /* Relocation for .ex9.itable.  */
4535   if (table->target_optimize & NDS32_RELAX_EX9_ON
4536       || (table->ex9_import_file && table->update_ex9_table))
4537     nds32_elf_ex9_reloc_jmp (info);
4538
4539   /* Use gp as fp to prevent truncated fit.  Because in relaxation time
4540      the fp value is set as gp, and it has be reverted for instruction
4541      setting fp.  */
4542   fpbase_addr = elf_gp (output_bfd);
4543
4544   for (rel = relocs; rel < relend; rel++)
4545     {
4546       enum elf_nds32_reloc_type r_type;
4547       reloc_howto_type *howto = NULL;
4548       unsigned long r_symndx;
4549       struct elf_link_hash_entry *h = NULL;
4550       Elf_Internal_Sym *sym = NULL;
4551       asection *sec;
4552       bfd_vma relocation;
4553
4554       /* We can't modify r_addend here as elf_link_input_bfd has an assert to
4555          ensure it's zero (we use REL relocs, not RELA).  Therefore this
4556          should be assigning zero to `addend', but for clarity we use
4557          `r_addend'.  */
4558
4559       bfd_vma addend = rel->r_addend;
4560       bfd_vma offset = rel->r_offset;
4561
4562       r_type = ELF32_R_TYPE (rel->r_info);
4563       if (r_type >= R_NDS32_max)
4564         {
4565           _bfd_error_handler (_("%B: error: unknown relocation type %d."),
4566                               input_bfd, r_type);
4567           bfd_set_error (bfd_error_bad_value);
4568           ret = FALSE;
4569           continue;
4570         }
4571
4572       if (r_type == R_NDS32_GNU_VTENTRY
4573           || r_type == R_NDS32_GNU_VTINHERIT
4574           || r_type == R_NDS32_NONE
4575           || r_type == R_NDS32_RELA_GNU_VTENTRY
4576           || r_type == R_NDS32_RELA_GNU_VTINHERIT
4577           || (r_type >= R_NDS32_INSN16 && r_type <= R_NDS32_25_FIXED_RELA)
4578           || r_type == R_NDS32_DATA
4579           || r_type == R_NDS32_TRAN
4580           || (r_type >= R_NDS32_LONGCALL4 && r_type <= R_NDS32_LONGJUMP7))
4581         continue;
4582
4583       /* If we enter the fp-as-gp region.  Resolve the address
4584          of best fp-base.  */
4585       if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_BEGIN
4586           && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
4587         {
4588           int dist;
4589
4590           /* Distance to relocation of best fp-base is encoded in R_SYM.  */
4591           dist =  rel->r_addend >> 16;
4592           fpbase_addr = calculate_memory_address (input_bfd, rel + dist,
4593                                                   local_syms, symtab_hdr);
4594         }
4595       else if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_END
4596                && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
4597         {
4598           fpbase_addr = elf_gp (output_bfd);
4599         }
4600
4601       if (((r_type >= R_NDS32_DWARF2_OP1_RELA
4602             && r_type <= R_NDS32_DWARF2_LEB_RELA)
4603            || r_type >= R_NDS32_RELAX_ENTRY) && !bfd_link_relocatable (info))
4604         continue;
4605
4606       howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
4607       r_symndx = ELF32_R_SYM (rel->r_info);
4608
4609       /* This is a final link.  */
4610       sym = NULL;
4611       sec = NULL;
4612       h = NULL;
4613
4614       if (r_symndx < symtab_hdr->sh_info)
4615         {
4616           /* Local symbol.  */
4617           sym = local_syms + r_symndx;
4618           sec = local_sections[r_symndx];
4619
4620           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4621           addend = rel->r_addend;
4622         }
4623       else
4624         {
4625           /* External symbol.  */
4626           bfd_boolean warned, ignored, unresolved_reloc;
4627           int symndx = r_symndx - symtab_hdr->sh_info;
4628
4629           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4630                                    r_symndx, symtab_hdr, sym_hashes, h, sec,
4631                                    relocation, unresolved_reloc, warned,
4632                                    ignored);
4633
4634           /* la $fp, _FP_BASE_ is per-function (region).
4635              Handle it specially.  */
4636           switch ((int) r_type)
4637             {
4638             case R_NDS32_SDA19S0_RELA:
4639             case R_NDS32_SDA15S0_RELA:
4640             case R_NDS32_20_RELA:
4641               if (strcmp (elf_sym_hashes (input_bfd)[symndx]->root.root.string,
4642                           FP_BASE_NAME) == 0)
4643                 {
4644                   relocation = fpbase_addr;
4645                   break;
4646                 }
4647             }
4648
4649         }
4650
4651       if (bfd_link_relocatable (info))
4652         {
4653           /* This is a relocatable link.  We don't have to change
4654              anything, unless the reloc is against a section symbol,
4655              in which case we have to adjust according to where the
4656              section symbol winds up in the output section.  */
4657           if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4658             rel->r_addend += sec->output_offset + sym->st_value;
4659
4660           continue;
4661         }
4662
4663       /* Sanity check the address.  */
4664       if (offset > high_address)
4665         {
4666           r = bfd_reloc_outofrange;
4667           goto check_reloc;
4668         }
4669
4670       if ((r_type >= R_NDS32_DWARF2_OP1_RELA
4671            && r_type <= R_NDS32_DWARF2_LEB_RELA)
4672           || r_type >= R_NDS32_RELAX_ENTRY)
4673         continue;
4674
4675       switch ((int) r_type)
4676         {
4677         case R_NDS32_GOTOFF:
4678           /* Relocation is relative to the start of the global offset
4679              table (for ld24 rx, #uimm24), e.g. access at label+addend
4680
4681              ld24 rx. #label@GOTOFF + addend
4682              sub  rx, r12.  */
4683         case R_NDS32_GOTOFF_HI20:
4684         case R_NDS32_GOTOFF_LO12:
4685         case R_NDS32_GOTOFF_LO15:
4686         case R_NDS32_GOTOFF_LO19:
4687           BFD_ASSERT (sgot != NULL);
4688
4689           relocation -= elf_gp (output_bfd);
4690           break;
4691
4692         case R_NDS32_9_PLTREL:
4693         case R_NDS32_25_PLTREL:
4694           /* Relocation is to the entry for this symbol in the
4695              procedure linkage table.  */
4696
4697           /* The native assembler will generate a 25_PLTREL reloc
4698              for a local symbol if you assemble a call from one
4699              section to another when using -K pic.  */
4700           if (h == NULL)
4701             break;
4702
4703           if (h->forced_local)
4704             break;
4705
4706           /* We didn't make a PLT entry for this symbol.  This
4707              happens when statically linking PIC code, or when
4708              using -Bsymbolic.  */
4709           if (h->plt.offset == (bfd_vma) - 1)
4710             break;
4711
4712           relocation = (splt->output_section->vma
4713                         + splt->output_offset + h->plt.offset);
4714           break;
4715
4716         case R_NDS32_PLT_GOTREL_HI20:
4717         case R_NDS32_PLT_GOTREL_LO12:
4718         case R_NDS32_PLT_GOTREL_LO15:
4719         case R_NDS32_PLT_GOTREL_LO19:
4720         case R_NDS32_PLT_GOTREL_LO20:
4721           if (h == NULL || h->forced_local || h->plt.offset == (bfd_vma) - 1)
4722             {
4723               /* We didn't make a PLT entry for this symbol.  This
4724                  happens when statically linking PIC code, or when
4725                  using -Bsymbolic.  */
4726               relocation -= elf_gp (output_bfd);
4727               break;
4728             }
4729
4730           relocation = (splt->output_section->vma
4731                         + splt->output_offset + h->plt.offset);
4732
4733           relocation -= elf_gp (output_bfd);
4734           break;
4735
4736         case R_NDS32_PLTREL_HI20:
4737         case R_NDS32_PLTREL_LO12:
4738
4739           /* Relocation is to the entry for this symbol in the
4740              procedure linkage table.  */
4741
4742           /* The native assembler will generate a 25_PLTREL reloc
4743              for a local symbol if you assemble a call from one
4744              section to another when using -K pic.  */
4745           if (h == NULL)
4746             break;
4747
4748           if (h->forced_local)
4749             break;
4750
4751           if (h->plt.offset == (bfd_vma) - 1)
4752             /* We didn't make a PLT entry for this symbol.  This
4753                happens when statically linking PIC code, or when
4754                using -Bsymbolic.  */
4755             break;
4756
4757           if (splt == NULL)
4758             break;
4759
4760           relocation = (splt->output_section->vma
4761                         + splt->output_offset
4762                         + h->plt.offset + 4)
4763                        - (input_section->output_section->vma
4764                           + input_section->output_offset
4765                           + rel->r_offset);
4766
4767           break;
4768
4769         case R_NDS32_GOTPC20:
4770           /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
4771              ld24 rx,#_GLOBAL_OFFSET_TABLE_  */
4772           relocation = elf_gp (output_bfd);
4773           break;
4774
4775         case R_NDS32_GOTPC_HI20:
4776         case R_NDS32_GOTPC_LO12:
4777             {
4778               /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
4779                  bl .+4
4780                  seth rx,#high(_GLOBAL_OFFSET_TABLE_)
4781                  or3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
4782                  or
4783                  bl .+4
4784                  seth rx,#shigh(_GLOBAL_OFFSET_TABLE_)
4785                  add3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
4786                */
4787               relocation = elf_gp (output_bfd);
4788               relocation -= (input_section->output_section->vma
4789                              + input_section->output_offset + rel->r_offset);
4790               break;
4791             }
4792
4793         case R_NDS32_GOT20:
4794           /* Fall through.  */
4795         case R_NDS32_GOT_HI20:
4796         case R_NDS32_GOT_LO12:
4797         case R_NDS32_GOT_LO15:
4798         case R_NDS32_GOT_LO19:
4799           /* Relocation is to the entry for this symbol in the global
4800              offset table.  */
4801           BFD_ASSERT (sgot != NULL);
4802
4803           if (h != NULL)
4804             {
4805               bfd_boolean dyn;
4806               bfd_vma off;
4807
4808               off = h->got.offset;
4809               BFD_ASSERT (off != (bfd_vma) - 1);
4810               dyn = htab->root.dynamic_sections_created;
4811               if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4812                                                     bfd_link_pic (info),
4813                                                     h)
4814                   || (bfd_link_pic (info)
4815                       && (info->symbolic
4816                           || h->dynindx == -1
4817                           || h->forced_local) && h->def_regular))
4818                 {
4819                   /* This is actually a static link, or it is a
4820                      -Bsymbolic link and the symbol is defined
4821                      locally, or the symbol was forced to be local
4822                      because of a version file.  We must initialize
4823                      this entry in the global offset table.  Since the
4824                      offset must always be a multiple of 4, we use the
4825                      least significant bit to record whether we have
4826                      initialized it already.
4827
4828                      When doing a dynamic link, we create a .rela.got
4829                      relocation entry to initialize the value.  This
4830                      is done in the finish_dynamic_symbol routine.  */
4831                   if ((off & 1) != 0)
4832                     off &= ~1;
4833                   else
4834                     {
4835                       bfd_put_32 (output_bfd, relocation, sgot->contents + off);
4836                       h->got.offset |= 1;
4837                     }
4838                 }
4839               relocation = sgot->output_section->vma + sgot->output_offset + off
4840                            - elf_gp (output_bfd);
4841             }
4842           else
4843             {
4844               bfd_vma off;
4845               bfd_byte *loc;
4846
4847               BFD_ASSERT (local_got_offsets != NULL
4848                           && local_got_offsets[r_symndx] != (bfd_vma) - 1);
4849
4850               off = local_got_offsets[r_symndx];
4851
4852               /* The offset must always be a multiple of 4.  We use
4853                  the least significant bit to record whether we have
4854                  already processed this entry.  */
4855               if ((off & 1) != 0)
4856                 off &= ~1;
4857               else
4858                 {
4859                   bfd_put_32 (output_bfd, relocation, sgot->contents + off);
4860
4861                   if (bfd_link_pic (info))
4862                     {
4863                       asection *srelgot;
4864                       Elf_Internal_Rela outrel;
4865
4866                       /* We need to generate a R_NDS32_RELATIVE reloc
4867                          for the dynamic linker.  */
4868                       srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
4869                       BFD_ASSERT (srelgot != NULL);
4870
4871                       outrel.r_offset = (elf_gp (output_bfd)
4872                                          + sgot->output_offset + off);
4873                       outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
4874                       outrel.r_addend = relocation;
4875                       loc = srelgot->contents;
4876                       loc +=
4877                         srelgot->reloc_count * sizeof (Elf32_External_Rela);
4878                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4879                       ++srelgot->reloc_count;
4880                     }
4881                   local_got_offsets[r_symndx] |= 1;
4882                 }
4883               relocation = sgot->output_section->vma + sgot->output_offset + off
4884                            - elf_gp (output_bfd);
4885             }
4886
4887           break;
4888
4889         case R_NDS32_16_RELA:
4890         case R_NDS32_20_RELA:
4891         case R_NDS32_5_RELA:
4892         case R_NDS32_32_RELA:
4893         case R_NDS32_9_PCREL_RELA:
4894         case R_NDS32_WORD_9_PCREL_RELA:
4895         case R_NDS32_10_UPCREL_RELA:
4896         case R_NDS32_15_PCREL_RELA:
4897         case R_NDS32_17_PCREL_RELA:
4898         case R_NDS32_25_PCREL_RELA:
4899         case R_NDS32_HI20_RELA:
4900         case R_NDS32_LO12S3_RELA:
4901         case R_NDS32_LO12S2_RELA:
4902         case R_NDS32_LO12S2_DP_RELA:
4903         case R_NDS32_LO12S2_SP_RELA:
4904         case R_NDS32_LO12S1_RELA:
4905         case R_NDS32_LO12S0_RELA:
4906         case R_NDS32_LO12S0_ORI_RELA:
4907           if (bfd_link_pic (info) && r_symndx != 0
4908               && (input_section->flags & SEC_ALLOC) != 0
4909               && (eliminate_gc_relocs == 0
4910                   || (sec && (sec->flags & SEC_EXCLUDE) == 0))
4911               && ((r_type != R_NDS32_9_PCREL_RELA
4912                    && r_type != R_NDS32_WORD_9_PCREL_RELA
4913                    && r_type != R_NDS32_10_UPCREL_RELA
4914                    && r_type != R_NDS32_15_PCREL_RELA
4915                    && r_type != R_NDS32_17_PCREL_RELA
4916                    && r_type != R_NDS32_25_PCREL_RELA
4917                    && !(r_type == R_NDS32_32_RELA
4918                         && strcmp (input_section->name, ".eh_frame") == 0))
4919                   || (h != NULL && h->dynindx != -1
4920                       && (!info->symbolic || !h->def_regular))))
4921             {
4922               Elf_Internal_Rela outrel;
4923               bfd_boolean skip, relocate;
4924               bfd_byte *loc;
4925
4926               /* When generating a shared object, these relocations
4927                  are copied into the output file to be resolved at run
4928                  time.  */
4929
4930               if (sreloc == NULL)
4931                 {
4932                   const char *name;
4933
4934                   name = bfd_elf_string_from_elf_section
4935                     (input_bfd, elf_elfheader (input_bfd)->e_shstrndx,
4936                      elf_section_data (input_section)->rela.hdr->sh_name);
4937                   if (name == NULL)
4938                     return FALSE;
4939
4940                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
4941                               && strcmp (bfd_get_section_name (input_bfd,
4942                                                                input_section),
4943                                          name + 5) == 0);
4944
4945                   sreloc = bfd_get_section_by_name (dynobj, name);
4946                   BFD_ASSERT (sreloc != NULL);
4947                 }
4948
4949               skip = FALSE;
4950               relocate = FALSE;
4951
4952               outrel.r_offset = _bfd_elf_section_offset (output_bfd,
4953                                                          info,
4954                                                          input_section,
4955                                                          rel->r_offset);
4956               if (outrel.r_offset == (bfd_vma) - 1)
4957                 skip = TRUE;
4958               else if (outrel.r_offset == (bfd_vma) - 2)
4959                 skip = TRUE, relocate = TRUE;
4960               outrel.r_offset += (input_section->output_section->vma
4961                                   + input_section->output_offset);
4962
4963               if (skip)
4964                 memset (&outrel, 0, sizeof outrel);
4965               else if (r_type == R_NDS32_17_PCREL_RELA
4966                        || r_type == R_NDS32_15_PCREL_RELA
4967                        || r_type == R_NDS32_25_PCREL_RELA)
4968                 {
4969                   BFD_ASSERT (h != NULL && h->dynindx != -1);
4970                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4971                   outrel.r_addend = rel->r_addend;
4972                 }
4973               else
4974                 {
4975                   /* h->dynindx may be -1 if this symbol was marked to
4976                      become local.  */
4977                   if (h == NULL
4978                       || ((info->symbolic || h->dynindx == -1)
4979                           && h->def_regular))
4980                     {
4981                       relocate = TRUE;
4982                       outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
4983                       outrel.r_addend = relocation + rel->r_addend;
4984                     }
4985                   else
4986                     {
4987                       BFD_ASSERT (h->dynindx != -1);
4988                       outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4989                       outrel.r_addend = rel->r_addend;
4990                     }
4991                 }
4992
4993               loc = sreloc->contents;
4994               loc += sreloc->reloc_count * sizeof (Elf32_External_Rela);
4995               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4996               ++sreloc->reloc_count;
4997
4998               /* If this reloc is against an external symbol, we do
4999                  not want to fiddle with the addend.  Otherwise, we
5000                  need to include the symbol value so that it becomes
5001                  an addend for the dynamic reloc.  */
5002               if (!relocate)
5003                 continue;
5004             }
5005           break;
5006
5007         case R_NDS32_25_ABS_RELA:
5008           if (bfd_link_pic (info))
5009             {
5010               _bfd_error_handler
5011                 (_("%s: warning: cannot deal R_NDS32_25_ABS_RELA in shared "
5012                    "mode."), bfd_get_filename (input_bfd));
5013               return FALSE;
5014             }
5015           break;
5016
5017         case R_NDS32_9_PCREL:
5018           r = nds32_elf_do_9_pcrel_reloc (input_bfd, howto, input_section,
5019                                           contents, offset,
5020                                           sec, relocation, addend);
5021           goto check_reloc;
5022
5023         case R_NDS32_HI20:
5024             {
5025               Elf_Internal_Rela *lorel;
5026
5027               /* We allow an arbitrary number of HI20 relocs before the
5028                  LO12 reloc.  This permits gcc to emit the HI and LO relocs
5029                  itself.  */
5030               for (lorel = rel + 1;
5031                    (lorel < relend
5032                     && ELF32_R_TYPE (lorel->r_info) == R_NDS32_HI20); lorel++)
5033                 continue;
5034               if (lorel < relend
5035                   && (ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S3
5036                       || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S2
5037                       || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S1
5038                       || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S0))
5039                 {
5040                   nds32_elf_relocate_hi20 (input_bfd, r_type, rel, lorel,
5041                                            contents, relocation + addend);
5042                   r = bfd_reloc_ok;
5043                 }
5044               else
5045                 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5046                                               contents, offset, relocation,
5047                                               addend);
5048             }
5049
5050           goto check_reloc;
5051
5052         case R_NDS32_GOT17S2_RELA:
5053         case R_NDS32_GOT15S2_RELA:
5054             {
5055               bfd_vma off;
5056
5057               BFD_ASSERT (sgot != NULL);
5058
5059               if (h != NULL)
5060                 {
5061                   bfd_boolean dyn;
5062
5063                   off = h->got.offset;
5064                   BFD_ASSERT (off != (bfd_vma) - 1);
5065
5066                   dyn = htab->root.dynamic_sections_created;
5067                   if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL
5068                       (dyn, bfd_link_pic (info), h)
5069                       || (bfd_link_pic (info)
5070                           && (info->symbolic
5071                               || h->dynindx == -1
5072                               || h->forced_local)
5073                           && h->def_regular))
5074                     {
5075                       /* This is actually a static link, or it is a
5076                          -Bsymbolic link and the symbol is defined
5077                          locally, or the symbol was forced to be local
5078                          because of a version file.  We must initialize
5079                          this entry in the global offset table.  Since the
5080                          offset must always be a multiple of 4, we use the
5081                          least significant bit to record whether we have
5082                          initialized it already.
5083
5084                          When doing a dynamic link, we create a .rela.got
5085                          relocation entry to initialize the value.  This
5086                          is done in the finish_dynamic_symbol routine.  */
5087                       if ((off & 1) != 0)
5088                         off &= ~1;
5089                       else
5090                         {
5091                           bfd_put_32 (output_bfd, relocation,
5092                                       sgot->contents + off);
5093                           h->got.offset |= 1;
5094                         }
5095                     }
5096                 }
5097               else
5098                 {
5099                   bfd_byte *loc;
5100
5101                   BFD_ASSERT (local_got_offsets != NULL
5102                               && local_got_offsets[r_symndx] != (bfd_vma) - 1);
5103
5104                   off = local_got_offsets[r_symndx];
5105
5106                   /* The offset must always be a multiple of 4.  We use
5107                      the least significant bit to record whether we have
5108                      already processed this entry.  */
5109                   if ((off & 1) != 0)
5110                     off &= ~1;
5111                   else
5112                     {
5113                       bfd_put_32 (output_bfd, relocation, sgot->contents + off);
5114
5115                       if (bfd_link_pic (info))
5116                         {
5117                           asection *srelgot;
5118                           Elf_Internal_Rela outrel;
5119
5120                           /* We need to generate a R_NDS32_RELATIVE reloc
5121                              for the dynamic linker.  */
5122                           srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
5123                           BFD_ASSERT (srelgot != NULL);
5124
5125                           outrel.r_offset = (elf_gp (output_bfd)
5126                                              + sgot->output_offset + off);
5127                           outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
5128                           outrel.r_addend = relocation;
5129                           loc = srelgot->contents;
5130                           loc +=
5131                             srelgot->reloc_count * sizeof (Elf32_External_Rela);
5132                           bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5133                           ++srelgot->reloc_count;
5134                         }
5135                       local_got_offsets[r_symndx] |= 1;
5136                     }
5137                 }
5138               relocation = sgot->output_section->vma + sgot->output_offset + off
5139                            - elf_gp (output_bfd);
5140             }
5141           if (relocation & align)
5142             {
5143               /* Incorrect alignment.  */
5144               _bfd_error_handler
5145                 (_("%B: warning: unaligned access to GOT entry."), input_bfd);
5146               ret = FALSE;
5147               r = bfd_reloc_dangerous;
5148               goto check_reloc;
5149             }
5150           break;
5151
5152         case R_NDS32_SDA16S3_RELA:
5153         case R_NDS32_SDA15S3_RELA:
5154         case R_NDS32_SDA15S3:
5155           align = 0x7;
5156           goto handle_sda;
5157
5158         case R_NDS32_SDA17S2_RELA:
5159         case R_NDS32_SDA15S2_RELA:
5160         case R_NDS32_SDA12S2_SP_RELA:
5161         case R_NDS32_SDA12S2_DP_RELA:
5162         case R_NDS32_SDA15S2:
5163         case R_NDS32_SDA_FP7U2_RELA:
5164           align = 0x3;
5165           goto handle_sda;
5166
5167         case R_NDS32_SDA18S1_RELA:
5168         case R_NDS32_SDA15S1_RELA:
5169         case R_NDS32_SDA15S1:
5170           align = 0x1;
5171           goto handle_sda;
5172
5173         case R_NDS32_SDA19S0_RELA:
5174         case R_NDS32_SDA15S0_RELA:
5175         case R_NDS32_SDA15S0:
5176             {
5177               align = 0x0;
5178 handle_sda:
5179               BFD_ASSERT (sec != NULL);
5180
5181               /* If the symbol is in the abs section, the out_bfd will be null.
5182                  This happens when the relocation has a symbol@GOTOFF.  */
5183               r = nds32_elf_final_sda_base (output_bfd, info, &gp, FALSE);
5184               if (r != bfd_reloc_ok)
5185                 {
5186                   _bfd_error_handler
5187                     (_("%B: warning: relocate SDA_BASE failed."), input_bfd);
5188                   ret = FALSE;
5189                   goto check_reloc;
5190                 }
5191
5192               /* At this point `relocation' contains the object's
5193                  address.  */
5194               if (r_type == R_NDS32_SDA_FP7U2_RELA)
5195                 {
5196                   relocation -= fpbase_addr;
5197                 }
5198               else
5199                 relocation -= gp;
5200               /* Now it contains the offset from _SDA_BASE_.  */
5201
5202               /* Make sure alignment is correct.  */
5203
5204               if (relocation & align)
5205                 {
5206                   /* Incorrect alignment.  */
5207                   _bfd_error_handler
5208                     (_("%B(%A): warning: unaligned small data access of type %d."),
5209                      input_bfd, input_section, r_type);
5210                   ret = FALSE;
5211                   goto check_reloc;
5212                 }
5213             }
5214
5215           break;
5216         case R_NDS32_17IFC_PCREL_RELA:
5217         case R_NDS32_10IFCU_PCREL_RELA:
5218           /* do nothing */
5219           break;
5220
5221         case R_NDS32_TLS_LE_HI20:
5222         case R_NDS32_TLS_LE_LO12:
5223         case R_NDS32_TLS_LE_20:
5224         case R_NDS32_TLS_LE_15S0:
5225         case R_NDS32_TLS_LE_15S1:
5226         case R_NDS32_TLS_LE_15S2:
5227           if (elf_hash_table (info)->tls_sec != NULL)
5228             relocation -= (elf_hash_table (info)->tls_sec->vma + TP_OFFSET);
5229           break;
5230         case R_NDS32_TLS_IE_HI20:
5231         case R_NDS32_TLS_IE_LO12S2:
5232           {
5233             /* Relocation is to the entry for this symbol in the global
5234                offset table.  */
5235             unsigned int tls_type;
5236             asection *srelgot;
5237             Elf_Internal_Rela outrel;
5238             bfd_vma off;
5239             bfd_byte *loc;
5240             int indx = 0;
5241
5242             BFD_ASSERT (sgot != NULL);
5243             if (h != NULL)
5244               {
5245                 bfd_boolean dyn;
5246
5247                 off = h->got.offset;
5248                 BFD_ASSERT (off != (bfd_vma) - 1);
5249                 dyn = htab->root.dynamic_sections_created;
5250                 tls_type = ((struct elf_nds32_link_hash_entry *) h)->tls_type;
5251                 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
5252                     && (!bfd_link_pic (info)
5253                         || !SYMBOL_REFERENCES_LOCAL (info, h)))
5254                   indx = h->dynindx;
5255               }
5256             else
5257               {
5258                 /* Never happen currently.  */
5259                 BFD_ASSERT (local_got_offsets != NULL
5260                             && local_got_offsets[r_symndx] != (bfd_vma) - 1);
5261
5262                 off = local_got_offsets[r_symndx];
5263
5264                 tls_type = elf32_nds32_local_got_tls_type (input_bfd)[r_symndx];
5265               }
5266             relocation = sgot->output_section->vma + sgot->output_offset + off;
5267
5268             if (r_type == R_NDS32_TLS_IE_LO12S2)
5269               break;
5270
5271             /* The offset must always be a multiple of 4.  We use
5272                the least significant bit to record whether we have
5273                already processed this entry.  */
5274             if ((off & 1) != 0)
5275               off &= ~1;
5276             else
5277               {
5278                 bfd_boolean need_relocs = FALSE;
5279                 srelgot = htab->srelgot;
5280                 if ((bfd_link_pic (info) || indx != 0)
5281                     && (h == NULL
5282                         || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5283                         || h->root.type != bfd_link_hash_undefweak))
5284                   {
5285                     need_relocs = TRUE;
5286                     BFD_ASSERT (srelgot != NULL);
5287                   }
5288                 if (tls_type & GOT_TLS_IE)
5289                   {
5290                     if (need_relocs)
5291                       {
5292                         if (h->dynindx == 0)
5293                           outrel.r_addend = relocation - dtpoff_base (info);
5294                         else
5295                           outrel.r_addend = 0;
5296                         outrel.r_offset = (sgot->output_section->vma
5297                                            + sgot->output_offset
5298                                            + off);
5299                         outrel.r_info =
5300                           ELF32_R_INFO (h->dynindx, R_NDS32_TLS_TPOFF);
5301
5302                         loc = srelgot->contents;
5303                         loc +=
5304                           srelgot->reloc_count * sizeof (Elf32_External_Rela);
5305                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5306                         ++srelgot->reloc_count;
5307                       }
5308                     else
5309                       bfd_put_32 (output_bfd, h->root.u.def.value - TP_OFFSET,
5310                                   sgot->contents + off);
5311                   }
5312               }
5313           }
5314         break;
5315
5316           /* DON'T   fall through.  */
5317
5318         default:
5319           /* OLD_NDS32_RELOC.  */
5320
5321           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5322                                         contents, offset, relocation, addend);
5323           goto check_reloc;
5324         }
5325
5326       switch ((int) r_type)
5327         {
5328         case R_NDS32_20_RELA:
5329         case R_NDS32_5_RELA:
5330         case R_NDS32_9_PCREL_RELA:
5331         case R_NDS32_WORD_9_PCREL_RELA:
5332         case R_NDS32_10_UPCREL_RELA:
5333         case R_NDS32_15_PCREL_RELA:
5334         case R_NDS32_17_PCREL_RELA:
5335         case R_NDS32_25_PCREL_RELA:
5336         case R_NDS32_25_ABS_RELA:
5337         case R_NDS32_HI20_RELA:
5338         case R_NDS32_LO12S3_RELA:
5339         case R_NDS32_LO12S2_RELA:
5340         case R_NDS32_LO12S2_DP_RELA:
5341         case R_NDS32_LO12S2_SP_RELA:
5342         case R_NDS32_LO12S1_RELA:
5343         case R_NDS32_LO12S0_RELA:
5344         case R_NDS32_LO12S0_ORI_RELA:
5345         case R_NDS32_SDA16S3_RELA:
5346         case R_NDS32_SDA17S2_RELA:
5347         case R_NDS32_SDA18S1_RELA:
5348         case R_NDS32_SDA19S0_RELA:
5349         case R_NDS32_SDA15S3_RELA:
5350         case R_NDS32_SDA15S2_RELA:
5351         case R_NDS32_SDA12S2_DP_RELA:
5352         case R_NDS32_SDA12S2_SP_RELA:
5353         case R_NDS32_SDA15S1_RELA:
5354         case R_NDS32_SDA15S0_RELA:
5355         case R_NDS32_SDA_FP7U2_RELA:
5356         case R_NDS32_9_PLTREL:
5357         case R_NDS32_25_PLTREL:
5358         case R_NDS32_GOT20:
5359         case R_NDS32_GOT_HI20:
5360         case R_NDS32_GOT_LO12:
5361         case R_NDS32_GOT_LO15:
5362         case R_NDS32_GOT_LO19:
5363         case R_NDS32_GOT15S2_RELA:
5364         case R_NDS32_GOT17S2_RELA:
5365         case R_NDS32_GOTPC20:
5366         case R_NDS32_GOTPC_HI20:
5367         case R_NDS32_GOTPC_LO12:
5368         case R_NDS32_GOTOFF:
5369         case R_NDS32_GOTOFF_HI20:
5370         case R_NDS32_GOTOFF_LO12:
5371         case R_NDS32_GOTOFF_LO15:
5372         case R_NDS32_GOTOFF_LO19:
5373         case R_NDS32_PLTREL_HI20:
5374         case R_NDS32_PLTREL_LO12:
5375         case R_NDS32_PLT_GOTREL_HI20:
5376         case R_NDS32_PLT_GOTREL_LO12:
5377         case R_NDS32_PLT_GOTREL_LO15:
5378         case R_NDS32_PLT_GOTREL_LO19:
5379         case R_NDS32_PLT_GOTREL_LO20:
5380         case R_NDS32_17IFC_PCREL_RELA:
5381         case R_NDS32_10IFCU_PCREL_RELA:
5382         case R_NDS32_TLS_LE_HI20:
5383         case R_NDS32_TLS_LE_LO12:
5384         case R_NDS32_TLS_IE_HI20:
5385         case R_NDS32_TLS_IE_LO12S2:
5386         case R_NDS32_TLS_LE_20:
5387         case R_NDS32_TLS_LE_15S0:
5388         case R_NDS32_TLS_LE_15S1:
5389         case R_NDS32_TLS_LE_15S2:
5390           /* Instruction related relocs must handle endian properly.  */
5391           /* NOTE: PIC IS NOT HANDLE YET; DO IT LATER.  */
5392           r = nds32_elf_final_link_relocate (howto, input_bfd,
5393                                              input_section, contents,
5394                                              rel->r_offset, relocation,
5395                                              rel->r_addend);
5396           break;
5397
5398         default:
5399           /* All other relocs can use default handler.  */
5400           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5401                                         contents, rel->r_offset,
5402                                         relocation, rel->r_addend);
5403           break;
5404         }
5405
5406 check_reloc:
5407
5408       if (r != bfd_reloc_ok)
5409         {
5410           /* FIXME: This should be generic enough to go in a utility.  */
5411           const char *name;
5412
5413           if (h != NULL)
5414             name = h->root.root.string;
5415           else
5416             {
5417               name = bfd_elf_string_from_elf_section
5418                       (input_bfd, symtab_hdr->sh_link, sym->st_name);
5419               if (name == NULL || *name == '\0')
5420                 name = bfd_section_name (input_bfd, sec);
5421             }
5422
5423           if (errmsg != NULL)
5424             goto common_error;
5425
5426           switch (r)
5427             {
5428             case bfd_reloc_overflow:
5429               (*info->callbacks->reloc_overflow)
5430                 (info, (h ? &h->root : NULL), name, howto->name,
5431                  (bfd_vma) 0, input_bfd, input_section, offset);
5432               break;
5433
5434             case bfd_reloc_undefined:
5435               (*info->callbacks->undefined_symbol)
5436                 (info, name, input_bfd, input_section, offset, TRUE);
5437               break;
5438
5439             case bfd_reloc_outofrange:
5440               errmsg = _("internal error: out of range error");
5441               goto common_error;
5442
5443             case bfd_reloc_notsupported:
5444               errmsg = _("internal error: unsupported relocation error");
5445               goto common_error;
5446
5447             case bfd_reloc_dangerous:
5448               errmsg = _("internal error: dangerous error");
5449               goto common_error;
5450
5451             default:
5452               errmsg = _("internal error: unknown error");
5453               /* Fall through.  */
5454
5455             common_error:
5456               (*info->callbacks->warning) (info, errmsg, name, input_bfd,
5457                                            input_section, offset);
5458               break;
5459             }
5460         }
5461     }
5462
5463   return ret;
5464 }
5465
5466 /* Finish up dynamic symbol handling.  We set the contents of various
5467    dynamic sections here.  */
5468
5469 static bfd_boolean
5470 nds32_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
5471                                  struct elf_link_hash_entry *h, Elf_Internal_Sym *sym)
5472 {
5473   struct elf_nds32_link_hash_table *htab;
5474   bfd_byte *loc;
5475
5476   htab = nds32_elf_hash_table (info);
5477
5478   if (h->plt.offset != (bfd_vma) - 1)
5479     {
5480       asection *splt;
5481       asection *sgot;
5482       asection *srela;
5483
5484       bfd_vma plt_index;
5485       bfd_vma got_offset;
5486       bfd_vma local_plt_offset;
5487       Elf_Internal_Rela rela;
5488
5489       /* This symbol has an entry in the procedure linkage table.  Set
5490          it up.  */
5491
5492       BFD_ASSERT (h->dynindx != -1);
5493
5494       splt = htab->splt;
5495       sgot = htab->sgotplt;
5496       srela = htab->srelplt;
5497       BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
5498
5499       /* Get the index in the procedure linkage table which
5500          corresponds to this symbol.  This is the index of this symbol
5501          in all the symbols for which we are making plt entries.  The
5502          first entry in the procedure linkage table is reserved.  */
5503       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
5504
5505       /* Get the offset into the .got table of the entry that
5506          corresponds to this function.  Each .got entry is 4 bytes.
5507          The first three are reserved.  */
5508       got_offset = (plt_index + 3) * 4;
5509
5510       /* Fill in the entry in the procedure linkage table.  */
5511       if (!bfd_link_pic (info))
5512         {
5513           unsigned long insn;
5514
5515           insn = PLT_ENTRY_WORD0 + (((sgot->output_section->vma
5516                                       + sgot->output_offset + got_offset) >> 12)
5517                                     & 0xfffff);
5518           bfd_putb32 (insn, splt->contents + h->plt.offset);
5519
5520           insn = PLT_ENTRY_WORD1 + (((sgot->output_section->vma
5521                                       + sgot->output_offset + got_offset) & 0x0fff)
5522                                     >> 2);
5523           bfd_putb32 (insn, splt->contents + h->plt.offset + 4);
5524
5525           insn = PLT_ENTRY_WORD2;
5526           bfd_putb32 (insn, splt->contents + h->plt.offset + 8);
5527
5528           insn = PLT_ENTRY_WORD3 + (plt_index & 0x7ffff);
5529           bfd_putb32 (insn, splt->contents + h->plt.offset + 12);
5530
5531           insn = PLT_ENTRY_WORD4
5532                  + (((unsigned int) ((-(h->plt.offset + 16)) >> 1)) & 0xffffff);
5533           bfd_putb32 (insn, splt->contents + h->plt.offset + 16);
5534           local_plt_offset = 12;
5535         }
5536       else
5537         {
5538           /* sda_base must be set at this time.  */
5539           unsigned long insn;
5540           long offset;
5541
5542           /* FIXME, sda_base is 65536, it will damage opcode.  */
5543           /* insn = PLT_PIC_ENTRY_WORD0 + (((got_offset - sda_base) >> 2) & 0x7fff); */
5544           offset = sgot->output_section->vma + sgot->output_offset + got_offset
5545                    - elf_gp (output_bfd);
5546           insn = PLT_PIC_ENTRY_WORD0 + ((offset >> 12) & 0xfffff);
5547           bfd_putb32 (insn, splt->contents + h->plt.offset);
5548
5549           insn = PLT_PIC_ENTRY_WORD1 + (offset & 0xfff);
5550           bfd_putb32 (insn, splt->contents + h->plt.offset + 4);
5551
5552           insn = PLT_PIC_ENTRY_WORD2;
5553           bfd_putb32 (insn, splt->contents + h->plt.offset + 8);
5554
5555           insn = PLT_PIC_ENTRY_WORD3;
5556           bfd_putb32 (insn, splt->contents + h->plt.offset + 12);
5557
5558           insn = PLT_PIC_ENTRY_WORD4 + (plt_index & 0x7fffff);
5559           bfd_putb32 (insn, splt->contents + h->plt.offset + 16);
5560
5561           insn = PLT_PIC_ENTRY_WORD5
5562             + (((unsigned int) ((-(h->plt.offset + 20)) >> 1)) & 0xffffff);
5563           bfd_putb32 (insn, splt->contents + h->plt.offset + 20);
5564
5565           local_plt_offset = 16;
5566         }
5567
5568       /* Fill in the entry in the global offset table,
5569          so it will fall through to the next instruction for the first time.  */
5570       bfd_put_32 (output_bfd,
5571                   (splt->output_section->vma + splt->output_offset
5572                    + h->plt.offset + local_plt_offset),
5573                   sgot->contents + got_offset);
5574
5575       /* Fill in the entry in the .rela.plt section.  */
5576       rela.r_offset = (sgot->output_section->vma
5577                        + sgot->output_offset + got_offset);
5578       rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_JMP_SLOT);
5579       rela.r_addend = 0;
5580       loc = srela->contents;
5581       loc += plt_index * sizeof (Elf32_External_Rela);
5582       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5583
5584       if (!h->def_regular)
5585         {
5586           /* Mark the symbol as undefined, rather than as defined in
5587              the .plt section.  Leave the value alone.  */
5588           sym->st_shndx = SHN_UNDEF;
5589           if (!h->ref_regular_nonweak)
5590             sym->st_value = 0;
5591         }
5592     }
5593
5594   if (h->got.offset != (bfd_vma) - 1)
5595     {
5596       asection *sgot;
5597       asection *srela;
5598       Elf_Internal_Rela rela;
5599
5600       /* This symbol has an entry in the global offset table.
5601          Set it up.  */
5602
5603       sgot = htab->sgot;
5604       srela = htab->srelgot;
5605       BFD_ASSERT (sgot != NULL && srela != NULL);
5606
5607       rela.r_offset = (sgot->output_section->vma
5608                        + sgot->output_offset + (h->got.offset & ~1));
5609
5610       /* If this is a -Bsymbolic link, and the symbol is defined
5611          locally, we just want to emit a RELATIVE reloc.  Likewise if
5612          the symbol was forced to be local because of a version file.
5613          The entry in the global offset table will already have been
5614          initialized in the relocate_section function.  */
5615       if (bfd_link_pic (info)
5616           && (info->symbolic
5617               || h->dynindx == -1 || h->forced_local) && h->def_regular)
5618         {
5619           rela.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
5620           rela.r_addend = (h->root.u.def.value
5621                            + h->root.u.def.section->output_section->vma
5622                            + h->root.u.def.section->output_offset);
5623         }
5624       else
5625         {
5626           BFD_ASSERT ((h->got.offset & 1) == 0);
5627           bfd_put_32 (output_bfd, (bfd_vma) 0,
5628                       sgot->contents + h->got.offset);
5629           rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_GLOB_DAT);
5630           rela.r_addend = 0;
5631         }
5632
5633       loc = srela->contents;
5634       loc += srela->reloc_count * sizeof (Elf32_External_Rela);
5635       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5636       ++srela->reloc_count;
5637     }
5638
5639   if (h->needs_copy)
5640     {
5641       asection *s;
5642       Elf_Internal_Rela rela;
5643
5644       /* This symbols needs a copy reloc.  Set it up.  */
5645
5646       BFD_ASSERT (h->dynindx != -1
5647                   && (h->root.type == bfd_link_hash_defined
5648                       || h->root.type == bfd_link_hash_defweak));
5649
5650       s = bfd_get_section_by_name (h->root.u.def.section->owner, ".rela.bss");
5651       BFD_ASSERT (s != NULL);
5652
5653       rela.r_offset = (h->root.u.def.value
5654                        + h->root.u.def.section->output_section->vma
5655                        + h->root.u.def.section->output_offset);
5656       rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_COPY);
5657       rela.r_addend = 0;
5658       loc = s->contents;
5659       loc += s->reloc_count * sizeof (Elf32_External_Rela);
5660       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5661       ++s->reloc_count;
5662     }
5663
5664   /* Mark some specially defined symbols as absolute.  */
5665   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
5666       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
5667     sym->st_shndx = SHN_ABS;
5668
5669   return TRUE;
5670 }
5671
5672
5673 /* Finish up the dynamic sections.  */
5674
5675 static bfd_boolean
5676 nds32_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
5677 {
5678   struct elf_nds32_link_hash_table *htab;
5679   bfd *dynobj;
5680   asection *sdyn;
5681   asection *sgot;
5682
5683   htab = nds32_elf_hash_table (info);
5684   dynobj = htab->root.dynobj;
5685
5686   sgot = htab->sgotplt;
5687   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
5688
5689   if (htab->root.dynamic_sections_created)
5690     {
5691       asection *splt;
5692       Elf32_External_Dyn *dyncon, *dynconend;
5693
5694       BFD_ASSERT (sgot != NULL && sdyn != NULL);
5695
5696       dyncon = (Elf32_External_Dyn *) sdyn->contents;
5697       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5698
5699       for (; dyncon < dynconend; dyncon++)
5700         {
5701           Elf_Internal_Dyn dyn;
5702           asection *s;
5703
5704           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5705
5706           switch (dyn.d_tag)
5707             {
5708             default:
5709               break;
5710
5711             case DT_PLTGOT:
5712               s = htab->sgotplt;
5713               goto get_vma;
5714             case DT_JMPREL:
5715               s = htab->srelplt;
5716             get_vma:
5717               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5718               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5719               break;
5720
5721             case DT_PLTRELSZ:
5722               s = htab->srelplt;
5723               dyn.d_un.d_val = s->size;
5724               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5725               break;
5726
5727             case DT_RELASZ:
5728               /* My reading of the SVR4 ABI indicates that the
5729                  procedure linkage table relocs (DT_JMPREL) should be
5730                  included in the overall relocs (DT_RELA).  This is
5731                  what Solaris does.  However, UnixWare can not handle
5732                  that case.  Therefore, we override the DT_RELASZ entry
5733                  here to make it not include the JMPREL relocs.  Since
5734                  the linker script arranges for .rela.plt to follow all
5735                  other relocation sections, we don't have to worry
5736                  about changing the DT_RELA entry.  */
5737               if (htab->srelplt != NULL)
5738                 {
5739                   s = htab->srelplt;
5740                   dyn.d_un.d_val -= s->size;
5741                 }
5742               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5743               break;
5744             }
5745         }
5746
5747       /* Fill in the first entry in the procedure linkage table.  */
5748       splt = htab->splt;
5749       if (splt && splt->size > 0)
5750         {
5751           if (bfd_link_pic (info))
5752             {
5753               unsigned long insn;
5754               long offset;
5755
5756               /* FIXME, sda_base is 65536, it will damage opcode.  */
5757               /* insn = PLT_PIC_ENTRY_WORD0 + (((got_offset - sda_base) >> 2) & 0x7fff); */
5758               offset = sgot->output_section->vma + sgot->output_offset + 4
5759                        - elf_gp (output_bfd);
5760               insn = PLT0_PIC_ENTRY_WORD0 | ((offset >> 12) & 0xfffff);
5761               bfd_putb32 (insn, splt->contents);
5762
5763               /* insn = PLT0_PIC_ENTRY_WORD0 | (((8 - sda_base) >> 2) & 0x7fff) ; */
5764               /* here has a typo?  */
5765               insn = PLT0_PIC_ENTRY_WORD1 | (offset & 0xfff);
5766               bfd_putb32 (insn, splt->contents + 4);
5767
5768               insn = PLT0_PIC_ENTRY_WORD2;
5769               bfd_putb32 (insn, splt->contents + 8);
5770
5771               insn = PLT0_PIC_ENTRY_WORD3;
5772               bfd_putb32 (insn, splt->contents + 12);
5773
5774               insn = PLT0_PIC_ENTRY_WORD4;
5775               bfd_putb32 (insn, splt->contents + 16);
5776
5777               insn = PLT0_PIC_ENTRY_WORD5;
5778               bfd_putb32 (insn, splt->contents + 20);
5779             }
5780           else
5781             {
5782               unsigned long insn;
5783               unsigned long addr;
5784
5785               /* addr = .got + 4 */
5786               addr = sgot->output_section->vma + sgot->output_offset + 4;
5787               insn = PLT0_ENTRY_WORD0 | ((addr >> 12) & 0xfffff);
5788               bfd_putb32 (insn, splt->contents);
5789
5790               insn = PLT0_ENTRY_WORD1 | (addr & 0x0fff);
5791               bfd_putb32 (insn, splt->contents + 4);
5792
5793               insn = PLT0_ENTRY_WORD2;
5794               bfd_putb32 (insn, splt->contents + 8);
5795
5796               insn = PLT0_ENTRY_WORD3;
5797               bfd_putb32 (insn, splt->contents + 12);
5798
5799               insn = PLT0_ENTRY_WORD4;
5800               bfd_putb32 (insn, splt->contents + 16);
5801             }
5802
5803           elf_section_data (splt->output_section)->this_hdr.sh_entsize =
5804             PLT_ENTRY_SIZE;
5805         }
5806     }
5807
5808   /* Fill in the first three entries in the global offset table.  */
5809   if (sgot && sgot->size > 0)
5810     {
5811       if (sdyn == NULL)
5812         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
5813       else
5814         bfd_put_32 (output_bfd,
5815                     sdyn->output_section->vma + sdyn->output_offset,
5816                     sgot->contents);
5817       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
5818       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
5819
5820       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
5821     }
5822
5823   return TRUE;
5824 }
5825 \f
5826
5827 /* Set the right machine number.  */
5828
5829 static bfd_boolean
5830 nds32_elf_object_p (bfd *abfd)
5831 {
5832   static unsigned int cur_arch = 0;
5833
5834   if (E_N1_ARCH != (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH))
5835     {
5836       /* E_N1_ARCH is a wild card, so it is set only when no others exist.  */
5837       cur_arch = (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH);
5838     }
5839
5840   switch (cur_arch)
5841     {
5842     default:
5843     case E_N1_ARCH:
5844       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1);
5845       break;
5846     case E_N1H_ARCH:
5847       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h);
5848       break;
5849     case E_NDS_ARCH_STAR_V2_0:
5850       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v2);
5851       break;
5852     case E_NDS_ARCH_STAR_V3_0:
5853       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3);
5854       break;
5855     case E_NDS_ARCH_STAR_V3_M:
5856       bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3m);
5857       break;
5858     }
5859
5860   return TRUE;
5861 }
5862
5863 /* Store the machine number in the flags field.  */
5864
5865 static void
5866 nds32_elf_final_write_processing (bfd *abfd,
5867                                   bfd_boolean linker ATTRIBUTE_UNUSED)
5868 {
5869   unsigned long val;
5870   static unsigned int cur_mach = 0;
5871
5872   if (bfd_mach_n1 != bfd_get_mach (abfd))
5873     {
5874       cur_mach = bfd_get_mach (abfd);
5875     }
5876
5877   switch (cur_mach)
5878     {
5879     case bfd_mach_n1:
5880       /* Only happen when object is empty, since the case is abandon.  */
5881       val = E_N1_ARCH;
5882       val |= E_NDS_ABI_AABI;
5883       val |= E_NDS32_ELF_VER_1_4;
5884       break;
5885     case bfd_mach_n1h:
5886       val = E_N1H_ARCH;
5887       break;
5888     case bfd_mach_n1h_v2:
5889       val = E_NDS_ARCH_STAR_V2_0;
5890       break;
5891     case bfd_mach_n1h_v3:
5892       val = E_NDS_ARCH_STAR_V3_0;
5893       break;
5894     case bfd_mach_n1h_v3m:
5895       val = E_NDS_ARCH_STAR_V3_M;
5896       break;
5897     default:
5898       val = 0;
5899       break;
5900     }
5901
5902   elf_elfheader (abfd)->e_flags &= ~EF_NDS_ARCH;
5903   elf_elfheader (abfd)->e_flags |= val;
5904 }
5905
5906 /* Function to keep NDS32 specific file flags.  */
5907
5908 static bfd_boolean
5909 nds32_elf_set_private_flags (bfd *abfd, flagword flags)
5910 {
5911   BFD_ASSERT (!elf_flags_init (abfd)
5912               || elf_elfheader (abfd)->e_flags == flags);
5913
5914   elf_elfheader (abfd)->e_flags = flags;
5915   elf_flags_init (abfd) = TRUE;
5916   return TRUE;
5917 }
5918
5919 static unsigned int
5920 convert_e_flags (unsigned int e_flags, unsigned int arch)
5921 {
5922   if ((e_flags & EF_NDS_ARCH) == E_NDS_ARCH_STAR_V0_9)
5923     {
5924       /* From 0.9 to 1.0.  */
5925       e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V1_0;
5926
5927       /* Invert E_NDS32_HAS_NO_MAC_INST.  */
5928       e_flags ^= E_NDS32_HAS_NO_MAC_INST;
5929       if (arch == E_NDS_ARCH_STAR_V1_0)
5930         {
5931           /* Done.  */
5932           return e_flags;
5933         }
5934     }
5935
5936   /* From 1.0 to 2.0.  */
5937   e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V2_0;
5938
5939   /* Clear E_NDS32_HAS_MFUSR_PC_INST.  */
5940   e_flags &= ~E_NDS32_HAS_MFUSR_PC_INST;
5941
5942   /* Invert E_NDS32_HAS_NO_MAC_INST.  */
5943   e_flags ^= E_NDS32_HAS_NO_MAC_INST;
5944   return e_flags;
5945 }
5946
5947 static bfd_boolean
5948 nds32_check_vec_size (bfd *ibfd)
5949 {
5950   static unsigned int nds32_vec_size = 0;
5951
5952   asection *sec_t = NULL;
5953   bfd_byte *contents = NULL;
5954
5955   sec_t = bfd_get_section_by_name (ibfd, ".nds32_e_flags");
5956
5957   if (sec_t && sec_t->size >= 4)
5958     {
5959       /* Get vec_size in file.  */
5960       unsigned int flag_t;
5961
5962       nds32_get_section_contents (ibfd, sec_t, &contents, TRUE);
5963       flag_t = bfd_get_32 (ibfd, contents);
5964
5965       /* The value could only be 4 or 16.  */
5966
5967       if (!nds32_vec_size)
5968         /* Set if not set yet.  */
5969         nds32_vec_size = (flag_t & 0x3);
5970       else if (nds32_vec_size != (flag_t & 0x3))
5971         {
5972           _bfd_error_handler
5973             (_("%B: ISR vector size mismatch"
5974                " with previous modules, previous %u-byte, current %u-byte"),
5975              ibfd,
5976              nds32_vec_size == 1 ? 4 : nds32_vec_size == 2 ? 16 : 0xffffffff,
5977              (flag_t & 0x3) == 1 ? 4 : (flag_t & 0x3) == 2 ? 16 : 0xffffffff);
5978           return FALSE;
5979         }
5980       else
5981         /* Only keep the first vec_size section.  */
5982         sec_t->flags |= SEC_EXCLUDE;
5983     }
5984
5985   return TRUE;
5986 }
5987
5988 /* Merge backend specific data from an object file to the output
5989    object file when linking.  */
5990
5991 static bfd_boolean
5992 nds32_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
5993 {
5994   bfd *obfd = info->output_bfd;
5995   flagword out_flags;
5996   flagword in_flags;
5997   flagword out_16regs;
5998   flagword in_no_mac;
5999   flagword out_no_mac;
6000   flagword in_16regs;
6001   flagword out_version;
6002   flagword in_version;
6003   flagword out_fpu_config;
6004   flagword in_fpu_config;
6005
6006   /* TODO: Revise to use object-attributes instead.  */
6007   if (!nds32_check_vec_size (ibfd))
6008     return FALSE;
6009
6010   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6011       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
6012     return TRUE;
6013
6014   if (bfd_little_endian (ibfd) != bfd_little_endian (obfd))
6015     {
6016       _bfd_error_handler
6017         (_("%B: warning: Endian mismatch with previous modules."), ibfd);
6018
6019       bfd_set_error (bfd_error_bad_value);
6020       return FALSE;
6021     }
6022
6023   in_version = elf_elfheader (ibfd)->e_flags & EF_NDS32_ELF_VERSION;
6024   if (in_version == E_NDS32_ELF_VER_1_2)
6025     {
6026       _bfd_error_handler
6027         (_("%B: warning: Older version of object file encountered, "
6028            "Please recompile with current tool chain."), ibfd);
6029     }
6030
6031   /* We may need to merge V1 and V2 arch object files to V2.  */
6032   if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
6033       != (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
6034     {
6035       /* Need to convert version.  */
6036       if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
6037           == E_NDS_ARCH_STAR_RESERVED)
6038         {
6039           elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
6040         }
6041       else if ((elf_elfheader (obfd)->e_flags & EF_NDS_ARCH) == E_NDS_ARCH_STAR_V0_9
6042                || (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
6043                   > (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
6044         {
6045           elf_elfheader (obfd)->e_flags =
6046             convert_e_flags (elf_elfheader (obfd)->e_flags,
6047                              (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH));
6048         }
6049       else
6050         {
6051           elf_elfheader (ibfd)->e_flags =
6052             convert_e_flags (elf_elfheader (ibfd)->e_flags,
6053                              (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH));
6054         }
6055     }
6056
6057   /* Extract some flags.  */
6058   in_flags = elf_elfheader (ibfd)->e_flags
6059              & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
6060                   | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
6061
6062   /* The following flags need special treatment.  */
6063   in_16regs = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
6064   in_no_mac = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
6065   in_fpu_config = elf_elfheader (ibfd)->e_flags & E_NDS32_FPU_REG_CONF;
6066
6067   /* Extract some flags.  */
6068   out_flags = elf_elfheader (obfd)->e_flags
6069               & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
6070                    | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
6071
6072   /* The following flags need special treatment.  */
6073   out_16regs = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
6074   out_no_mac = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
6075   out_fpu_config = elf_elfheader (obfd)->e_flags & E_NDS32_FPU_REG_CONF;
6076   out_version = elf_elfheader (obfd)->e_flags & EF_NDS32_ELF_VERSION;
6077   if (!elf_flags_init (obfd))
6078     {
6079       /* If the input is the default architecture then do not
6080          bother setting the flags for the output architecture,
6081          instead allow future merges to do this.  If no future
6082          merges ever set these flags then they will retain their
6083          unitialised values, which surprise surprise, correspond
6084          to the default values.  */
6085       if (bfd_get_arch_info (ibfd)->the_default)
6086         return TRUE;
6087
6088       elf_flags_init (obfd) = TRUE;
6089       elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
6090
6091       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
6092           && bfd_get_arch_info (obfd)->the_default)
6093         {
6094           return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
6095                                     bfd_get_mach (ibfd));
6096         }
6097
6098       return TRUE;
6099     }
6100
6101   /* Check flag compatibility.  */
6102   if ((in_flags & EF_NDS_ABI) != (out_flags & EF_NDS_ABI))
6103     {
6104       _bfd_error_handler
6105         (_("%B: error: ABI mismatch with previous modules."), ibfd);
6106
6107       bfd_set_error (bfd_error_bad_value);
6108       return FALSE;
6109     }
6110
6111   if ((in_flags & EF_NDS_ARCH) != (out_flags & EF_NDS_ARCH))
6112     {
6113       if (((in_flags & EF_NDS_ARCH) != E_N1_ARCH))
6114         {
6115           _bfd_error_handler
6116             (_("%B: error: Instruction set mismatch with previous modules."), ibfd);
6117
6118           bfd_set_error (bfd_error_bad_value);
6119           return FALSE;
6120         }
6121     }
6122
6123   /* When linking with V1.2 and V1.3 objects together the output is V1.2.
6124      and perf ext1 and DIV are mergerd to perf ext1.  */
6125   if (in_version == E_NDS32_ELF_VER_1_2 || out_version == E_NDS32_ELF_VER_1_2)
6126     {
6127       elf_elfheader (obfd)->e_flags =
6128         (in_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6129         | (out_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6130         | (((in_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6131            ?  E_NDS32_HAS_EXT_INST : 0)
6132         | (((out_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
6133            ?  E_NDS32_HAS_EXT_INST : 0)
6134         | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
6135         | ((in_version > out_version) ? out_version : in_version);
6136     }
6137   else
6138     {
6139       if (in_version != out_version)
6140         _bfd_error_handler
6141           (_("%B: warning: Incompatible elf-versions %s and  %s."),
6142            ibfd, nds32_elfver_strtab[out_version],
6143            nds32_elfver_strtab[in_version]);
6144
6145       elf_elfheader (obfd)->e_flags = in_flags | out_flags
6146         | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
6147         | (in_fpu_config > out_fpu_config ? in_fpu_config : out_fpu_config)
6148         | (in_version > out_version ?  out_version : in_version);
6149     }
6150
6151   return TRUE;
6152 }
6153
6154 /* Display the flags field.  */
6155
6156 static bfd_boolean
6157 nds32_elf_print_private_bfd_data (bfd *abfd, void *ptr)
6158 {
6159   FILE *file = (FILE *) ptr;
6160
6161   BFD_ASSERT (abfd != NULL && ptr != NULL);
6162
6163   _bfd_elf_print_private_bfd_data (abfd, ptr);
6164
6165   fprintf (file, _("private flags = %lx"), elf_elfheader (abfd)->e_flags);
6166
6167   switch (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH)
6168     {
6169     default:
6170     case E_N1_ARCH:
6171       fprintf (file, _(": n1 instructions"));
6172       break;
6173     case E_N1H_ARCH:
6174       fprintf (file, _(": n1h instructions"));
6175       break;
6176     }
6177
6178   fputc ('\n', file);
6179
6180   return TRUE;
6181 }
6182
6183 static unsigned int
6184 nds32_elf_action_discarded (asection *sec)
6185 {
6186
6187   if (strncmp
6188       (".gcc_except_table", sec->name, sizeof (".gcc_except_table") - 1) == 0)
6189     return 0;
6190
6191   return _bfd_elf_default_action_discarded (sec);
6192 }
6193
6194 static asection *
6195 nds32_elf_gc_mark_hook (asection *sec, struct bfd_link_info *info,
6196                         Elf_Internal_Rela *rel, struct elf_link_hash_entry *h,
6197                         Elf_Internal_Sym *sym)
6198 {
6199   if (h != NULL)
6200     switch (ELF32_R_TYPE (rel->r_info))
6201       {
6202       case R_NDS32_GNU_VTINHERIT:
6203       case R_NDS32_GNU_VTENTRY:
6204       case R_NDS32_RELA_GNU_VTINHERIT:
6205       case R_NDS32_RELA_GNU_VTENTRY:
6206         return NULL;
6207       }
6208
6209   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6210 }
6211
6212 static bfd_boolean
6213 nds32_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, asection *sec,
6214                          const Elf_Internal_Rela *relocs)
6215 {
6216   /* Update the got entry reference counts for the section being removed.  */
6217   Elf_Internal_Shdr *symtab_hdr;
6218   struct elf_link_hash_entry **sym_hashes;
6219   bfd_signed_vma *local_got_refcounts;
6220   const Elf_Internal_Rela *rel, *relend;
6221
6222   elf_section_data (sec)->local_dynrel = NULL;
6223
6224   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6225   sym_hashes = elf_sym_hashes (abfd);
6226   local_got_refcounts = elf_local_got_refcounts (abfd);
6227
6228   relend = relocs + sec->reloc_count;
6229   for (rel = relocs; rel < relend; rel++)
6230     {
6231       unsigned long r_symndx;
6232       struct elf_link_hash_entry *h = NULL;
6233
6234       r_symndx = ELF32_R_SYM (rel->r_info);
6235       if (r_symndx >= symtab_hdr->sh_info)
6236         {
6237           /* External symbol.  */
6238           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6239           while (h->root.type == bfd_link_hash_indirect
6240                  || h->root.type == bfd_link_hash_warning)
6241             h = (struct elf_link_hash_entry *) h->root.u.i.link;
6242         }
6243
6244       switch (ELF32_R_TYPE (rel->r_info))
6245         {
6246         case R_NDS32_GOT_HI20:
6247         case R_NDS32_GOT_LO12:
6248         case R_NDS32_GOT_LO15:
6249         case R_NDS32_GOT_LO19:
6250         case R_NDS32_GOT17S2_RELA:
6251         case R_NDS32_GOT15S2_RELA:
6252         case R_NDS32_GOTOFF:
6253         case R_NDS32_GOTOFF_HI20:
6254         case R_NDS32_GOTOFF_LO12:
6255         case R_NDS32_GOTOFF_LO15:
6256         case R_NDS32_GOTOFF_LO19:
6257         case R_NDS32_GOT20:
6258         case R_NDS32_GOTPC_HI20:
6259         case R_NDS32_GOTPC_LO12:
6260         case R_NDS32_GOTPC20:
6261           if (h != NULL)
6262             {
6263               if (h->got.refcount > 0)
6264                 h->got.refcount--;
6265             }
6266           else
6267             {
6268               if (local_got_refcounts && local_got_refcounts[r_symndx] > 0)
6269                 local_got_refcounts[r_symndx]--;
6270             }
6271           break;
6272
6273         case R_NDS32_16_RELA:
6274         case R_NDS32_20_RELA:
6275         case R_NDS32_5_RELA:
6276         case R_NDS32_32_RELA:
6277         case R_NDS32_HI20_RELA:
6278         case R_NDS32_LO12S3_RELA:
6279         case R_NDS32_LO12S2_RELA:
6280         case R_NDS32_LO12S2_DP_RELA:
6281         case R_NDS32_LO12S2_SP_RELA:
6282         case R_NDS32_LO12S1_RELA:
6283         case R_NDS32_LO12S0_RELA:
6284         case R_NDS32_LO12S0_ORI_RELA:
6285         case R_NDS32_SDA16S3_RELA:
6286         case R_NDS32_SDA17S2_RELA:
6287         case R_NDS32_SDA18S1_RELA:
6288         case R_NDS32_SDA19S0_RELA:
6289         case R_NDS32_SDA15S3_RELA:
6290         case R_NDS32_SDA15S2_RELA:
6291         case R_NDS32_SDA12S2_DP_RELA:
6292         case R_NDS32_SDA12S2_SP_RELA:
6293         case R_NDS32_SDA15S1_RELA:
6294         case R_NDS32_SDA15S0_RELA:
6295         case R_NDS32_SDA_FP7U2_RELA:
6296         case R_NDS32_15_PCREL_RELA:
6297         case R_NDS32_17_PCREL_RELA:
6298         case R_NDS32_25_PCREL_RELA:
6299           if (h != NULL)
6300             {
6301               struct elf_nds32_link_hash_entry *eh;
6302               struct elf_nds32_dyn_relocs **pp;
6303               struct elf_nds32_dyn_relocs *p;
6304
6305               if (!bfd_link_pic (info) && h->plt.refcount > 0)
6306                 h->plt.refcount -= 1;
6307
6308               eh = (struct elf_nds32_link_hash_entry *) h;
6309
6310               for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
6311                 if (p->sec == sec)
6312                   {
6313                     if (ELF32_R_TYPE (rel->r_info) == R_NDS32_15_PCREL_RELA
6314                         || ELF32_R_TYPE (rel->r_info) == R_NDS32_17_PCREL_RELA
6315                         || ELF32_R_TYPE (rel->r_info) == R_NDS32_25_PCREL_RELA)
6316                       p->pc_count -= 1;
6317                     p->count -= 1;
6318                     if (p->count == 0)
6319                       *pp = p->next;
6320                     break;
6321                   }
6322             }
6323           break;
6324
6325         case R_NDS32_9_PLTREL:
6326         case R_NDS32_25_PLTREL:
6327           if (h != NULL)
6328             {
6329               if (h->plt.refcount > 0)
6330                 h->plt.refcount--;
6331             }
6332           break;
6333
6334         default:
6335           break;
6336         }
6337     }
6338
6339   return TRUE;
6340 }
6341
6342 /* Look through the relocs for a section during the first phase.
6343    Since we don't do .gots or .plts, we just need to consider the
6344    virtual table relocs for gc.  */
6345
6346 static bfd_boolean
6347 nds32_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
6348                         asection *sec, const Elf_Internal_Rela *relocs)
6349 {
6350   Elf_Internal_Shdr *symtab_hdr;
6351   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
6352   const Elf_Internal_Rela *rel;
6353   const Elf_Internal_Rela *rel_end;
6354   struct elf_nds32_link_hash_table *htab;
6355   bfd *dynobj;
6356   asection *sreloc = NULL;
6357
6358   if (bfd_link_relocatable (info))
6359     return TRUE;
6360
6361   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6362   sym_hashes = elf_sym_hashes (abfd);
6363   sym_hashes_end =
6364     sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
6365   if (!elf_bad_symtab (abfd))
6366     sym_hashes_end -= symtab_hdr->sh_info;
6367
6368   htab = nds32_elf_hash_table (info);
6369   dynobj = htab->root.dynobj;
6370
6371   rel_end = relocs + sec->reloc_count;
6372   for (rel = relocs; rel < rel_end; rel++)
6373     {
6374       enum elf_nds32_reloc_type r_type;
6375       struct elf_link_hash_entry *h;
6376       unsigned long r_symndx;
6377       int tls_type, old_tls_type;
6378
6379       r_symndx = ELF32_R_SYM (rel->r_info);
6380       r_type = ELF32_R_TYPE (rel->r_info);
6381       if (r_symndx < symtab_hdr->sh_info)
6382         h = NULL;
6383       else
6384         {
6385           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6386           while (h->root.type == bfd_link_hash_indirect
6387                  || h->root.type == bfd_link_hash_warning)
6388             h = (struct elf_link_hash_entry *) h->root.u.i.link;
6389         }
6390
6391       /* Some relocs require a global offset table.  We create
6392          got section here, since these relocation need got section
6393          and it is not created yet.  */
6394       if (htab->sgot == NULL)
6395         {
6396           switch (r_type)
6397             {
6398             case R_NDS32_GOT_HI20:
6399             case R_NDS32_GOT_LO12:
6400             case R_NDS32_GOT_LO15:
6401             case R_NDS32_GOT_LO19:
6402             case R_NDS32_GOT17S2_RELA:
6403             case R_NDS32_GOT15S2_RELA:
6404             case R_NDS32_GOTOFF:
6405             case R_NDS32_GOTOFF_HI20:
6406             case R_NDS32_GOTOFF_LO12:
6407             case R_NDS32_GOTOFF_LO15:
6408             case R_NDS32_GOTOFF_LO19:
6409             case R_NDS32_GOTPC20:
6410             case R_NDS32_GOTPC_HI20:
6411             case R_NDS32_GOTPC_LO12:
6412             case R_NDS32_GOT20:
6413             case R_NDS32_TLS_IE_HI20:
6414             case R_NDS32_TLS_IE_LO12S2:
6415               if (dynobj == NULL)
6416                 htab->root.dynobj = dynobj = abfd;
6417               if (!create_got_section (dynobj, info))
6418                 return FALSE;
6419               break;
6420
6421             default:
6422               break;
6423             }
6424         }
6425
6426       switch ((int) r_type)
6427         {
6428         case R_NDS32_GOT_HI20:
6429         case R_NDS32_GOT_LO12:
6430         case R_NDS32_GOT_LO15:
6431         case R_NDS32_GOT_LO19:
6432         case R_NDS32_GOT20:
6433         case R_NDS32_TLS_IE_HI20:
6434         case R_NDS32_TLS_IE_LO12S2:
6435           switch (r_type)
6436             {
6437             case R_NDS32_TLS_IE_HI20:
6438             case R_NDS32_TLS_IE_LO12S2:
6439               tls_type = GOT_TLS_IE;
6440               break;
6441             default:
6442               tls_type = GOT_NORMAL;
6443               break;
6444             }
6445           if (h != NULL)
6446             {
6447               old_tls_type = elf32_nds32_hash_entry (h)->tls_type;
6448               h->got.refcount += 1;
6449             }
6450           else
6451             {
6452               bfd_signed_vma *local_got_refcounts;
6453
6454               /* This is a global offset table entry for a local
6455                  symbol.  */
6456               local_got_refcounts = elf_local_got_refcounts (abfd);
6457               if (local_got_refcounts == NULL)
6458                 {
6459                   bfd_size_type size;
6460
6461                   size = symtab_hdr->sh_info;
6462                   size *= sizeof (bfd_signed_vma);
6463                   local_got_refcounts = (bfd_signed_vma *) bfd_zalloc (abfd, size);
6464                   if (local_got_refcounts == NULL)
6465                     return FALSE;
6466                   elf_local_got_refcounts (abfd) = local_got_refcounts;
6467                 }
6468               local_got_refcounts[r_symndx] += 1;
6469               old_tls_type = elf32_nds32_local_got_tls_type (abfd)[r_symndx];
6470             }
6471
6472           /* We will already have issued an error message if there
6473              is a TLS/non-TLS mismatch, based on the symbol
6474              type.  So just combine any TLS types needed.  */
6475           if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
6476               && tls_type != GOT_NORMAL)
6477             tls_type |= old_tls_type;
6478
6479           if (old_tls_type != tls_type)
6480             {
6481               if (h != NULL)
6482                 elf32_nds32_hash_entry (h)->tls_type = tls_type;
6483               else
6484                 elf32_nds32_local_got_tls_type (abfd)[r_symndx] = tls_type;
6485             }
6486           break;
6487         case R_NDS32_9_PLTREL:
6488         case R_NDS32_25_PLTREL:
6489         case R_NDS32_PLTREL_HI20:
6490         case R_NDS32_PLTREL_LO12:
6491         case R_NDS32_PLT_GOTREL_HI20:
6492         case R_NDS32_PLT_GOTREL_LO12:
6493         case R_NDS32_PLT_GOTREL_LO15:
6494         case R_NDS32_PLT_GOTREL_LO19:
6495         case R_NDS32_PLT_GOTREL_LO20:
6496
6497           /* This symbol requires a procedure linkage table entry.  We
6498              actually build the entry in adjust_dynamic_symbol,
6499              because this might be a case of linking PIC code without
6500              linking in any dynamic objects, in which case we don't
6501              need to generate a procedure linkage table after all.  */
6502
6503           /* If this is a local symbol, we resolve it directly without
6504              creating a procedure linkage table entry.  */
6505           if (h == NULL)
6506             continue;
6507
6508           if (h->forced_local)
6509             break;
6510
6511           elf32_nds32_hash_entry (h)->tls_type = GOT_NORMAL;
6512           h->needs_plt = 1;
6513           h->plt.refcount += 1;
6514           break;
6515
6516         case R_NDS32_16_RELA:
6517         case R_NDS32_20_RELA:
6518         case R_NDS32_5_RELA:
6519         case R_NDS32_32_RELA:
6520         case R_NDS32_HI20_RELA:
6521         case R_NDS32_LO12S3_RELA:
6522         case R_NDS32_LO12S2_RELA:
6523         case R_NDS32_LO12S2_DP_RELA:
6524         case R_NDS32_LO12S2_SP_RELA:
6525         case R_NDS32_LO12S1_RELA:
6526         case R_NDS32_LO12S0_RELA:
6527         case R_NDS32_LO12S0_ORI_RELA:
6528         case R_NDS32_SDA16S3_RELA:
6529         case R_NDS32_SDA17S2_RELA:
6530         case R_NDS32_SDA18S1_RELA:
6531         case R_NDS32_SDA19S0_RELA:
6532         case R_NDS32_SDA15S3_RELA:
6533         case R_NDS32_SDA15S2_RELA:
6534         case R_NDS32_SDA12S2_DP_RELA:
6535         case R_NDS32_SDA12S2_SP_RELA:
6536         case R_NDS32_SDA15S1_RELA:
6537         case R_NDS32_SDA15S0_RELA:
6538         case R_NDS32_SDA_FP7U2_RELA:
6539         case R_NDS32_15_PCREL_RELA:
6540         case R_NDS32_17_PCREL_RELA:
6541         case R_NDS32_25_PCREL_RELA:
6542
6543           if (h != NULL && !bfd_link_pic (info))
6544             {
6545               h->non_got_ref = 1;
6546               h->plt.refcount += 1;
6547             }
6548
6549           /* If we are creating a shared library, and this is a reloc against
6550              a global symbol, or a non PC relative reloc against a local
6551              symbol, then we need to copy the reloc into the shared library.
6552              However, if we are linking with -Bsymbolic, we do not need to
6553              copy a reloc against a global symbol which is defined in an
6554              object we are including in the link (i.e., DEF_REGULAR is set).
6555              At this point we have not seen all the input files, so it is
6556              possible that DEF_REGULAR is not set now but will be set later
6557              (it is never cleared).  We account for that possibility below by
6558              storing information in the dyn_relocs field of the hash table
6559              entry.  A similar situation occurs when creating shared libraries
6560              and symbol visibility changes render the symbol local.
6561
6562              If on the other hand, we are creating an executable, we may need
6563              to keep relocations for symbols satisfied by a dynamic library
6564              if we manage to avoid copy relocs for the symbol.  */
6565           if ((bfd_link_pic (info)
6566                && (sec->flags & SEC_ALLOC) != 0
6567                && ((r_type != R_NDS32_25_PCREL_RELA
6568                     && r_type != R_NDS32_15_PCREL_RELA
6569                     && r_type != R_NDS32_17_PCREL_RELA
6570                     && !(r_type == R_NDS32_32_RELA
6571                          && strcmp (sec->name, ".eh_frame") == 0))
6572                    || (h != NULL
6573                        && (!info->symbolic
6574                            || h->root.type == bfd_link_hash_defweak
6575                            || !h->def_regular))))
6576               || (!bfd_link_pic (info)
6577                   && (sec->flags & SEC_ALLOC) != 0
6578                   && h != NULL
6579                   && (h->root.type == bfd_link_hash_defweak
6580                       || !h->def_regular)))
6581             {
6582               struct elf_nds32_dyn_relocs *p;
6583               struct elf_nds32_dyn_relocs **head;
6584
6585               if (dynobj == NULL)
6586                 htab->root.dynobj = dynobj = abfd;
6587
6588               /* When creating a shared object, we must copy these
6589                  relocs into the output file.  We create a reloc
6590                  section in dynobj and make room for the reloc.  */
6591               if (sreloc == NULL)
6592                 {
6593                   const char *name;
6594
6595                   name = bfd_elf_string_from_elf_section
6596                     (abfd, elf_elfheader (abfd)->e_shstrndx,
6597                      elf_section_data (sec)->rela.hdr->sh_name);
6598                   if (name == NULL)
6599                     return FALSE;
6600
6601                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
6602                               && strcmp (bfd_get_section_name (abfd, sec),
6603                                          name + 5) == 0);
6604
6605                   sreloc = bfd_get_section_by_name (dynobj, name);
6606                   if (sreloc == NULL)
6607                     {
6608                       flagword flags;
6609
6610                       sreloc = bfd_make_section (dynobj, name);
6611                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
6612                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
6613                       if ((sec->flags & SEC_ALLOC) != 0)
6614                         flags |= SEC_ALLOC | SEC_LOAD;
6615                       if (sreloc == NULL
6616                           || !bfd_set_section_flags (dynobj, sreloc, flags)
6617                           || !bfd_set_section_alignment (dynobj, sreloc, 2))
6618                         return FALSE;
6619
6620                       elf_section_type (sreloc) = SHT_RELA;
6621                     }
6622                   elf_section_data (sec)->sreloc = sreloc;
6623                 }
6624
6625               /* If this is a global symbol, we count the number of
6626                  relocations we need for this symbol.  */
6627               if (h != NULL)
6628                 head = &((struct elf_nds32_link_hash_entry *) h)->dyn_relocs;
6629               else
6630                 {
6631                   asection *s;
6632
6633                   Elf_Internal_Sym *isym;
6634                   isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx);
6635                   if (isym == NULL)
6636                     return FALSE;
6637
6638                   /* Track dynamic relocs needed for local syms too.  */
6639                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
6640                   if (s == NULL)
6641                     return FALSE;
6642
6643                   head = ((struct elf_nds32_dyn_relocs **)
6644                         &elf_section_data (s)->local_dynrel);
6645                 }
6646
6647               p = *head;
6648               if (p == NULL || p->sec != sec)
6649                 {
6650                   bfd_size_type amt = sizeof (*p);
6651                   p = (struct elf_nds32_dyn_relocs *) bfd_alloc (dynobj, amt);
6652                   if (p == NULL)
6653                     return FALSE;
6654                   p->next = *head;
6655                   *head = p;
6656                   p->sec = sec;
6657                   p->count = 0;
6658                   p->pc_count = 0;
6659                 }
6660
6661               p->count += 1;
6662               if (ELF32_R_TYPE (rel->r_info) == R_NDS32_25_PCREL_RELA
6663                   || ELF32_R_TYPE (rel->r_info) == R_NDS32_15_PCREL_RELA
6664                   || ELF32_R_TYPE (rel->r_info) == R_NDS32_17_PCREL_RELA)
6665                 p->pc_count += 1;
6666             }
6667           break;
6668
6669           /* This relocation describes the C++ object vtable hierarchy.
6670              Reconstruct it for later use during GC.  */
6671         case R_NDS32_RELA_GNU_VTINHERIT:
6672         case R_NDS32_GNU_VTINHERIT:
6673           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
6674             return FALSE;
6675           break;
6676
6677           /* This relocation describes which C++ vtable entries are actually
6678              used.  Record for later use during GC.  */
6679         case R_NDS32_GNU_VTENTRY:
6680           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
6681             return FALSE;
6682           break;
6683         case R_NDS32_RELA_GNU_VTENTRY:
6684           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
6685             return FALSE;
6686           break;
6687         }
6688     }
6689
6690   return TRUE;
6691 }
6692
6693 /* Write VAL in uleb128 format to P, returning a pointer to the
6694    following byte.
6695    This code is copied from elf-attr.c.  */
6696
6697 static bfd_byte *
6698 write_uleb128 (bfd_byte *p, unsigned int val)
6699 {
6700   bfd_byte c;
6701   do
6702     {
6703       c = val & 0x7f;
6704       val >>= 7;
6705       if (val)
6706         c |= 0x80;
6707       *(p++) = c;
6708     }
6709   while (val);
6710   return p;
6711 }
6712
6713 static bfd_signed_vma
6714 calculate_offset (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
6715                   Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr,
6716                   int *pic_ext_target)
6717 {
6718   bfd_signed_vma foff;
6719   bfd_vma symval, addend;
6720   asection *sym_sec;
6721
6722   /* Get the value of the symbol referred to by the reloc.  */
6723   if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
6724     {
6725       Elf_Internal_Sym *isym;
6726
6727       /* A local symbol.  */
6728       isym = isymbuf + ELF32_R_SYM (irel->r_info);
6729
6730       if (isym->st_shndx == SHN_UNDEF)
6731         sym_sec = bfd_und_section_ptr;
6732       else if (isym->st_shndx == SHN_ABS)
6733         sym_sec = bfd_abs_section_ptr;
6734       else if (isym->st_shndx == SHN_COMMON)
6735         sym_sec = bfd_com_section_ptr;
6736       else
6737         sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
6738       symval = isym->st_value + sym_sec->output_section->vma
6739                + sym_sec->output_offset;
6740     }
6741   else
6742     {
6743       unsigned long indx;
6744       struct elf_link_hash_entry *h;
6745       bfd *owner;
6746
6747       /* An external symbol.  */
6748       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
6749       h = elf_sym_hashes (abfd)[indx];
6750       BFD_ASSERT (h != NULL);
6751
6752       if (h->root.type != bfd_link_hash_defined
6753           && h->root.type != bfd_link_hash_defweak)
6754         /* This appears to be a reference to an undefined
6755            symbol.  Just ignore it--it will be caught by the
6756            regular reloc processing.  */
6757         return 0;
6758       owner = h->root.u.def.section->owner;
6759       if (owner && (elf_elfheader (owner)->e_flags & E_NDS32_HAS_PIC))
6760         *pic_ext_target = 1;
6761
6762       if (h->root.u.def.section->flags & SEC_MERGE)
6763         {
6764           sym_sec = h->root.u.def.section;
6765           symval = _bfd_merged_section_offset (abfd, &sym_sec,
6766                                                elf_section_data (sym_sec)->sec_info,
6767                                                h->root.u.def.value);
6768           symval = symval + sym_sec->output_section->vma
6769                    + sym_sec->output_offset;
6770         }
6771       else
6772         symval = (h->root.u.def.value
6773                   + h->root.u.def.section->output_section->vma
6774                   + h->root.u.def.section->output_offset);
6775     }
6776
6777   addend = irel->r_addend;
6778
6779   foff = (symval + addend
6780           - (irel->r_offset + sec->output_section->vma + sec->output_offset));
6781   return foff;
6782 }
6783
6784 static bfd_vma
6785 calculate_plt_memory_address (bfd *abfd, struct bfd_link_info *link_info,
6786                               Elf_Internal_Sym *isymbuf,
6787                               Elf_Internal_Rela *irel,
6788                               Elf_Internal_Shdr *symtab_hdr)
6789 {
6790   bfd_vma symval;
6791
6792   if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
6793     {
6794       Elf_Internal_Sym *isym;
6795       asection *sym_sec;
6796       /* A local symbol.  */
6797       isym = isymbuf + ELF32_R_SYM (irel->r_info);
6798
6799       if (isym->st_shndx == SHN_UNDEF)
6800         sym_sec = bfd_und_section_ptr;
6801       else if (isym->st_shndx == SHN_ABS)
6802         sym_sec = bfd_abs_section_ptr;
6803       else if (isym->st_shndx == SHN_COMMON)
6804         sym_sec = bfd_com_section_ptr;
6805       else
6806         sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
6807       symval = isym->st_value + sym_sec->output_section->vma
6808                + sym_sec->output_offset;
6809     }
6810   else
6811     {
6812       unsigned long indx;
6813       struct elf_link_hash_entry *h;
6814       struct elf_nds32_link_hash_table *htab;
6815       asection *splt;
6816
6817       /* An external symbol.  */
6818       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
6819       h = elf_sym_hashes (abfd)[indx];
6820       BFD_ASSERT (h != NULL);
6821       htab = nds32_elf_hash_table (link_info);
6822       splt = htab->splt;
6823
6824       while (h->root.type == bfd_link_hash_indirect
6825              || h->root.type == bfd_link_hash_warning)
6826         h = (struct elf_link_hash_entry *) h->root.u.i.link;
6827
6828       if (h->plt.offset == (bfd_vma) - 1)
6829         {
6830           if (h->root.type != bfd_link_hash_defined
6831               && h->root.type != bfd_link_hash_defweak)
6832             /* This appears to be a reference to an undefined
6833              * symbol.  Just ignore it--it will be caught by the
6834              * regular reloc processing.  */
6835             return 0;
6836           symval = (h->root.u.def.value
6837                     + h->root.u.def.section->output_section->vma
6838                     + h->root.u.def.section->output_offset);
6839         }
6840       else
6841         symval = splt->output_section->vma + h->plt.offset;
6842     }
6843
6844   return symval;
6845 }
6846
6847 static bfd_signed_vma
6848 calculate_plt_offset (bfd *abfd, asection *sec, struct bfd_link_info *link_info,
6849                       Elf_Internal_Sym *isymbuf, Elf_Internal_Rela *irel,
6850                       Elf_Internal_Shdr *symtab_hdr)
6851 {
6852   bfd_vma foff;
6853   if ((foff = calculate_plt_memory_address (abfd, link_info, isymbuf, irel,
6854                                             symtab_hdr)) == 0)
6855     return 0;
6856   else
6857     return foff - (irel->r_offset
6858                    + sec->output_section->vma + sec->output_offset);
6859 }
6860 \f
6861 /* Convert a 32-bit instruction to 16-bit one.
6862    INSN is the input 32-bit instruction, INSN16 is the output 16-bit
6863    instruction.  If INSN_TYPE is not NULL, it the CGEN instruction
6864    type of INSN16.  Return 1 if successful.  */
6865
6866 static int
6867 nds32_convert_32_to_16_alu1 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
6868                              int *pinsn_type)
6869 {
6870   uint16_t insn16 = 0;
6871   int insn_type = 0;
6872   unsigned long mach = bfd_get_mach (abfd);
6873
6874   if (N32_SH5 (insn) != 0)
6875     return 0;
6876
6877   switch (N32_SUB5 (insn))
6878     {
6879     case N32_ALU1_ADD_SLLI:
6880     case N32_ALU1_ADD_SRLI:
6881       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
6882         {
6883           insn16 = N16_TYPE333 (ADD333, N32_RT5 (insn), N32_RA5 (insn),
6884                                 N32_RB5 (insn));
6885           insn_type = NDS32_INSN_ADD333;
6886         }
6887       else if (N32_IS_RT4 (insn))
6888         {
6889           if (N32_RT5 (insn) == N32_RA5 (insn))
6890             insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RB5 (insn));
6891           else if (N32_RT5 (insn) == N32_RB5 (insn))
6892             insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RA5 (insn));
6893           insn_type = NDS32_INSN_ADD45;
6894         }
6895       break;
6896
6897     case N32_ALU1_SUB_SLLI:
6898     case N32_ALU1_SUB_SRLI:
6899       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
6900         {
6901           insn16 = N16_TYPE333 (SUB333, N32_RT5 (insn), N32_RA5 (insn),
6902                                 N32_RB5 (insn));
6903           insn_type = NDS32_INSN_SUB333;
6904         }
6905       else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
6906         {
6907           insn16 = N16_TYPE45 (SUB45, N32_RT54 (insn), N32_RB5 (insn));
6908           insn_type = NDS32_INSN_SUB45;
6909         }
6910       break;
6911
6912     case N32_ALU1_AND_SLLI:
6913     case N32_ALU1_AND_SRLI:
6914       /* and $rt, $rt, $rb -> and33 for v3, v3m.  */
6915       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
6916           && N32_IS_RB3 (insn))
6917         {
6918           if (N32_RT5 (insn) == N32_RA5 (insn))
6919             insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RB5 (insn));
6920           else if (N32_RT5 (insn) == N32_RB5 (insn))
6921             insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RA5 (insn));
6922           if (insn16)
6923             insn_type = NDS32_INSN_AND33;
6924         }
6925       break;
6926
6927     case N32_ALU1_XOR_SLLI:
6928     case N32_ALU1_XOR_SRLI:
6929       /* xor $rt, $rt, $rb -> xor33 for v3, v3m.  */
6930       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
6931           && N32_IS_RB3 (insn))
6932         {
6933           if (N32_RT5 (insn) == N32_RA5 (insn))
6934             insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RB5 (insn));
6935           else if (N32_RT5 (insn) == N32_RB5 (insn))
6936             insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RA5 (insn));
6937           if (insn16)
6938             insn_type = NDS32_INSN_XOR33;
6939         }
6940       break;
6941
6942     case N32_ALU1_OR_SLLI:
6943     case N32_ALU1_OR_SRLI:
6944       /* or $rt, $rt, $rb -> or33 for v3, v3m.  */
6945       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
6946           && N32_IS_RB3 (insn))
6947         {
6948           if (N32_RT5 (insn) == N32_RA5 (insn))
6949             insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RB5 (insn));
6950           else if (N32_RT5 (insn) == N32_RB5 (insn))
6951             insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RA5 (insn));
6952           if (insn16)
6953             insn_type = NDS32_INSN_OR33;
6954         }
6955       break;
6956     case N32_ALU1_NOR:
6957       /* nor $rt, $ra, $ra -> not33 for v3, v3m.  */
6958       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RB3 (insn)
6959           && N32_RA5 (insn) == N32_RB5 (insn))
6960         {
6961           insn16 = N16_MISC33 (NOT33, N32_RT5 (insn), N32_RA5 (insn));
6962           insn_type = NDS32_INSN_NOT33;
6963         }
6964       break;
6965     case N32_ALU1_SRAI:
6966       if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
6967         {
6968           insn16 = N16_TYPE45 (SRAI45, N32_RT54 (insn), N32_UB5 (insn));
6969           insn_type = NDS32_INSN_SRAI45;
6970         }
6971       break;
6972
6973     case N32_ALU1_SRLI:
6974       if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
6975         {
6976           insn16 = N16_TYPE45 (SRLI45, N32_RT54 (insn), N32_UB5 (insn));
6977           insn_type = NDS32_INSN_SRLI45;
6978         }
6979       break;
6980
6981     case N32_ALU1_SLLI:
6982       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_UB5 (insn) < 8)
6983         {
6984           insn16 = N16_TYPE333 (SLLI333, N32_RT5 (insn), N32_RA5 (insn),
6985                                 N32_UB5 (insn));
6986           insn_type = NDS32_INSN_SLLI333;
6987         }
6988       break;
6989
6990     case N32_ALU1_ZEH:
6991       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
6992         {
6993           insn16 = N16_BFMI333 (ZEH33, N32_RT5 (insn), N32_RA5 (insn));
6994           insn_type = NDS32_INSN_ZEH33;
6995         }
6996       break;
6997
6998     case N32_ALU1_SEB:
6999       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
7000         {
7001           insn16 = N16_BFMI333 (SEB33, N32_RT5 (insn), N32_RA5 (insn));
7002           insn_type = NDS32_INSN_SEB33;
7003         }
7004       break;
7005
7006     case N32_ALU1_SEH:
7007       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
7008         {
7009           insn16 = N16_BFMI333 (SEH33, N32_RT5 (insn), N32_RA5 (insn));
7010           insn_type = NDS32_INSN_SEH33;
7011         }
7012       break;
7013
7014     case N32_ALU1_SLT:
7015       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
7016         {
7017           /* Implicit r15.  */
7018           insn16 = N16_TYPE45 (SLT45, N32_RA54 (insn), N32_RB5 (insn));
7019           insn_type = NDS32_INSN_SLT45;
7020         }
7021       break;
7022
7023     case N32_ALU1_SLTS:
7024       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
7025         {
7026           /* Implicit r15.  */
7027           insn16 = N16_TYPE45 (SLTS45, N32_RA54 (insn), N32_RB5 (insn));
7028           insn_type = NDS32_INSN_SLTS45;
7029         }
7030       break;
7031     }
7032
7033   if ((insn16 & 0x8000) == 0)
7034     return 0;
7035
7036   if (pinsn16)
7037     *pinsn16 = insn16;
7038   if (pinsn_type)
7039     *pinsn_type = insn_type;
7040   return 1;
7041 }
7042
7043 static int
7044 nds32_convert_32_to_16_alu2 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
7045                              int *pinsn_type)
7046 {
7047   uint16_t insn16 = 0;
7048   int insn_type;
7049   unsigned long mach = bfd_get_mach (abfd);
7050
7051   /* TODO: bset, bclr, btgl, btst.  */
7052   if (__GF (insn, 6, 4) != 0)
7053     return 0;
7054
7055   switch (N32_IMMU (insn, 6))
7056     {
7057     case N32_ALU2_MUL:
7058       if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7059           && N32_IS_RB3 (insn))
7060         {
7061           if (N32_RT5 (insn) == N32_RA5 (insn))
7062             insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RB5 (insn));
7063           else if (N32_RT5 (insn) == N32_RB5 (insn))
7064             insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RA5 (insn));
7065           if (insn16)
7066             insn_type = NDS32_INSN_MUL33;
7067         }
7068     }
7069
7070   if ((insn16 & 0x8000) == 0)
7071     return 0;
7072
7073   if (pinsn16)
7074     *pinsn16 = insn16;
7075   if (pinsn_type)
7076     *pinsn_type = insn_type;
7077   return 1;
7078 }
7079
7080 int
7081 nds32_convert_32_to_16 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
7082                         int *pinsn_type)
7083 {
7084   int op6;
7085   uint16_t insn16 = 0;
7086   int insn_type;
7087   unsigned long mach = bfd_get_mach (abfd);
7088
7089   /* Decode 32-bit instruction.  */
7090   if (insn & 0x80000000)
7091     {
7092       /* Not 32-bit insn.  */
7093       return 0;
7094     }
7095
7096   op6 = N32_OP6 (insn);
7097
7098   /* Convert it to 16-bit instruction.  */
7099   switch (op6)
7100     {
7101     case N32_OP6_MOVI:
7102       if (IS_WITHIN_S (N32_IMM20S (insn), 5))
7103         {
7104           insn16 = N16_TYPE55 (MOVI55, N32_RT5 (insn), N32_IMM20S (insn));
7105           insn_type = NDS32_INSN_MOVI55;
7106         }
7107       else if (mach >= MACH_V3 && N32_IMM20S (insn) >= 16
7108                && N32_IMM20S (insn) < 48 && N32_IS_RT4 (insn))
7109         {
7110           insn16 = N16_TYPE45 (MOVPI45, N32_RT54 (insn),
7111                                N32_IMM20S (insn) - 16);
7112           insn_type = NDS32_INSN_MOVPI45;
7113         }
7114       break;
7115
7116     case N32_OP6_ADDI:
7117       if (N32_IMM15S (insn) == 0)
7118         {
7119           /* Do not convert `addi $sp, $sp, 0' to `mov55 $sp, $sp',
7120              because `mov55 $sp, $sp' is ifret16 in V3 ISA.  */
7121           if (mach <= MACH_V2
7122               || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
7123             {
7124               insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
7125               insn_type = NDS32_INSN_MOV55;
7126             }
7127         }
7128       else if (N32_IMM15S (insn) > 0)
7129         {
7130           if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) < 8)
7131             {
7132               insn16 = N16_TYPE333 (ADDI333, N32_RT5 (insn), N32_RA5 (insn),
7133                                     N32_IMM15S (insn));
7134               insn_type = NDS32_INSN_ADDI333;
7135             }
7136           else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
7137                    && N32_IMM15S (insn) < 32)
7138             {
7139               insn16 = N16_TYPE45 (ADDI45, N32_RT54 (insn), N32_IMM15S (insn));
7140               insn_type = NDS32_INSN_ADDI45;
7141             }
7142           else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
7143                    && N32_RT5 (insn) == N32_RA5 (insn)
7144                    && N32_IMM15S (insn) < 512)
7145             {
7146               insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
7147               insn_type = NDS32_INSN_ADDI10_SP;
7148             }
7149           else if (mach >= MACH_V3 && N32_IS_RT3 (insn)
7150                    && N32_RA5 (insn) == REG_SP && N32_IMM15S (insn) < 256
7151                    && (N32_IMM15S (insn) % 4 == 0))
7152             {
7153               insn16 = N16_TYPE36 (ADDRI36_SP, N32_RT5 (insn),
7154                                    N32_IMM15S (insn) >> 2);
7155               insn_type = NDS32_INSN_ADDRI36_SP;
7156             }
7157         }
7158       else
7159         {
7160           /* Less than 0.  */
7161           if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) > -8)
7162             {
7163               insn16 = N16_TYPE333 (SUBI333, N32_RT5 (insn), N32_RA5 (insn),
7164                                     0 - N32_IMM15S (insn));
7165               insn_type = NDS32_INSN_SUBI333;
7166             }
7167           else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
7168                    && N32_IMM15S (insn) > -32)
7169             {
7170               insn16 = N16_TYPE45 (SUBI45, N32_RT54 (insn),
7171                                    0 - N32_IMM15S (insn));
7172               insn_type = NDS32_INSN_SUBI45;
7173             }
7174           else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
7175                    && N32_RT5 (insn) == N32_RA5 (insn)
7176                    && N32_IMM15S (insn) >= -512)
7177             {
7178               insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
7179               insn_type = NDS32_INSN_ADDI10_SP;
7180             }
7181         }
7182       break;
7183
7184     case N32_OP6_ORI:
7185       if (N32_IMM15S (insn) == 0)
7186         {
7187           /* Do not convert `ori $sp, $sp, 0' to `mov55 $sp, $sp',
7188              because `mov55 $sp, $sp' is ifret16 in V3 ISA.  */
7189           if (mach <= MACH_V2
7190               || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
7191             {
7192               insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
7193               insn_type = NDS32_INSN_MOV55;
7194             }
7195         }
7196       break;
7197
7198     case N32_OP6_SUBRI:
7199       if (mach >= MACH_V3 && N32_IS_RT3 (insn)
7200           && N32_IS_RA3 (insn) && N32_IMM15S (insn) == 0)
7201         {
7202           insn16 = N16_MISC33 (NEG33, N32_RT5 (insn), N32_RA5 (insn));
7203           insn_type = NDS32_INSN_NEG33;
7204         }
7205       break;
7206
7207     case N32_OP6_ANDI:
7208       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
7209         {
7210           if (N32_IMM15U (insn) == 1)
7211             {
7212               insn16 = N16_BFMI333 (XLSB33, N32_RT5 (insn), N32_RA5 (insn));
7213               insn_type = NDS32_INSN_XLSB33;
7214             }
7215           else if (N32_IMM15U (insn) == 0x7ff)
7216             {
7217               insn16 = N16_BFMI333 (X11B33, N32_RT5 (insn), N32_RA5 (insn));
7218               insn_type = NDS32_INSN_X11B33;
7219             }
7220           else if (N32_IMM15U (insn) == 0xff)
7221             {
7222               insn16 = N16_BFMI333 (ZEB33, N32_RT5 (insn), N32_RA5 (insn));
7223               insn_type = NDS32_INSN_ZEB33;
7224             }
7225           else if (mach >= MACH_V3 && N32_RT5 (insn) == N32_RA5 (insn)
7226                    && N32_IMM15U (insn) < 256)
7227             {
7228               int imm15u = N32_IMM15U (insn);
7229
7230               if (__builtin_popcount (imm15u) == 1)
7231                 {
7232                   /* BMSKI33 */
7233                   int imm3u = __builtin_ctz (imm15u);
7234
7235                   insn16 = N16_BFMI333 (BMSKI33, N32_RT5 (insn), imm3u);
7236                   insn_type = NDS32_INSN_BMSKI33;
7237                 }
7238               else if (imm15u != 0 && __builtin_popcount (imm15u + 1) == 1)
7239                 {
7240                   /* FEXTI33 */
7241                   int imm3u = __builtin_ctz (imm15u + 1) - 1;
7242
7243                   insn16 = N16_BFMI333 (FEXTI33, N32_RT5 (insn), imm3u);
7244                   insn_type = NDS32_INSN_FEXTI33;
7245                 }
7246             }
7247         }
7248       break;
7249
7250     case N32_OP6_SLTI:
7251       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
7252           && IS_WITHIN_U (N32_IMM15S (insn), 5))
7253         {
7254           insn16 = N16_TYPE45 (SLTI45, N32_RA54 (insn), N32_IMM15S (insn));
7255           insn_type = NDS32_INSN_SLTI45;
7256         }
7257       break;
7258
7259     case N32_OP6_SLTSI:
7260       if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
7261           && IS_WITHIN_U (N32_IMM15S (insn), 5))
7262         {
7263           insn16 = N16_TYPE45 (SLTSI45, N32_RA54 (insn), N32_IMM15S (insn));
7264           insn_type = NDS32_INSN_SLTSI45;
7265         }
7266       break;
7267
7268     case N32_OP6_LWI:
7269       if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
7270         {
7271           insn16 = N16_TYPE45 (LWI450, N32_RT54 (insn), N32_RA5 (insn));
7272           insn_type = NDS32_INSN_LWI450;
7273         }
7274       else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7275                && IS_WITHIN_U (N32_IMM15S (insn), 3))
7276         {
7277           insn16 = N16_TYPE333 (LWI333, N32_RT5 (insn), N32_RA5 (insn),
7278                                 N32_IMM15S (insn));
7279           insn_type = NDS32_INSN_LWI333;
7280         }
7281       else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
7282                && IS_WITHIN_U (N32_IMM15S (insn), 7))
7283         {
7284           insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
7285           insn_type = NDS32_INSN_LWI37;
7286         }
7287       else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
7288                && IS_WITHIN_U (N32_IMM15S (insn), 7))
7289         {
7290           insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 0, N32_IMM15S (insn));
7291           insn_type = NDS32_INSN_LWI37_SP;
7292         }
7293       else if (mach >= MACH_V2 && N32_IS_RT4 (insn) && N32_RA5 (insn) == REG_R8
7294                && -32 <= N32_IMM15S (insn) && N32_IMM15S (insn) < 0)
7295         {
7296           insn16 = N16_TYPE45 (LWI45_FE, N32_RT54 (insn),
7297                                N32_IMM15S (insn) + 32);
7298           insn_type = NDS32_INSN_LWI45_FE;
7299         }
7300       break;
7301
7302     case N32_OP6_SWI:
7303       if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
7304         {
7305           insn16 = N16_TYPE45 (SWI450, N32_RT54 (insn), N32_RA5 (insn));
7306           insn_type = NDS32_INSN_SWI450;
7307         }
7308       else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7309                && IS_WITHIN_U (N32_IMM15S (insn), 3))
7310         {
7311           insn16 = N16_TYPE333 (SWI333, N32_RT5 (insn), N32_RA5 (insn),
7312                                 N32_IMM15S (insn));
7313           insn_type = NDS32_INSN_SWI333;
7314         }
7315       else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
7316                && IS_WITHIN_U (N32_IMM15S (insn), 7))
7317         {
7318           insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
7319           insn_type = NDS32_INSN_SWI37;
7320         }
7321       else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
7322                && IS_WITHIN_U (N32_IMM15S (insn), 7))
7323         {
7324           insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 1, N32_IMM15S (insn));
7325           insn_type = NDS32_INSN_SWI37_SP;
7326         }
7327       break;
7328
7329     case N32_OP6_LWI_BI:
7330       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7331           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7332         {
7333           insn16 = N16_TYPE333 (LWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
7334                                 N32_IMM15S (insn));
7335           insn_type = NDS32_INSN_LWI333_BI;
7336         }
7337       break;
7338
7339     case N32_OP6_SWI_BI:
7340       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7341           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7342         {
7343           insn16 = N16_TYPE333 (SWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
7344                                 N32_IMM15S (insn));
7345           insn_type = NDS32_INSN_SWI333_BI;
7346         }
7347       break;
7348
7349     case N32_OP6_LHI:
7350       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7351           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7352         {
7353           insn16 = N16_TYPE333 (LHI333, N32_RT5 (insn), N32_RA5 (insn),
7354                                 N32_IMM15S (insn));
7355           insn_type = NDS32_INSN_LHI333;
7356         }
7357       break;
7358
7359     case N32_OP6_SHI:
7360       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7361           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7362         {
7363           insn16 = N16_TYPE333 (SHI333, N32_RT5 (insn), N32_RA5 (insn),
7364                                 N32_IMM15S (insn));
7365           insn_type = NDS32_INSN_SHI333;
7366         }
7367       break;
7368
7369     case N32_OP6_LBI:
7370       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7371           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7372         {
7373           insn16 = N16_TYPE333 (LBI333, N32_RT5 (insn), N32_RA5 (insn),
7374                                 N32_IMM15S (insn));
7375           insn_type = NDS32_INSN_LBI333;
7376         }
7377       break;
7378
7379     case N32_OP6_SBI:
7380       if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
7381           && IS_WITHIN_U (N32_IMM15S (insn), 3))
7382         {
7383           insn16 = N16_TYPE333 (SBI333, N32_RT5 (insn), N32_RA5 (insn),
7384                                 N32_IMM15S (insn));
7385           insn_type = NDS32_INSN_SBI333;
7386         }
7387       break;
7388
7389     case N32_OP6_ALU1:
7390       return nds32_convert_32_to_16_alu1 (abfd, insn, pinsn16, pinsn_type);
7391
7392     case N32_OP6_ALU2:
7393       return nds32_convert_32_to_16_alu2 (abfd, insn, pinsn16, pinsn_type);
7394
7395     case N32_OP6_BR1:
7396       if (!IS_WITHIN_S (N32_IMM14S (insn), 8))
7397         goto done;
7398
7399       if ((insn & __BIT (14)) == 0)
7400         {
7401           /* N32_BR1_BEQ */
7402           if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
7403               && N32_RT5 (insn) != REG_R5)
7404             insn16 = N16_TYPE38 (BEQS38, N32_RT5 (insn), N32_IMM14S (insn));
7405           else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
7406                    && N32_RA5 (insn) != REG_R5)
7407             insn16 = N16_TYPE38 (BEQS38, N32_RA5 (insn), N32_IMM14S (insn));
7408           insn_type = NDS32_INSN_BEQS38;
7409           break;
7410         }
7411       else
7412         {
7413           /* N32_BR1_BNE */
7414           if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
7415               && N32_RT5 (insn) != REG_R5)
7416             insn16 = N16_TYPE38 (BNES38, N32_RT5 (insn), N32_IMM14S (insn));
7417           else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
7418                    && N32_RA5 (insn) != REG_R5)
7419             insn16 = N16_TYPE38 (BNES38, N32_RA5 (insn), N32_IMM14S (insn));
7420           insn_type = NDS32_INSN_BNES38;
7421           break;
7422         }
7423       break;
7424
7425     case N32_OP6_BR2:
7426       switch (N32_BR2_SUB (insn))
7427         {
7428         case N32_BR2_BEQZ:
7429           if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
7430             {
7431               insn16 = N16_TYPE38 (BEQZ38, N32_RT5 (insn), N32_IMM16S (insn));
7432               insn_type = NDS32_INSN_BEQZ38;
7433             }
7434           else if (N32_RT5 (insn) == REG_R15
7435                    && IS_WITHIN_S (N32_IMM16S (insn), 8))
7436             {
7437               insn16 = N16_TYPE8 (BEQZS8, N32_IMM16S (insn));
7438               insn_type = NDS32_INSN_BEQZS8;
7439             }
7440           break;
7441
7442         case N32_BR2_BNEZ:
7443           if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
7444             {
7445               insn16 = N16_TYPE38 (BNEZ38, N32_RT5 (insn), N32_IMM16S (insn));
7446               insn_type = NDS32_INSN_BNEZ38;
7447             }
7448           else if (N32_RT5 (insn) == REG_R15
7449                    && IS_WITHIN_S (N32_IMM16S (insn), 8))
7450             {
7451               insn16 = N16_TYPE8 (BNEZS8, N32_IMM16S (insn));
7452               insn_type = NDS32_INSN_BNEZS8;
7453             }
7454           break;
7455
7456         case N32_BR2_IFCALL:
7457           if (IS_WITHIN_U (N32_IMM16S (insn), 9))
7458             {
7459               insn16 = N16_TYPE9 (IFCALL9, N32_IMM16S (insn));
7460               insn_type = NDS32_INSN_IFCALL9;
7461             }
7462           break;
7463         }
7464       break;
7465
7466     case N32_OP6_JI:
7467       if ((insn & __BIT (24)) == 0)
7468         {
7469           /* N32_JI_J */
7470           if (IS_WITHIN_S (N32_IMM24S (insn), 8))
7471             {
7472               insn16 = N16_TYPE8 (J8, N32_IMM24S (insn));
7473               insn_type = NDS32_INSN_J8;
7474             }
7475         }
7476       break;
7477
7478     case N32_OP6_JREG:
7479       if (__GF (insn, 8, 2) != 0)
7480         goto done;
7481
7482       switch (N32_IMMU (insn, 5))
7483         {
7484         case N32_JREG_JR:
7485           if (N32_JREG_HINT (insn) == 0)
7486             {
7487               /* jr */
7488               insn16 = N16_TYPE5 (JR5, N32_RB5 (insn));
7489               insn_type = NDS32_INSN_JR5;
7490             }
7491           else if (N32_JREG_HINT (insn) == 1)
7492             {
7493               /* ret */
7494               insn16 = N16_TYPE5 (RET5, N32_RB5 (insn));
7495               insn_type = NDS32_INSN_RET5;
7496             }
7497           else if (N32_JREG_HINT (insn) == 3)
7498             {
7499               /* ifret = mov55 $sp, $sp */
7500               insn16 = N16_TYPE55 (MOV55, REG_SP, REG_SP);
7501               insn_type = NDS32_INSN_IFRET;
7502             }
7503           break;
7504
7505         case N32_JREG_JRAL:
7506           /* It's convertible when return rt5 is $lp and address
7507              translation is kept.  */
7508           if (N32_RT5 (insn) == REG_LP && N32_JREG_HINT (insn) == 0)
7509             {
7510               insn16 = N16_TYPE5 (JRAL5, N32_RB5 (insn));
7511               insn_type = NDS32_INSN_JRAL5;
7512             }
7513           break;
7514         }
7515       break;
7516
7517     case N32_OP6_MISC:
7518       if (N32_SUB5 (insn) == N32_MISC_BREAK && N32_SWID (insn) < 32)
7519         {
7520           /* For v3, swid above 31 are used for ex9.it.  */
7521           insn16 = N16_TYPE5 (BREAK16, N32_SWID (insn));
7522           insn_type = NDS32_INSN_BREAK16;
7523         }
7524       break;
7525
7526     default:
7527       /* This instruction has no 16-bit variant.  */
7528       goto done;
7529     }
7530
7531 done:
7532   /* Bit-15 of insn16 should be set for a valid instruction.  */
7533   if ((insn16 & 0x8000) == 0)
7534     return 0;
7535
7536   if (pinsn16)
7537     *pinsn16 = insn16;
7538   if (pinsn_type)
7539     *pinsn_type = insn_type;
7540   return 1;
7541 }
7542
7543 static int
7544 special_convert_32_to_16 (unsigned long insn, uint16_t *pinsn16,
7545                           Elf_Internal_Rela *reloc)
7546 {
7547   uint16_t insn16 = 0;
7548
7549   if ((reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG) == 0
7550       || (ELF32_R_TYPE (reloc->r_info) != R_NDS32_INSN16))
7551     return 0;
7552
7553   if (!N32_IS_RT3 (insn))
7554     return 0;
7555
7556   switch (N32_OP6 (insn))
7557     {
7558     case N32_OP6_LWI:
7559       if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
7560         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
7561       break;
7562     case N32_OP6_SWI:
7563       if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
7564         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
7565       break;
7566     case N32_OP6_HWGP:
7567       if (!IS_WITHIN_U (N32_IMM17S (insn), 7))
7568         break;
7569
7570       if (__GF (insn, 17, 3) == 6)
7571         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM17S (insn));
7572       else if (__GF (insn, 17, 3) == 7)
7573         insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM17S (insn));
7574       break;
7575     }
7576
7577   if ((insn16 & 0x8000) == 0)
7578     return 0;
7579
7580   *pinsn16 = insn16;
7581   return 1;
7582 }
7583
7584 /* Convert a 16-bit instruction to 32-bit one.
7585    INSN16 it the input and PINSN it the point to output.
7586    Return non-zero on successful.  Otherwise 0 is returned.  */
7587
7588 int
7589 nds32_convert_16_to_32 (bfd *abfd, uint16_t insn16, uint32_t *pinsn)
7590 {
7591   uint32_t insn = 0xffffffff;
7592   unsigned long mach = bfd_get_mach (abfd);
7593
7594   /* NOTE: push25, pop25 and movd44 do not have 32-bit variants.  */
7595
7596   switch (__GF (insn16, 9, 6))
7597     {
7598     case 0x4:                   /* add45 */
7599       insn = N32_ALU1 (ADD, N16_RT4 (insn16), N16_RT4 (insn16),
7600                        N16_RA5 (insn16));
7601       goto done;
7602     case 0x5:                   /* sub45 */
7603       insn = N32_ALU1 (SUB, N16_RT4 (insn16), N16_RT4 (insn16),
7604                        N16_RA5 (insn16));
7605       goto done;
7606     case 0x6:                   /* addi45 */
7607       insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16),
7608                         N16_IMM5U (insn16));
7609       goto done;
7610     case 0x7:                   /* subi45 */
7611       insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16),
7612                         -N16_IMM5U (insn16));
7613       goto done;
7614     case 0x8:                   /* srai45 */
7615       insn = N32_ALU1 (SRAI, N16_RT4 (insn16), N16_RT4 (insn16),
7616                        N16_IMM5U (insn16));
7617       goto done;
7618     case 0x9:                   /* srli45 */
7619       insn = N32_ALU1 (SRLI, N16_RT4 (insn16), N16_RT4 (insn16),
7620                        N16_IMM5U (insn16));
7621       goto done;
7622     case 0xa:                   /* slli333 */
7623       insn = N32_ALU1 (SLLI, N16_RT3 (insn16), N16_RA3 (insn16),
7624                        N16_IMM3U (insn16));
7625       goto done;
7626     case 0xc:                   /* add333 */
7627       insn = N32_ALU1 (ADD, N16_RT3 (insn16), N16_RA3 (insn16),
7628                        N16_RB3 (insn16));
7629       goto done;
7630     case 0xd:                   /* sub333 */
7631       insn = N32_ALU1 (SUB, N16_RT3 (insn16), N16_RA3 (insn16),
7632                        N16_RB3 (insn16));
7633       goto done;
7634     case 0xe:                   /* addi333 */
7635       insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16),
7636                         N16_IMM3U (insn16));
7637       goto done;
7638     case 0xf:                   /* subi333 */
7639       insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16),
7640                         -N16_IMM3U (insn16));
7641       goto done;
7642     case 0x10:                  /* lwi333 */
7643       insn = N32_TYPE2 (LWI, N16_RT3 (insn16), N16_RA3 (insn16),
7644                         N16_IMM3U (insn16));
7645       goto done;
7646     case 0x12:                  /* lhi333 */
7647       insn = N32_TYPE2 (LHI, N16_RT3 (insn16), N16_RA3 (insn16),
7648                         N16_IMM3U (insn16));
7649       goto done;
7650     case 0x13:                  /* lbi333 */
7651       insn = N32_TYPE2 (LBI, N16_RT3 (insn16), N16_RA3 (insn16),
7652                         N16_IMM3U (insn16));
7653       goto done;
7654     case 0x11:                  /* lwi333.bi */
7655       insn = N32_TYPE2 (LWI_BI, N16_RT3 (insn16), N16_RA3 (insn16),
7656                         N16_IMM3U (insn16));
7657       goto done;
7658     case 0x14:                  /* swi333 */
7659       insn = N32_TYPE2 (SWI, N16_RT3 (insn16), N16_RA3 (insn16),
7660                         N16_IMM3U (insn16));
7661       goto done;
7662     case 0x16:                  /* shi333 */
7663       insn = N32_TYPE2 (SHI, N16_RT3 (insn16), N16_RA3 (insn16),
7664                         N16_IMM3U (insn16));
7665       goto done;
7666     case 0x17:                  /* sbi333 */
7667       insn = N32_TYPE2 (SBI, N16_RT3 (insn16), N16_RA3 (insn16),
7668                         N16_IMM3U (insn16));
7669       goto done;
7670     case 0x15:                  /* swi333.bi */
7671       insn = N32_TYPE2 (SWI_BI, N16_RT3 (insn16), N16_RA3 (insn16),
7672                         N16_IMM3U (insn16));
7673       goto done;
7674     case 0x18:                  /* addri36.sp */
7675       insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), REG_SP,
7676                         N16_IMM6U (insn16) << 2);
7677       goto done;
7678     case 0x19:                  /* lwi45.fe */
7679       insn = N32_TYPE2 (LWI, N16_RT4 (insn16), REG_R8,
7680                         (N16_IMM5U (insn16) - 32));
7681       goto done;
7682     case 0x1a:                  /* lwi450 */
7683       insn = N32_TYPE2 (LWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
7684       goto done;
7685     case 0x1b:                  /* swi450 */
7686       insn = N32_TYPE2 (SWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
7687       goto done;
7688
7689       /* These are r15 implied instructions.  */
7690     case 0x30:                  /* slts45 */
7691       insn = N32_ALU1 (SLTS, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
7692       goto done;
7693     case 0x31:                  /* slt45 */
7694       insn = N32_ALU1 (SLT, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
7695       goto done;
7696     case 0x32:                  /* sltsi45 */
7697       insn = N32_TYPE2 (SLTSI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
7698       goto done;
7699     case 0x33:                  /* slti45 */
7700       insn = N32_TYPE2 (SLTI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
7701       goto done;
7702     case 0x34:                  /* beqzs8, bnezs8 */
7703       if (insn16 & __BIT (8))
7704         insn = N32_BR2 (BNEZ, REG_TA, N16_IMM8S (insn16));
7705       else
7706         insn = N32_BR2 (BEQZ, REG_TA, N16_IMM8S (insn16));
7707       goto done;
7708
7709     case 0x35:                  /* break16, ex9.it */
7710       /* Only consider range of v3 break16.  */
7711       insn = N32_TYPE0 (MISC, (N16_IMM5U (insn16) << 5) | N32_MISC_BREAK);
7712       goto done;
7713
7714     case 0x3c:                  /* ifcall9 */
7715       insn = N32_BR2 (IFCALL, 0, N16_IMM9U (insn16));
7716       goto done;
7717     case 0x3d:                  /* movpi45 */
7718       insn = N32_TYPE1 (MOVI, N16_RT4 (insn16), N16_IMM5U (insn16) + 16);
7719       goto done;
7720
7721     case 0x3f:                  /* MISC33 */
7722       switch (insn16 & 0x7)
7723         {
7724         case 2:                 /* neg33 */
7725           insn = N32_TYPE2 (SUBRI, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7726           break;
7727         case 3:                 /* not33 */
7728           insn = N32_ALU1 (NOR, N16_RT3 (insn16), N16_RA3 (insn16),
7729                            N16_RA3 (insn16));
7730           break;
7731         case 4:                 /* mul33 */
7732           insn = N32_ALU2 (MUL, N16_RT3 (insn16), N16_RT3 (insn16),
7733                            N16_RA3 (insn16));
7734           break;
7735         case 5:                 /* xor33 */
7736           insn = N32_ALU1 (XOR, N16_RT3 (insn16), N16_RT3 (insn16),
7737                            N16_RA3 (insn16));
7738           break;
7739         case 6:                 /* and33 */
7740           insn = N32_ALU1 (AND, N16_RT3 (insn16), N16_RT3 (insn16),
7741                            N16_RA3 (insn16));
7742           break;
7743         case 7:                 /* or33 */
7744           insn = N32_ALU1 (OR, N16_RT3 (insn16), N16_RT3 (insn16),
7745                            N16_RA3 (insn16));
7746           break;
7747         }
7748       goto done;
7749
7750     case 0xb:
7751       switch (insn16 & 0x7)
7752         {
7753         case 0:                 /* zeb33 */
7754           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0xff);
7755           break;
7756         case 1:                 /* zeh33 */
7757           insn = N32_ALU1 (ZEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7758           break;
7759         case 2:                 /* seb33 */
7760           insn = N32_ALU1 (SEB, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7761           break;
7762         case 3:                 /* seh33 */
7763           insn = N32_ALU1 (SEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
7764           break;
7765         case 4:                 /* xlsb33 */
7766           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 1);
7767           break;
7768         case 5:                 /* x11b33 */
7769           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0x7ff);
7770           break;
7771         case 6:                 /* bmski33 */
7772           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
7773                             1 << __GF (insn16, 3, 3));
7774           break;
7775         case 7:                 /* fexti33 */
7776           insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
7777                             (1 << (__GF (insn16, 3, 3) + 1)) - 1);
7778           break;
7779         }
7780       goto done;
7781     }
7782
7783   switch (__GF (insn16, 10, 5))
7784     {
7785     case 0x0:                   /* mov55 or ifret16 */
7786       if (mach >= MACH_V3 && N16_RT5 (insn16) == REG_SP
7787           && N16_RT5 (insn16) == N16_RA5 (insn16))
7788         insn = N32_JREG (JR, 0, 0, 0, 3);
7789       else
7790         insn = N32_TYPE2 (ADDI, N16_RT5 (insn16), N16_RA5 (insn16), 0);
7791       goto done;
7792     case 0x1:                   /* movi55 */
7793       insn = N32_TYPE1 (MOVI, N16_RT5 (insn16), N16_IMM5S (insn16));
7794       goto done;
7795     case 0x1b:                  /* addi10s (V2) */
7796       insn = N32_TYPE2 (ADDI, REG_SP, REG_SP, N16_IMM10S (insn16));
7797       goto done;
7798     }
7799
7800   switch (__GF (insn16, 11, 4))
7801     {
7802     case 0x7:                   /* lwi37.fp/swi37.fp */
7803       if (insn16 & __BIT (7))   /* swi37.fp */
7804         insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
7805       else                      /* lwi37.fp */
7806         insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
7807       goto done;
7808     case 0x8:                   /* beqz38 */
7809       insn = N32_BR2 (BEQZ, N16_RT38 (insn16), N16_IMM8S (insn16));
7810       goto done;
7811     case 0x9:                   /* bnez38 */
7812       insn = N32_BR2 (BNEZ, N16_RT38 (insn16), N16_IMM8S (insn16));
7813       goto done;
7814     case 0xa:                   /* beqs38/j8, implied r5 */
7815       if (N16_RT38 (insn16) == 5)
7816         insn = N32_JI (J, N16_IMM8S (insn16));
7817       else
7818         insn = N32_BR1 (BEQ, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
7819       goto done;
7820     case 0xb:                   /* bnes38 and others */
7821       if (N16_RT38 (insn16) == 5)
7822         {
7823           switch (__GF (insn16, 5, 3))
7824             {
7825             case 0:             /* jr5 */
7826               insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 0);
7827               break;
7828             case 4:             /* ret5 */
7829               insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 1);
7830               break;
7831             case 1:             /* jral5 */
7832               insn = N32_JREG (JRAL, REG_LP, N16_RA5 (insn16), 0, 0);
7833               break;
7834             case 2:             /* ex9.it imm5 */
7835               /* ex9.it had no 32-bit variantl.  */
7836               break;
7837             case 5:             /* add5.pc */
7838               /* add5.pc had no 32-bit variantl.  */
7839               break;
7840             }
7841         }
7842       else                      /* bnes38 */
7843         insn = N32_BR1 (BNE, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
7844       goto done;
7845     case 0xe:                   /* lwi37/swi37 */
7846       if (insn16 & (1 << 7))    /* swi37.sp */
7847         insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
7848       else                      /* lwi37.sp */
7849         insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
7850       goto done;
7851     }
7852
7853 done:
7854   if (insn & 0x80000000)
7855     return 0;
7856
7857   if (pinsn)
7858     *pinsn = insn;
7859   return 1;
7860 }
7861 \f
7862 static bfd_boolean
7863 is_sda_access_insn (unsigned long insn)
7864 {
7865   switch (N32_OP6 (insn))
7866     {
7867     case N32_OP6_LWI:
7868     case N32_OP6_LHI:
7869     case N32_OP6_LHSI:
7870     case N32_OP6_LBI:
7871     case N32_OP6_LBSI:
7872     case N32_OP6_SWI:
7873     case N32_OP6_SHI:
7874     case N32_OP6_SBI:
7875     case N32_OP6_LWC:
7876     case N32_OP6_LDC:
7877     case N32_OP6_SWC:
7878     case N32_OP6_SDC:
7879       return TRUE;
7880     default:
7881       ;
7882     }
7883   return FALSE;
7884 }
7885
7886 static unsigned long
7887 turn_insn_to_sda_access (uint32_t insn, bfd_signed_vma type, uint32_t *pinsn)
7888 {
7889   uint32_t oinsn = 0;
7890
7891   switch (type)
7892     {
7893     case R_NDS32_GOT_LO12:
7894     case R_NDS32_GOTOFF_LO12:
7895     case R_NDS32_PLTREL_LO12:
7896     case R_NDS32_PLT_GOTREL_LO12:
7897     case R_NDS32_LO12S0_RELA:
7898       switch (N32_OP6 (insn))
7899         {
7900         case N32_OP6_LBI:
7901           /* lbi.gp */
7902           oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0);
7903           break;
7904         case N32_OP6_LBSI:
7905           /* lbsi.gp */
7906           oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), __BIT (19));
7907           break;
7908         case N32_OP6_SBI:
7909           /* sbi.gp */
7910           oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0);
7911           break;
7912         case N32_OP6_ORI:
7913           /* addi.gp */
7914           oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19));
7915           break;
7916         }
7917       break;
7918
7919     case R_NDS32_LO12S1_RELA:
7920       switch (N32_OP6 (insn))
7921         {
7922         case N32_OP6_LHI:
7923           /* lhi.gp */
7924           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0);
7925           break;
7926         case N32_OP6_LHSI:
7927           /* lhsi.gp */
7928           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (18));
7929           break;
7930         case N32_OP6_SHI:
7931           /* shi.gp */
7932           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (19));
7933           break;
7934         }
7935       break;
7936
7937     case R_NDS32_LO12S2_RELA:
7938       switch (N32_OP6 (insn))
7939         {
7940         case N32_OP6_LWI:
7941           /* lwi.gp */
7942           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
7943           break;
7944         case N32_OP6_SWI:
7945           /* swi.gp */
7946           oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3));
7947           break;
7948         }
7949       break;
7950
7951     case R_NDS32_LO12S2_DP_RELA:
7952     case R_NDS32_LO12S2_SP_RELA:
7953       oinsn = (insn & 0x7ff07000) | (REG_GP << 15);
7954       break;
7955     }
7956
7957   if (oinsn)
7958     *pinsn = oinsn;
7959
7960   return oinsn != 0;
7961 }
7962
7963 /* Linker hasn't found the correct merge section for non-section symbol
7964    in relax time, this work is left to the function elf_link_input_bfd().
7965    So for non-section symbol, _bfd_merged_section_offset is also needed
7966    to find the correct symbol address.  */
7967
7968 static bfd_vma
7969 nds32_elf_rela_local_sym (bfd *abfd, Elf_Internal_Sym *sym,
7970                           asection **psec, Elf_Internal_Rela *rel)
7971 {
7972   asection *sec = *psec;
7973   bfd_vma relocation;
7974
7975   relocation = (sec->output_section->vma
7976                 + sec->output_offset + sym->st_value);
7977   if ((sec->flags & SEC_MERGE) && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
7978     {
7979       if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
7980         rel->r_addend =
7981           _bfd_merged_section_offset (abfd, psec,
7982                                       elf_section_data (sec)->sec_info,
7983                                       sym->st_value + rel->r_addend);
7984       else
7985         rel->r_addend =
7986           _bfd_merged_section_offset (abfd, psec,
7987                                       elf_section_data (sec)->sec_info,
7988                                       sym->st_value) + rel->r_addend;
7989
7990       if (sec != *psec)
7991         {
7992           /* If we have changed the section, and our original section is
7993              marked with SEC_EXCLUDE, it means that the original
7994              SEC_MERGE section has been completely subsumed in some
7995              other SEC_MERGE section.  In this case, we need to leave
7996              some info around for --emit-relocs.  */
7997           if ((sec->flags & SEC_EXCLUDE) != 0)
7998             sec->kept_section = *psec;
7999           sec = *psec;
8000         }
8001       rel->r_addend -= relocation;
8002       rel->r_addend += sec->output_section->vma + sec->output_offset;
8003     }
8004   return relocation;
8005 }
8006
8007 static bfd_vma
8008 calculate_memory_address (bfd *abfd, Elf_Internal_Rela *irel,
8009                           Elf_Internal_Sym *isymbuf,
8010                           Elf_Internal_Shdr *symtab_hdr)
8011 {
8012   bfd_signed_vma foff;
8013   bfd_vma symval, addend;
8014   Elf_Internal_Rela irel_fn;
8015   Elf_Internal_Sym *isym;
8016   asection *sym_sec;
8017
8018   /* Get the value of the symbol referred to by the reloc.  */
8019   if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
8020     {
8021       /* A local symbol.  */
8022       isym = isymbuf + ELF32_R_SYM (irel->r_info);
8023
8024       if (isym->st_shndx == SHN_UNDEF)
8025         sym_sec = bfd_und_section_ptr;
8026       else if (isym->st_shndx == SHN_ABS)
8027         sym_sec = bfd_abs_section_ptr;
8028       else if (isym->st_shndx == SHN_COMMON)
8029         sym_sec = bfd_com_section_ptr;
8030       else
8031         sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
8032       memcpy (&irel_fn, irel, sizeof (Elf_Internal_Rela));
8033       symval = nds32_elf_rela_local_sym (abfd, isym, &sym_sec, &irel_fn);
8034       addend = irel_fn.r_addend;
8035     }
8036   else
8037     {
8038       unsigned long indx;
8039       struct elf_link_hash_entry *h;
8040
8041       /* An external symbol.  */
8042       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
8043       h = elf_sym_hashes (abfd)[indx];
8044       BFD_ASSERT (h != NULL);
8045
8046       while (h->root.type == bfd_link_hash_indirect
8047              || h->root.type == bfd_link_hash_warning)
8048         h = (struct elf_link_hash_entry *) h->root.u.i.link;
8049
8050       if (h->root.type != bfd_link_hash_defined
8051           && h->root.type != bfd_link_hash_defweak)
8052         /* This appears to be a reference to an undefined
8053            symbol.  Just ignore it--it will be caught by the
8054            regular reloc processing.  */
8055         return 0;
8056
8057       if (h->root.u.def.section->flags & SEC_MERGE)
8058         {
8059           sym_sec = h->root.u.def.section;
8060           symval = _bfd_merged_section_offset (abfd, &sym_sec, elf_section_data
8061                                                (sym_sec)->sec_info, h->root.u.def.value);
8062           symval = symval + sym_sec->output_section->vma
8063                    + sym_sec->output_offset;
8064         }
8065       else
8066         symval = (h->root.u.def.value
8067                   + h->root.u.def.section->output_section->vma
8068                   + h->root.u.def.section->output_offset);
8069       addend = irel->r_addend;
8070     }
8071
8072   foff = symval + addend;
8073
8074   return foff;
8075 }
8076
8077 static bfd_vma
8078 calculate_got_memory_address (bfd *abfd, struct bfd_link_info *link_info,
8079                               Elf_Internal_Rela *irel,
8080                               Elf_Internal_Shdr *symtab_hdr)
8081 {
8082   int symndx;
8083   bfd_vma *local_got_offsets;
8084   /* Get the value of the symbol referred to by the reloc.  */
8085   struct elf_link_hash_entry *h;
8086   struct elf_nds32_link_hash_table *htab = nds32_elf_hash_table (link_info);
8087
8088   /* An external symbol.  */
8089   symndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
8090   h = elf_sym_hashes (abfd)[symndx];
8091   while (h->root.type == bfd_link_hash_indirect
8092          || h->root.type == bfd_link_hash_warning)
8093     h = (struct elf_link_hash_entry *) h->root.u.i.link;
8094
8095   if (symndx >= 0)
8096     {
8097       BFD_ASSERT (h != NULL);
8098       return htab->sgot->output_section->vma + htab->sgot->output_offset
8099              + h->got.offset;
8100     }
8101   else
8102     {
8103       local_got_offsets = elf_local_got_offsets (abfd);
8104       BFD_ASSERT (local_got_offsets != NULL);
8105       return htab->sgot->output_section->vma + htab->sgot->output_offset
8106              + local_got_offsets[ELF32_R_SYM (irel->r_info)];
8107     }
8108
8109   /* The _GLOBAL_OFFSET_TABLE_ may be undefweak(or should be?).  */
8110   /* The check of h->root.type is passed.  */
8111 }
8112
8113 static int
8114 is_16bit_NOP (bfd *abfd ATTRIBUTE_UNUSED,
8115               asection *sec, Elf_Internal_Rela *rel)
8116 {
8117   bfd_byte *contents;
8118   unsigned short insn16;
8119
8120   if (!(rel->r_addend & R_NDS32_INSN16_CONVERT_FLAG))
8121     return FALSE;
8122   contents = elf_section_data (sec)->this_hdr.contents;
8123   insn16 = bfd_getb16 (contents + rel->r_offset);
8124   if (insn16 == NDS32_NOP16)
8125     return TRUE;
8126   return FALSE;
8127 }
8128
8129 /* It checks whether the instruction could be converted to
8130    16-bit form and returns the converted one.
8131
8132    `internal_relocs' is supposed to be sorted.  */
8133
8134 static int
8135 is_convert_32_to_16 (bfd *abfd, asection *sec,
8136                      Elf_Internal_Rela *reloc,
8137                      Elf_Internal_Rela *internal_relocs,
8138                      Elf_Internal_Rela *irelend,
8139                      uint16_t *insn16)
8140 {
8141 #define NORMAL_32_TO_16 (1 << 0)
8142 #define SPECIAL_32_TO_16 (1 << 1)
8143   bfd_byte *contents = NULL;
8144   bfd_signed_vma off;
8145   bfd_vma mem_addr;
8146   uint32_t insn = 0;
8147   Elf_Internal_Rela *pc_rel;
8148   int pic_ext_target = 0;
8149   Elf_Internal_Shdr *symtab_hdr;
8150   Elf_Internal_Sym *isymbuf = NULL;
8151   int convert_type;
8152   bfd_vma offset;
8153
8154   if (reloc->r_offset + 4 > sec->size)
8155     return FALSE;
8156
8157   offset = reloc->r_offset;
8158
8159   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
8160     return FALSE;
8161   insn = bfd_getb32 (contents + offset);
8162
8163   if (nds32_convert_32_to_16 (abfd, insn, insn16, NULL))
8164     convert_type = NORMAL_32_TO_16;
8165   else if (special_convert_32_to_16 (insn, insn16, reloc))
8166     convert_type = SPECIAL_32_TO_16;
8167   else
8168     return FALSE;
8169
8170   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8171   if (!nds32_get_local_syms (abfd, sec, &isymbuf))
8172     return FALSE;
8173
8174   /* Find the first relocation of the same relocation-type,
8175      so we iteratie them forward.  */
8176   pc_rel = reloc;
8177   while ((pc_rel - 1) >= internal_relocs && pc_rel[-1].r_offset == offset)
8178     pc_rel--;
8179
8180   for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
8181     {
8182       if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
8183           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
8184           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA
8185           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
8186         {
8187           off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr,
8188                                   &pic_ext_target);
8189           if (off >= ACCURATE_8BIT_S1 || off < -ACCURATE_8BIT_S1
8190               || off == 0)
8191             return FALSE;
8192           break;
8193         }
8194       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
8195         {
8196           /* movi => movi55  */
8197           mem_addr = calculate_memory_address (abfd, pc_rel, isymbuf,
8198                                                symtab_hdr);
8199           /* mem_addr is unsigned, but the value should
8200              be between [-16, 15].  */
8201           if ((mem_addr + 0x10) >> 5)
8202             return FALSE;
8203           break;
8204         }
8205       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_20)
8206                || (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_LO12))
8207         {
8208           /* It never happen movi to movi55 for R_NDS32_TLS_LE_20,
8209              because it can be relaxed to addi for TLS_LE_ADD.  */
8210           return FALSE;
8211         }
8212       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
8213                 || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
8214                && (reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG)
8215                && convert_type == SPECIAL_32_TO_16)
8216         {
8217           /* fp-as-gp
8218              We've selected a best fp-base for this access, so we can
8219              always resolve it anyway.  Do nothing.  */
8220           break;
8221         }
8222       else if ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_NONE
8223                 && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_RELA_GNU_VTINHERIT))
8224                || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_RELA_GNU_VTENTRY)
8225                    && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_INSN16))
8226                || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_LOADSTORE)
8227                    && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_DWARF2_OP1_RELA)))
8228         {
8229           /* Prevent unresolved addi instruction translate
8230              to addi45 or addi333.  */
8231           return FALSE;
8232         }
8233       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
8234         {
8235           off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr,
8236                                   &pic_ext_target);
8237           if (off >= ACCURATE_U9BIT_S1 || off <= 0)
8238             return FALSE;
8239           break;
8240         }
8241     }
8242
8243   return TRUE;
8244 }
8245
8246 static void
8247 nds32_elf_write_16 (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *contents,
8248                     Elf_Internal_Rela *reloc,
8249                     Elf_Internal_Rela *internal_relocs,
8250                     Elf_Internal_Rela *irelend,
8251                     unsigned short insn16)
8252 {
8253   Elf_Internal_Rela *pc_rel;
8254   bfd_vma offset;
8255
8256   offset = reloc->r_offset;
8257   bfd_putb16 (insn16, contents + offset);
8258   /* Find the first relocation of the same relocation-type,
8259      so we iteratie them forward.  */
8260   pc_rel = reloc;
8261   while ((pc_rel - 1) > internal_relocs && pc_rel[-1].r_offset == offset)
8262     pc_rel--;
8263
8264   for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
8265     {
8266       if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
8267           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
8268           || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA)
8269         {
8270           pc_rel->r_info =
8271             ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PCREL_RELA);
8272         }
8273       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
8274         pc_rel->r_info =
8275           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PLTREL);
8276       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
8277         pc_rel->r_info =
8278           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_5_RELA);
8279       else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
8280                || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
8281         pc_rel->r_info =
8282           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_SDA_FP7U2_RELA);
8283       else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
8284         pc_rel->r_info =
8285           ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_10IFCU_PCREL_RELA);
8286     }
8287 }
8288
8289 /* Find a relocation of type specified by `reloc_type'
8290    of the same r_offset with reloc.
8291    If not found, return irelend.
8292
8293    Assuming relocations are sorted by r_offset,
8294    we find the relocation from `reloc' backward untill relocs,
8295    or find it from `reloc' forward untill irelend.  */
8296
8297 static Elf_Internal_Rela *
8298 find_relocs_at_address (Elf_Internal_Rela *reloc,
8299                         Elf_Internal_Rela *relocs,
8300                         Elf_Internal_Rela *irelend,
8301                         enum elf_nds32_reloc_type reloc_type)
8302 {
8303   Elf_Internal_Rela *rel_t;
8304
8305   /* Find backward.  */
8306   for (rel_t = reloc;
8307        rel_t >= relocs && rel_t->r_offset == reloc->r_offset;
8308        rel_t--)
8309     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8310       return rel_t;
8311
8312   /* We didn't find it backward.  Try find it forward.  */
8313   for (rel_t = reloc;
8314        rel_t < irelend && rel_t->r_offset == reloc->r_offset;
8315        rel_t++)
8316     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8317       return rel_t;
8318
8319   return irelend;
8320 }
8321
8322 /* Find a relocation of specified type and offset.
8323    `reloc' is just a refence point to find a relocation at specified offset.
8324    If not found, return irelend.
8325
8326    Assuming relocations are sorted by r_offset,
8327    we find the relocation from `reloc' backward untill relocs,
8328    or find it from `reloc' forward untill irelend.  */
8329
8330 static Elf_Internal_Rela *
8331 find_relocs_at_address_addr (Elf_Internal_Rela *reloc,
8332                              Elf_Internal_Rela *relocs,
8333                              Elf_Internal_Rela *irelend,
8334                              enum elf_nds32_reloc_type reloc_type,
8335                              bfd_vma offset_p)
8336 {
8337   Elf_Internal_Rela *rel_t = NULL;
8338
8339   /* First, we try to find a relocation of offset `offset_p',
8340      and then we use find_relocs_at_address to find specific type.  */
8341
8342   if (reloc->r_offset > offset_p)
8343     {
8344       /* Find backward.  */
8345       for (rel_t = reloc;
8346            rel_t >= relocs && rel_t->r_offset > offset_p; rel_t--)
8347         /* Do nothing.  */;
8348     }
8349   else if (reloc->r_offset < offset_p)
8350     {
8351       /* Find forward.  */
8352       for (rel_t = reloc;
8353            rel_t < irelend && rel_t->r_offset < offset_p; rel_t++)
8354         /* Do nothing.  */;
8355     }
8356   else
8357     rel_t = reloc;
8358
8359   /* Not found?  */
8360   if (rel_t < relocs || rel_t == irelend || rel_t->r_offset != offset_p)
8361     return irelend;
8362
8363   return find_relocs_at_address (rel_t, relocs, irelend, reloc_type);
8364 }
8365
8366 static bfd_boolean
8367 nds32_elf_check_dup_relocs (Elf_Internal_Rela *reloc,
8368                             Elf_Internal_Rela *internal_relocs,
8369                             Elf_Internal_Rela *irelend,
8370                             unsigned char reloc_type)
8371 {
8372   Elf_Internal_Rela *rel_t;
8373
8374   for (rel_t = reloc;
8375        rel_t >= internal_relocs && rel_t->r_offset == reloc->r_offset;
8376        rel_t--)
8377     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8378       {
8379         if (ELF32_R_SYM (rel_t->r_info) == ELF32_R_SYM (reloc->r_info)
8380             && rel_t->r_addend == reloc->r_addend)
8381           continue;
8382         return TRUE;
8383       }
8384
8385   for (rel_t = reloc; rel_t < irelend && rel_t->r_offset == reloc->r_offset;
8386        rel_t++)
8387     if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
8388       {
8389         if (ELF32_R_SYM (rel_t->r_info) == ELF32_R_SYM (reloc->r_info)
8390             && rel_t->r_addend == reloc->r_addend)
8391           continue;
8392         return TRUE;
8393       }
8394
8395   return FALSE;
8396 }
8397
8398 typedef struct nds32_elf_blank nds32_elf_blank_t;
8399 struct nds32_elf_blank
8400 {
8401   /* Where the blank begins.  */
8402   bfd_vma offset;
8403   /* The size of the blank.  */
8404   bfd_vma size;
8405   /* The accumulative size before this blank.  */
8406   bfd_vma total_size;
8407   nds32_elf_blank_t *next;
8408   nds32_elf_blank_t *prev;
8409 };
8410
8411 static nds32_elf_blank_t *blank_free_list = NULL;
8412
8413 static nds32_elf_blank_t *
8414 create_nds32_elf_blank (bfd_vma offset_p, bfd_vma size_p)
8415 {
8416   nds32_elf_blank_t *blank_t;
8417
8418   if (blank_free_list)
8419     {
8420       blank_t = blank_free_list;
8421       blank_free_list = blank_free_list->next;
8422     }
8423   else
8424     blank_t = bfd_malloc (sizeof (nds32_elf_blank_t));
8425
8426   if (blank_t == NULL)
8427     return NULL;
8428
8429   blank_t->offset = offset_p;
8430   blank_t->size = size_p;
8431   blank_t->total_size = 0;
8432   blank_t->next = NULL;
8433   blank_t->prev = NULL;
8434
8435   return blank_t;
8436 }
8437
8438 static void
8439 remove_nds32_elf_blank (nds32_elf_blank_t *blank_p)
8440 {
8441   if (blank_free_list)
8442     {
8443       blank_free_list->prev = blank_p;
8444       blank_p->next = blank_free_list;
8445     }
8446   else
8447     blank_p->next = NULL;
8448
8449   blank_p->prev = NULL;
8450   blank_free_list = blank_p;
8451 }
8452
8453 static void
8454 clean_nds32_elf_blank (void)
8455 {
8456   nds32_elf_blank_t *blank_t;
8457
8458   while (blank_free_list)
8459     {
8460       blank_t = blank_free_list;
8461       blank_free_list = blank_free_list->next;
8462       free (blank_t);
8463     }
8464 }
8465
8466 static nds32_elf_blank_t *
8467 search_nds32_elf_blank (nds32_elf_blank_t *blank_p, bfd_vma addr)
8468 {
8469   nds32_elf_blank_t *blank_t;
8470
8471   if (!blank_p)
8472     return NULL;
8473   blank_t = blank_p;
8474
8475   while (blank_t && addr < blank_t->offset)
8476     blank_t = blank_t->prev;
8477   while (blank_t && blank_t->next && addr >= blank_t->next->offset)
8478     blank_t = blank_t->next;
8479
8480   return blank_t;
8481 }
8482
8483 static bfd_vma
8484 get_nds32_elf_blank_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
8485                            int overwrite)
8486 {
8487   nds32_elf_blank_t *blank_t;
8488
8489   blank_t = search_nds32_elf_blank (*blank_p, addr);
8490   if (!blank_t)
8491     return 0;
8492
8493   if (overwrite)
8494     *blank_p = blank_t;
8495
8496   if (addr < blank_t->offset + blank_t->size)
8497     return blank_t->total_size + (addr - blank_t->offset);
8498   else
8499     return blank_t->total_size + blank_t->size;
8500 }
8501
8502 static bfd_boolean
8503 insert_nds32_elf_blank (nds32_elf_blank_t **blank_p, bfd_vma addr, bfd_vma len)
8504 {
8505   nds32_elf_blank_t *blank_t, *blank_t2;
8506
8507   if (!*blank_p)
8508     {
8509       *blank_p = create_nds32_elf_blank (addr, len);
8510       return *blank_p ? TRUE : FALSE;
8511     }
8512
8513   blank_t = search_nds32_elf_blank (*blank_p, addr);
8514
8515   if (blank_t == NULL)
8516     {
8517       blank_t = create_nds32_elf_blank (addr, len);
8518       if (!blank_t)
8519         return FALSE;
8520       while ((*blank_p)->prev != NULL)
8521         *blank_p = (*blank_p)->prev;
8522       blank_t->next = *blank_p;
8523       (*blank_p)->prev = blank_t;
8524       (*blank_p) = blank_t;
8525       return TRUE;
8526     }
8527
8528   if (addr < blank_t->offset + blank_t->size)
8529     {
8530       if (addr > blank_t->offset + blank_t->size)
8531         blank_t->size = addr - blank_t->offset;
8532     }
8533   else
8534     {
8535       blank_t2 = create_nds32_elf_blank (addr, len);
8536       if (!blank_t2)
8537         return FALSE;
8538       if (blank_t->next)
8539         {
8540           blank_t->next->prev = blank_t2;
8541           blank_t2->next = blank_t->next;
8542         }
8543       blank_t2->prev = blank_t;
8544       blank_t->next = blank_t2;
8545       *blank_p = blank_t2;
8546     }
8547
8548   return TRUE;
8549 }
8550
8551 static bfd_boolean
8552 insert_nds32_elf_blank_recalc_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
8553                                      bfd_vma len)
8554 {
8555   nds32_elf_blank_t *blank_t;
8556
8557   if (!insert_nds32_elf_blank (blank_p, addr, len))
8558     return FALSE;
8559
8560   blank_t = *blank_p;
8561
8562   if (!blank_t->prev)
8563     {
8564       blank_t->total_size = 0;
8565       blank_t = blank_t->next;
8566     }
8567
8568   while (blank_t)
8569     {
8570       blank_t->total_size = blank_t->prev->total_size + blank_t->prev->size;
8571       blank_t = blank_t->next;
8572     }
8573
8574   return TRUE;
8575 }
8576
8577 static void
8578 calc_nds32_blank_total (nds32_elf_blank_t *blank_p)
8579 {
8580   nds32_elf_blank_t *blank_t;
8581   bfd_vma total_size = 0;
8582
8583   if (!blank_p)
8584     return;
8585
8586   blank_t = blank_p;
8587   while (blank_t->prev)
8588     blank_t = blank_t->prev;
8589   while (blank_t)
8590     {
8591       blank_t->total_size = total_size;
8592       total_size += blank_t->size;
8593       blank_t = blank_t->next;
8594     }
8595 }
8596
8597 static bfd_boolean
8598 nds32_elf_relax_delete_blanks (bfd *abfd, asection *sec,
8599                                nds32_elf_blank_t *blank_p)
8600 {
8601   Elf_Internal_Shdr *symtab_hdr;        /* Symbol table header of this bfd.  */
8602   Elf_Internal_Sym *isym = NULL;        /* Symbol table of this bfd.  */
8603   Elf_Internal_Sym *isymend;            /* Symbol entry iterator.  */
8604   unsigned int sec_shndx;               /* The section the be relaxed.  */
8605   bfd_byte *contents;                   /* Contents data of iterating section.  */
8606   Elf_Internal_Rela *internal_relocs;
8607   Elf_Internal_Rela *irel;
8608   Elf_Internal_Rela *irelend;
8609   struct elf_link_hash_entry **sym_hashes;
8610   struct elf_link_hash_entry **end_hashes;
8611   unsigned int symcount;
8612   asection *sect;
8613   nds32_elf_blank_t *blank_t;
8614   nds32_elf_blank_t *blank_t2;
8615   nds32_elf_blank_t *blank_head;
8616
8617   blank_head = blank_t = blank_p;
8618   while (blank_head->prev != NULL)
8619     blank_head = blank_head->prev;
8620   while (blank_t->next != NULL)
8621     blank_t = blank_t->next;
8622
8623   if (blank_t->offset + blank_t->size <= sec->size)
8624     {
8625       blank_t->next = create_nds32_elf_blank (sec->size + 4, 0);
8626       blank_t->next->prev = blank_t;
8627     }
8628   if (blank_head->offset > 0)
8629     {
8630       blank_head->prev = create_nds32_elf_blank (0, 0);
8631       blank_head->prev->next = blank_head;
8632       blank_head = blank_head->prev;
8633     }
8634
8635   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
8636
8637   /* The deletion must stop at the next ALIGN reloc for an alignment
8638      power larger than the number of bytes we are deleting.  */
8639
8640   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8641   if (!nds32_get_local_syms (abfd, sec, &isym))
8642     return FALSE;
8643
8644   if (isym == NULL)
8645     {
8646       isym = bfd_elf_get_elf_syms (abfd, symtab_hdr,
8647                                    symtab_hdr->sh_info, 0, NULL, NULL, NULL);
8648       symtab_hdr->contents = (bfd_byte *) isym;
8649     }
8650
8651   if (isym == NULL || symtab_hdr->sh_info == 0)
8652     return FALSE;
8653
8654   blank_t = blank_head;
8655   calc_nds32_blank_total (blank_head);
8656
8657   for (sect = abfd->sections; sect != NULL; sect = sect->next)
8658     {
8659       /* Adjust all the relocs.  */
8660
8661       /* Relocations MUST be kept in memory, because relaxation adjust them.  */
8662       internal_relocs = _bfd_elf_link_read_relocs (abfd, sect, NULL, NULL,
8663                                                    TRUE /* keep_memory */);
8664       irelend = internal_relocs + sect->reloc_count;
8665
8666       blank_t = blank_head;
8667       blank_t2 = blank_head;
8668
8669       if (!(sect->flags & SEC_RELOC))
8670         continue;
8671
8672       nds32_get_section_contents (abfd, sect, &contents, TRUE);
8673
8674       for (irel = internal_relocs; irel < irelend; irel++)
8675         {
8676           bfd_vma raddr;
8677
8678           if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_DIFF8
8679               && ELF32_R_TYPE (irel->r_info) <= R_NDS32_DIFF32
8680               && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
8681             {
8682               unsigned long val = 0;
8683               unsigned long mask;
8684               long before, between;
8685               long offset = 0;
8686
8687               switch (ELF32_R_TYPE (irel->r_info))
8688                 {
8689                 case R_NDS32_DIFF8:
8690                   offset = bfd_get_8 (abfd, contents + irel->r_offset);
8691                   break;
8692                 case R_NDS32_DIFF16:
8693                   offset = bfd_get_16 (abfd, contents + irel->r_offset);
8694                   break;
8695                 case R_NDS32_DIFF32:
8696                   val = bfd_get_32 (abfd, contents + irel->r_offset);
8697                   /* Get the signed bit and mask for the high part.  The
8698                      gcc will alarm when right shift 32-bit since the
8699                      type size of long may be 32-bit.  */
8700                   mask = 0 - (val >> 31);
8701                   if (mask)
8702                     offset = (val | (mask - 0xffffffff));
8703                   else
8704                     offset = val;
8705                   break;
8706                 default:
8707                   BFD_ASSERT (0);
8708                 }
8709
8710               /*                  DIFF value
8711                 0            |encoded in location|
8712                 |------------|-------------------|---------
8713                             sym+off(addend)
8714                 -- before ---| *****************
8715                 --------------------- between ---|
8716
8717                 We only care how much data are relax between DIFF,
8718                 marked as ***.  */
8719
8720               before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
8721               between = get_nds32_elf_blank_total (&blank_t,
8722                                                    irel->r_addend + offset, 0);
8723               if (between == before)
8724                 goto done_adjust_diff;
8725
8726               switch (ELF32_R_TYPE (irel->r_info))
8727                 {
8728                 case R_NDS32_DIFF8:
8729                   bfd_put_8 (abfd, offset - (between - before),
8730                              contents + irel->r_offset);
8731                   break;
8732                 case R_NDS32_DIFF16:
8733                   bfd_put_16 (abfd, offset - (between - before),
8734                               contents + irel->r_offset);
8735                   break;
8736                 case R_NDS32_DIFF32:
8737                   bfd_put_32 (abfd, offset - (between - before),
8738                               contents + irel->r_offset);
8739                   break;
8740                 }
8741             }
8742           else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_DIFF_ULEB128
8743               && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
8744             {
8745               bfd_vma val = 0;
8746               unsigned int len = 0;
8747               unsigned long before, between;
8748               bfd_byte *endp, *p;
8749
8750               val = read_unsigned_leb128 (abfd, contents + irel->r_offset,
8751                                           &len);
8752
8753               before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
8754               between = get_nds32_elf_blank_total (&blank_t,
8755                                                    irel->r_addend + val, 0);
8756               if (between == before)
8757                 goto done_adjust_diff;
8758
8759               p = contents + irel->r_offset;
8760               endp = p + len -1;
8761               memset (p, 0x80, len);
8762               *(endp) = 0;
8763               p = write_uleb128 (p, val - (between - before)) - 1;
8764               if (p < endp)
8765                 *p |= 0x80;
8766             }
8767 done_adjust_diff:
8768
8769           if (sec == sect)
8770             {
8771               raddr = irel->r_offset;
8772               irel->r_offset -= get_nds32_elf_blank_total (&blank_t2,
8773                                                            irel->r_offset, 1);
8774
8775               if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
8776                 continue;
8777               if (blank_t2 && blank_t2->next
8778                   && (blank_t2->offset > raddr
8779                       || blank_t2->next->offset <= raddr))
8780                 _bfd_error_handler
8781                   (_("%B: %s\n"), abfd,
8782                    "Error: search_nds32_elf_blank reports wrong node");
8783
8784               /* Mark reloc in deleted portion as NONE.
8785                  For some relocs like R_NDS32_LABEL that doesn't modify the
8786                  content in the section.  R_NDS32_LABEL doesn't belong to the
8787                  instruction in the section, so we should preserve it.  */
8788               if (raddr >= blank_t2->offset
8789                   && raddr < blank_t2->offset + blank_t2->size
8790                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL
8791                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_BEGIN
8792                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_END
8793                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
8794                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_SUBTRAHEND
8795                   && ELF32_R_TYPE (irel->r_info) != R_NDS32_MINUEND)
8796                 {
8797                   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
8798                                                R_NDS32_NONE);
8799                   continue;
8800                 }
8801             }
8802
8803           if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE
8804               || ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
8805               || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
8806             continue;
8807
8808           if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info
8809               && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx
8810               && ELF_ST_TYPE (isym[ELF32_R_SYM (irel->r_info)].st_info) == STT_SECTION)
8811             {
8812               if (irel->r_addend <= sec->size)
8813                 irel->r_addend -=
8814                   get_nds32_elf_blank_total (&blank_t, irel->r_addend, 1);
8815             }
8816         }
8817     }
8818
8819   /* Adjust the local symbols defined in this section.  */
8820   blank_t = blank_head;
8821   for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
8822     {
8823       if (isym->st_shndx == sec_shndx)
8824         {
8825           if (isym->st_value <= sec->size)
8826             {
8827               bfd_vma ahead;
8828               bfd_vma orig_addr = isym->st_value;
8829
8830               ahead = get_nds32_elf_blank_total (&blank_t, isym->st_value, 1);
8831               isym->st_value -= ahead;
8832
8833               /* Adjust function size.  */
8834               if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC
8835                   && isym->st_size > 0)
8836                 isym->st_size -=
8837                   get_nds32_elf_blank_total
8838                   (&blank_t, orig_addr + isym->st_size, 0) - ahead;
8839             }
8840         }
8841     }
8842
8843   /* Now adjust the global symbols defined in this section.  */
8844   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
8845               - symtab_hdr->sh_info);
8846   sym_hashes = elf_sym_hashes (abfd);
8847   end_hashes = sym_hashes + symcount;
8848   blank_t = blank_head;
8849   for (; sym_hashes < end_hashes; sym_hashes++)
8850     {
8851       struct elf_link_hash_entry *sym_hash = *sym_hashes;
8852
8853       if ((sym_hash->root.type == bfd_link_hash_defined
8854            || sym_hash->root.type == bfd_link_hash_defweak)
8855           && sym_hash->root.u.def.section == sec)
8856         {
8857           if (sym_hash->root.u.def.value <= sec->size)
8858             {
8859               bfd_vma ahead;
8860               bfd_vma orig_addr = sym_hash->root.u.def.value;
8861
8862               ahead = get_nds32_elf_blank_total (&blank_t, sym_hash->root.u.def.value, 1);
8863               sym_hash->root.u.def.value -= ahead;
8864
8865               /* Adjust function size.  */
8866               if (sym_hash->type == STT_FUNC)
8867                 sym_hash->size -=
8868                   get_nds32_elf_blank_total
8869                   (&blank_t, orig_addr + sym_hash->size, 0) - ahead;
8870
8871             }
8872         }
8873     }
8874
8875   contents = elf_section_data (sec)->this_hdr.contents;
8876   blank_t = blank_head;
8877   while (blank_t->next)
8878     {
8879       /* Actually delete the bytes.  */
8880
8881       /* If current blank is the last blank overlap with current section,
8882          go to finish process.  */
8883       if (sec->size <= (blank_t->next->offset))
8884         break;
8885
8886       memmove (contents + blank_t->offset - blank_t->total_size,
8887                contents + blank_t->offset + blank_t->size,
8888                blank_t->next->offset - (blank_t->offset + blank_t->size));
8889
8890       blank_t = blank_t->next;
8891     }
8892
8893   if (sec->size > (blank_t->offset + blank_t->size))
8894     {
8895       /* There are remaining code between blank and section boundary.
8896          Move the remaining code to appropriate location.  */
8897       memmove (contents + blank_t->offset - blank_t->total_size,
8898                contents + blank_t->offset + blank_t->size,
8899                sec->size - (blank_t->offset + blank_t->size));
8900       sec->size -= blank_t->total_size + blank_t->size;
8901     }
8902   else
8903     /* This blank is not entirely included in the section,
8904        reduce the section size by only part of the blank size.  */
8905     sec->size -= blank_t->total_size + (sec->size - blank_t->offset);
8906
8907   while (blank_head)
8908     {
8909       blank_t = blank_head;
8910       blank_head = blank_head->next;
8911       remove_nds32_elf_blank (blank_t);
8912     }
8913
8914   return TRUE;
8915 }
8916
8917 /* Get the contents of a section.  */
8918
8919 static int
8920 nds32_get_section_contents (bfd *abfd, asection *sec,
8921                             bfd_byte **contents_p, bfd_boolean cache)
8922 {
8923   /* Get the section contents.  */
8924   if (elf_section_data (sec)->this_hdr.contents != NULL)
8925     *contents_p = elf_section_data (sec)->this_hdr.contents;
8926   else
8927     {
8928       if (!bfd_malloc_and_get_section (abfd, sec, contents_p))
8929         return FALSE;
8930       if (cache)
8931         elf_section_data (sec)->this_hdr.contents = *contents_p;
8932     }
8933
8934   return TRUE;
8935 }
8936
8937 /* Get the contents of the internal symbol of abfd.  */
8938
8939 static int
8940 nds32_get_local_syms (bfd *abfd, asection *sec ATTRIBUTE_UNUSED,
8941                       Elf_Internal_Sym **isymbuf_p)
8942 {
8943   Elf_Internal_Shdr *symtab_hdr;
8944   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8945
8946   /* Read this BFD's local symbols if we haven't done so already.  */
8947   if (*isymbuf_p == NULL && symtab_hdr->sh_info != 0)
8948     {
8949       *isymbuf_p = (Elf_Internal_Sym *) symtab_hdr->contents;
8950       if (*isymbuf_p == NULL)
8951         {
8952           *isymbuf_p = bfd_elf_get_elf_syms (abfd, symtab_hdr,
8953                                              symtab_hdr->sh_info, 0,
8954                                              NULL, NULL, NULL);
8955           if (*isymbuf_p == NULL)
8956             return FALSE;
8957         }
8958     }
8959   symtab_hdr->contents = (bfd_byte *) (*isymbuf_p);
8960
8961   return TRUE;
8962 }
8963
8964 /* Range of small data.  */
8965 static bfd_vma sdata_range[2][2];
8966 static bfd_vma const sdata_init_range[2] =
8967 { ACCURATE_12BIT_S1, ACCURATE_19BIT };
8968
8969 static int
8970 nds32_elf_insn_size (bfd *abfd ATTRIBUTE_UNUSED,
8971                      bfd_byte *contents, bfd_vma addr)
8972 {
8973   unsigned long insn = bfd_getb32 (contents + addr);
8974
8975   if (insn & 0x80000000)
8976     return 2;
8977
8978   return 4;
8979 }
8980
8981 /* Set the gp relax range.  We have to measure the safe range
8982    to do gp relaxation.  */
8983
8984 static void
8985 relax_range_measurement (bfd *abfd)
8986 {
8987   asection *sec_f, *sec_b;
8988   /* For upper bound.   */
8989   bfd_vma maxpgsz = get_elf_backend_data (abfd)->maxpagesize;
8990   bfd_vma align;
8991   static int decide_relax_range = 0;
8992   int i;
8993   int range_number = sizeof (sdata_init_range) / sizeof (sdata_init_range[0]);
8994
8995   if (decide_relax_range)
8996     return;
8997   decide_relax_range = 1;
8998
8999   if (sda_rela_sec == NULL)
9000     {
9001       /* Since there is no data sections, we assume the range is page size.  */
9002       for (i = 0; i < range_number; i++)
9003         {
9004           sdata_range[i][0] = sdata_init_range[i] - 0x1000;
9005           sdata_range[i][1] = sdata_init_range[i] - 0x1000;
9006         }
9007       return;
9008     }
9009
9010   /* Get the biggest alignment power after the gp located section.  */
9011   sec_f = sda_rela_sec->output_section;
9012   sec_b = sec_f->next;
9013   align = 0;
9014   while (sec_b != NULL)
9015     {
9016       if ((unsigned)(1 << sec_b->alignment_power) > align)
9017         align = (1 << sec_b->alignment_power);
9018       sec_b = sec_b->next;
9019     }
9020
9021   /* I guess we can not determine the section before
9022      gp located section, so we assume the align is max page size.  */
9023   for (i = 0; i < range_number; i++)
9024     {
9025       sdata_range[i][1] = sdata_init_range[i] - align;
9026       BFD_ASSERT (sdata_range[i][1] <= sdata_init_range[i]);
9027       sdata_range[i][0] = sdata_init_range[i] - maxpgsz;
9028       BFD_ASSERT (sdata_range[i][0] <= sdata_init_range[i]);
9029     }
9030 }
9031
9032 /* These are macros used to check flags encoded in r_addend.
9033    They are only used by nds32_elf_relax_section ().  */
9034 #define GET_SEQ_LEN(addend)     ((addend) & 0x000000ff)
9035 #define IS_1ST_CONVERT(addend)  ((addend) & 0x80000000)
9036 #define IS_OPTIMIZE(addend)     ((addend) & 0x40000000)
9037 #define IS_16BIT_ON(addend)     ((addend) & 0x20000000)
9038
9039 /* Relax LONGCALL1 relocation for nds32_elf_relax_section.  */
9040
9041 static bfd_boolean
9042 nds32_elf_relax_longcall1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9043                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9044                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9045                            Elf_Internal_Shdr *symtab_hdr)
9046 {
9047   /* There are 3 variations for LONGCALL1
9048      case 4-4-2; 16-bit on, optimize off or optimize for space
9049      sethi ta, hi20(symbol)     ; LONGCALL1/HI20
9050      ori   ta, ta, lo12(symbol) ; LO12S0
9051      jral5 ta                   ;
9052
9053      case 4-4-4; 16-bit off, optimize don't care
9054      sethi ta, hi20(symbol)     ; LONGCALL1/HI20
9055      ori   ta, ta, lo12(symbol) ; LO12S0
9056      jral  ta                   ;
9057
9058      case 4-4-4; 16-bit on, optimize for speed
9059      sethi ta, hi20(symbol)     ; LONGCALL1/HI20
9060      ori   ta, ta, lo12(symbol) ; LO12S0
9061      jral  ta                   ;
9062      Check code for -mlong-calls output.  */
9063
9064   /* Get the reloc for the address from which the register is
9065      being loaded.  This reloc will tell us which function is
9066      actually being called.  */
9067
9068   bfd_vma laddr;
9069   int seq_len;  /* Original length of instruction sequence.  */
9070   uint32_t insn;
9071   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
9072   int pic_ext_target = 0;
9073   bfd_signed_vma foff;
9074   uint16_t insn16;
9075
9076   irelend = internal_relocs + sec->reloc_count;
9077   seq_len = GET_SEQ_LEN (irel->r_addend);
9078   laddr = irel->r_offset;
9079   *insn_len = seq_len;
9080
9081   hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9082                                            R_NDS32_HI20_RELA, laddr);
9083   lo_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9084                                            R_NDS32_LO12S0_ORI_RELA,
9085                                            laddr + 4);
9086
9087   if (hi_irelfn == irelend || lo_irelfn == irelend)
9088     {
9089       _bfd_error_handler
9090         ("%B: warning: R_NDS32_LONGCALL1 points to unrecognized"
9091          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
9092       return FALSE;
9093     }
9094
9095   /* Get the value of the symbol referred to by the reloc.  */
9096   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9097                            &pic_ext_target);
9098
9099   /* This condition only happened when symbol is undefined.  */
9100   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9101       || foff >= CONSERVATIVE_24BIT_S1)
9102     return FALSE;
9103
9104   /* Relax to: jal symbol; 25_PCREL */
9105   /* For simplicity of coding, we are going to modify the section
9106      contents, the section relocs, and the BFD symbol table.  We
9107      must tell the rest of the code not to free up this
9108      information.  It would be possible to instead create a table
9109      of changes which have to be made, as is done in coff-mips.c;
9110      that would be more work, but would require less memory when
9111      the linker is run.  */
9112
9113   /* Replace the long call with a jal.  */
9114   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9115                                R_NDS32_25_PCREL_RELA);
9116   irel->r_addend = hi_irelfn->r_addend;
9117
9118   /* We don't resolve this here but resolve it in relocate_section.  */
9119   insn = INSN_JAL;
9120   bfd_putb32 (insn, contents + irel->r_offset);
9121
9122   hi_irelfn->r_info =
9123     ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9124   lo_irelfn->r_info =
9125     ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9126   *insn_len = 4;
9127
9128   if (seq_len & 0x2)
9129     {
9130       insn16 = NDS32_NOP16;
9131       bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9132       lo_irelfn->r_info =
9133         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
9134       lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9135       *insn_len += 2;
9136     }
9137   return TRUE;
9138 }
9139
9140 #define CONVERT_CONDITION_CALL(insn) (((insn) & 0xffff0000) ^ 0x90000)
9141 /* Relax LONGCALL2 relocation for nds32_elf_relax_section.  */
9142
9143 static bfd_boolean
9144 nds32_elf_relax_longcall2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9145                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9146                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9147                            Elf_Internal_Shdr *symtab_hdr)
9148 {
9149   /* bltz  rt, .L1   ; LONGCALL2
9150      jal   symbol   ; 25_PCREL
9151      .L1: */
9152
9153   /* Get the reloc for the address from which the register is
9154      being loaded.  This reloc will tell us which function is
9155      actually being called.  */
9156
9157   bfd_vma laddr;
9158   uint32_t insn;
9159   Elf_Internal_Rela *i1_irelfn, *cond_irelfn, *irelend;
9160   int pic_ext_target = 0;
9161   bfd_signed_vma foff;
9162
9163   irelend = internal_relocs + sec->reloc_count;
9164   laddr = irel->r_offset;
9165   i1_irelfn =
9166     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9167                                  R_NDS32_25_PCREL_RELA, laddr + 4);
9168
9169   if (i1_irelfn == irelend)
9170     {
9171       _bfd_error_handler
9172         ("%B: warning: R_NDS32_LONGCALL2 points to unrecognized"
9173          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
9174       return FALSE;
9175     }
9176
9177   insn = bfd_getb32 (contents + laddr);
9178
9179   /* Get the value of the symbol referred to by the reloc.  */
9180   foff = calculate_offset (abfd, sec, i1_irelfn, isymbuf, symtab_hdr,
9181                            &pic_ext_target);
9182
9183   if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1
9184       || foff >= CONSERVATIVE_16BIT_S1)
9185     return FALSE;
9186
9187   /* Relax to   bgezal   rt, label ; 17_PCREL
9188      or         bltzal   rt, label ; 17_PCREL */
9189
9190   /* Convert to complimentary conditional call.  */
9191   insn = CONVERT_CONDITION_CALL (insn);
9192
9193   /* For simplicity of coding, we are going to modify the section
9194      contents, the section relocs, and the BFD symbol table.  We
9195      must tell the rest of the code not to free up this
9196      information.  It would be possible to instead create a table
9197      of changes which have to be made, as is done in coff-mips.c;
9198      that would be more work, but would require less memory when
9199      the linker is run.  */
9200
9201   /* Clean unnessary relocations.  */
9202   i1_irelfn->r_info =
9203     ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info), R_NDS32_NONE);
9204   cond_irelfn =
9205     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9206                                  R_NDS32_17_PCREL_RELA, laddr);
9207   if (cond_irelfn != irelend)
9208     cond_irelfn->r_info =
9209       ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info), R_NDS32_NONE);
9210
9211   /* Replace the long call with a bgezal.  */
9212   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info),
9213                                R_NDS32_17_PCREL_RELA);
9214   irel->r_addend = i1_irelfn->r_addend;
9215
9216   bfd_putb32 (insn, contents + irel->r_offset);
9217
9218   *insn_len = 4;
9219   return TRUE;
9220 }
9221
9222 /* Relax LONGCALL3 relocation for nds32_elf_relax_section.  */
9223
9224 static bfd_boolean
9225 nds32_elf_relax_longcall3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9226                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9227                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9228                            Elf_Internal_Shdr *symtab_hdr)
9229 {
9230   /* There are 3 variations for LONGCALL3
9231      case 4-4-4-2; 16-bit on, optimize off or optimize for space
9232      bltz  rt,   $1                ; LONGCALL3
9233      sethi ta,   hi20(symbol)      ; HI20
9234      ori   ta, ta,  lo12(symbol)   ; LO12S0
9235      jral5 ta                      ;
9236      $1
9237
9238      case 4-4-4-4; 16-bit off, optimize don't care
9239      bltz  rt,   $1                ; LONGCALL3
9240      sethi ta,   hi20(symbol)      ; HI20
9241      ori   ta, ta,  lo12(symbol)   ; LO12S0
9242      jral  ta                      ;
9243      $1
9244
9245      case 4-4-4-4; 16-bit on, optimize for speed
9246      bltz  rt,   $1                ; LONGCALL3
9247      sethi ta,   hi20(symbol)      ; HI20
9248      ori   ta, ta,  lo12(symbol)   ; LO12S0
9249      jral  ta                      ;
9250      $1 */
9251
9252   /* Get the reloc for the address from which the register is
9253      being loaded.  This reloc will tell us which function is
9254      actually being called.  */
9255
9256   bfd_vma laddr;
9257   int seq_len;  /* Original length of instruction sequence.  */
9258   uint32_t insn;
9259   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
9260   int pic_ext_target = 0;
9261   bfd_signed_vma foff;
9262   uint16_t insn16;
9263
9264   irelend = internal_relocs + sec->reloc_count;
9265   seq_len = GET_SEQ_LEN (irel->r_addend);
9266   laddr = irel->r_offset;
9267   *insn_len = seq_len;
9268
9269   hi_irelfn =
9270     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9271                                  R_NDS32_HI20_RELA, laddr + 4);
9272   lo_irelfn =
9273     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9274                                  R_NDS32_LO12S0_ORI_RELA, laddr + 8);
9275
9276   if (hi_irelfn == irelend || lo_irelfn == irelend)
9277     {
9278       _bfd_error_handler
9279         ("%B: warning: R_NDS32_LONGCALL3 points to unrecognized"
9280          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
9281       return FALSE;
9282     }
9283
9284   /* Get the value of the symbol referred to by the reloc.  */
9285   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9286                            &pic_ext_target);
9287
9288   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9289       || foff >= CONSERVATIVE_24BIT_S1)
9290     return FALSE;
9291
9292   insn = bfd_getb32 (contents + laddr);
9293   if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
9294     {
9295       /* Relax to  bgezal   rt, label ; 17_PCREL
9296          or        bltzal   rt, label ; 17_PCREL */
9297
9298       /* Convert to complimentary conditional call.  */
9299       insn = CONVERT_CONDITION_CALL (insn);
9300       bfd_putb32 (insn, contents + irel->r_offset);
9301
9302       *insn_len = 4;
9303       irel->r_info =
9304         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9305       hi_irelfn->r_info =
9306         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
9307       lo_irelfn->r_info =
9308         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9309
9310       cond_irelfn =
9311         find_relocs_at_address_addr (irel, internal_relocs, irelend,
9312                                      R_NDS32_17_PCREL_RELA, laddr);
9313       if (cond_irelfn != irelend)
9314         {
9315           cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9316                                               R_NDS32_17_PCREL_RELA);
9317           cond_irelfn->r_addend = hi_irelfn->r_addend;
9318         }
9319
9320       if (seq_len & 0x2)
9321         {
9322           insn16 = NDS32_NOP16;
9323           bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9324           hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9325                                             R_NDS32_INSN16);
9326           hi_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9327           insn_len += 2;
9328         }
9329     }
9330   else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
9331     {
9332       /* Relax to the following instruction sequence
9333          bltz  rt,   $1 ; LONGCALL2
9334          jal   symbol   ; 25_PCREL
9335          $1     */
9336       *insn_len = 8;
9337       insn = INSN_JAL;
9338       bfd_putb32 (insn, contents + hi_irelfn->r_offset);
9339
9340       hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9341                                         R_NDS32_25_PCREL_RELA);
9342       irel->r_info =
9343         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL2);
9344
9345       lo_irelfn->r_info =
9346         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9347
9348       if (seq_len & 0x2)
9349         {
9350           insn16 = NDS32_NOP16;
9351           bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9352           lo_irelfn->r_info =
9353             ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
9354           lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9355           insn_len += 2;
9356         }
9357     }
9358   return TRUE;
9359 }
9360
9361 /* Relax LONGJUMP1 relocation for nds32_elf_relax_section.  */
9362
9363 static bfd_boolean
9364 nds32_elf_relax_longjump1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9365                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9366                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9367                            Elf_Internal_Shdr *symtab_hdr)
9368 {
9369   /* There are 3 variations for LONGJUMP1
9370      case 4-4-2; 16-bit bit on, optimize off or optimize for space
9371      sethi ta, hi20(symbol)      ; LONGJUMP1/HI20
9372      ori   ta, ta, lo12(symbol)  ; LO12S0
9373      jr5   ta                    ;
9374
9375      case 4-4-4; 16-bit off, optimize don't care
9376      sethi ta, hi20(symbol)      ; LONGJUMP1/HI20
9377      ori   ta, ta, lo12(symbol)  ; LO12S0
9378      jr    ta                    ;
9379
9380      case 4-4-4; 16-bit on, optimize for speed
9381      sethi ta, hi20(symbol)      ; LONGJUMP1/HI20
9382      ori   ta, ta, lo12(symbol)  ; LO12S0
9383      jr    ta                    ;      */
9384
9385   /* Get the reloc for the address from which the register is
9386      being loaded.  This reloc will tell us which function is
9387      actually being called.  */
9388
9389   bfd_vma laddr;
9390   int seq_len;  /* Original length of instruction sequence.  */
9391   int insn16_on;        /* 16-bit on/off.  */
9392   uint32_t insn;
9393   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
9394   int pic_ext_target = 0;
9395   bfd_signed_vma foff;
9396   uint16_t insn16;
9397   unsigned long reloc;
9398
9399   irelend = internal_relocs + sec->reloc_count;
9400   seq_len = GET_SEQ_LEN (irel->r_addend);
9401   laddr = irel->r_offset;
9402   *insn_len = seq_len;
9403   insn16_on = IS_16BIT_ON (irel->r_addend);
9404
9405   hi_irelfn =
9406     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9407                                  R_NDS32_HI20_RELA, laddr);
9408   lo_irelfn =
9409     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9410                                  R_NDS32_LO12S0_ORI_RELA, laddr + 4);
9411   if (hi_irelfn == irelend || lo_irelfn == irelend)
9412     {
9413       _bfd_error_handler
9414         ("%B: warning: R_NDS32_LONGJUMP1 points to unrecognized"
9415          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
9416       return FALSE;
9417     }
9418
9419   /* Get the value of the symbol referred to by the reloc.  */
9420   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9421                            &pic_ext_target);
9422
9423   if (pic_ext_target || foff == 0 || foff >= CONSERVATIVE_24BIT_S1
9424       || foff < -CONSERVATIVE_24BIT_S1)
9425     return FALSE;
9426
9427   if (insn16_on && foff >= -ACCURATE_8BIT_S1
9428       && foff < ACCURATE_8BIT_S1 && (seq_len & 0x2))
9429     {
9430       /* j8     label */
9431       /* 16-bit on, but not optimized for speed.  */
9432       reloc = R_NDS32_9_PCREL_RELA;
9433       insn16 = INSN_J8;
9434       bfd_putb16 (insn16, contents + irel->r_offset);
9435       *insn_len = 2;
9436       irel->r_info =
9437         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
9438     }
9439   else
9440     {
9441       /* j     label */
9442       reloc = R_NDS32_25_PCREL_RELA;
9443       insn = INSN_J;
9444       bfd_putb32 (insn, contents + irel->r_offset);
9445       *insn_len = 4;
9446       irel->r_info =
9447         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_INSN16);
9448       irel->r_addend = 0;
9449     }
9450
9451   hi_irelfn->r_info =
9452     ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
9453   lo_irelfn->r_info =
9454     ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
9455
9456   if ((seq_len & 0x2) && ((*insn_len & 2) == 0))
9457     {
9458       insn16 = NDS32_NOP16;
9459       bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9460       lo_irelfn->r_info =
9461         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
9462                       R_NDS32_INSN16);
9463       lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9464       *insn_len += 2;
9465     }
9466   return TRUE;
9467 }
9468
9469 /* Revert condition branch.  This function does not check if the input
9470    instruction is condition branch or not.  */
9471
9472 static void
9473 nds32_elf_convert_branch (uint16_t insn16, uint32_t insn,
9474                            uint16_t *re_insn16, uint32_t *re_insn)
9475 {
9476   uint32_t comp_insn = 0;
9477   uint16_t comp_insn16 = 0;
9478
9479   if (insn)
9480     {
9481       if (N32_OP6 (insn) == N32_OP6_BR1)
9482         {
9483           /* beqs label.  */
9484           comp_insn = (insn ^ 0x4000) & 0xffffc000;
9485           if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5)
9486             {
9487               /* Insn can be contracted to 16-bit implied r5.  */
9488               comp_insn16 =
9489                 (comp_insn & 0x4000) ? INSN_BNES38 : INSN_BEQS38;
9490               comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
9491             }
9492         }
9493       else if (N32_OP6 (insn) == N32_OP6_BR3)
9494         {
9495           /* bnec $ta, imm11, label.  */
9496           comp_insn = (insn ^ 0x80000) & 0xffffff00;
9497         }
9498       else
9499         {
9500           comp_insn = (insn ^ 0x10000) & 0xffffc000;
9501           if (N32_BR2_SUB (insn) == N32_BR2_BEQZ
9502               || N32_BR2_SUB (insn) == N32_BR2_BNEZ)
9503             {
9504               if (N32_IS_RT3 (insn))
9505                 {
9506                   /* Insn can be contracted to 16-bit.  */
9507                   comp_insn16 =
9508                     (comp_insn & 0x10000) ? INSN_BNEZ38 : INSN_BEQZ38;
9509                   comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
9510                 }
9511               else if (N32_RT5 (insn) == REG_R15)
9512                 {
9513                   /* Insn can be contracted to 16-bit.  */
9514                   comp_insn16 =
9515                     (comp_insn & 0x10000) ? INSN_BNES38 : INSN_BEQS38;
9516                 }
9517             }
9518         }
9519     }
9520   else
9521     {
9522       switch ((insn16 & 0xf000) >> 12)
9523         {
9524         case 0xc:
9525           /* beqz38 or bnez38 */
9526           comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
9527           comp_insn = (comp_insn16 & 0x0800) ? INSN_BNEZ : INSN_BEQZ;
9528           comp_insn |= ((comp_insn16 & 0x0700) >> 8) << 20;
9529           break;
9530
9531         case 0xd:
9532           /* beqs38 or bnes38 */
9533           comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
9534           comp_insn = (comp_insn16 & 0x0800) ? INSN_BNE : INSN_BEQ;
9535           comp_insn |= (((comp_insn16 & 0x0700) >> 8) << 20)
9536             | (REG_R5 << 15);
9537           break;
9538
9539         case 0xe:
9540           /* beqzS8 or bnezS8 */
9541           comp_insn16 = (insn16 ^ 0x0100) & 0xff00;
9542           comp_insn = (comp_insn16 & 0x0100) ? INSN_BNEZ : INSN_BEQZ;
9543           comp_insn |= REG_R15 << 20;
9544           break;
9545
9546         default:
9547           break;
9548         }
9549     }
9550   if (comp_insn && re_insn)
9551     *re_insn = comp_insn;
9552   if (comp_insn16 && re_insn16)
9553     *re_insn16 = comp_insn16;
9554 }
9555
9556 /* Relax LONGJUMP2 relocation for nds32_elf_relax_section.  */
9557
9558 static bfd_boolean
9559 nds32_elf_relax_longjump2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9560                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9561                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9562                            Elf_Internal_Shdr *symtab_hdr)
9563 {
9564   /* There are 3 variations for LONGJUMP2
9565      case 2-4;  1st insn convertible, 16-bit on,
9566      optimize off or optimize for space
9567      bnes38  rt, ra, $1 ; LONGJUMP2
9568      j       label      ; 25_PCREL
9569      $1:
9570
9571      case 4-4; 1st insn not convertible
9572      bne  rt, ra, $1 ; LONGJUMP2
9573      j    label      ; 25_PCREL
9574      $1:
9575
9576      case 4-4; 1st insn convertible, 16-bit on, optimize for speed
9577      bne  rt, ra, $1 ; LONGJUMP2
9578      j    label      ; 25_PCREL
9579      $1: */
9580
9581   /* Get the reloc for the address from which the register is
9582      being loaded.  This reloc will tell us which function is
9583      actually being called.  */
9584
9585   bfd_vma laddr;
9586   int seq_len;  /* Original length of instruction sequence.  */
9587   Elf_Internal_Rela *i2_irelfn, *cond_irelfn, *irelend;
9588   int pic_ext_target = 0, first_size;
9589   unsigned int i;
9590   bfd_signed_vma foff;
9591   uint32_t insn, re_insn = 0;
9592   uint16_t insn16, re_insn16 = 0;
9593   unsigned long reloc, cond_reloc;
9594
9595   enum elf_nds32_reloc_type checked_types[] =
9596     { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
9597
9598   irelend = internal_relocs + sec->reloc_count;
9599   seq_len = GET_SEQ_LEN (irel->r_addend);
9600   laddr = irel->r_offset;
9601   *insn_len = seq_len;
9602   first_size = (seq_len == 6) ? 2 : 4;
9603
9604   i2_irelfn =
9605     find_relocs_at_address_addr (irel, internal_relocs,
9606                                  irelend, R_NDS32_25_PCREL_RELA,
9607                                  laddr + first_size);
9608
9609   for (i = 0; i < sizeof (checked_types) / sizeof(checked_types[0]); i++)
9610     {
9611       cond_irelfn =
9612         find_relocs_at_address_addr (irel, internal_relocs, irelend,
9613                                      checked_types[i], laddr);
9614       if (cond_irelfn != irelend)
9615         break;
9616     }
9617
9618   if (i2_irelfn == irelend || cond_irelfn == irelend)
9619     {
9620       _bfd_error_handler
9621         ("%B: warning: R_NDS32_LONGJUMP2 points to unrecognized"
9622          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
9623       return FALSE;
9624     }
9625
9626   /* Get the value of the symbol referred to by the reloc.  */
9627   foff =
9628     calculate_offset (abfd, sec, i2_irelfn, isymbuf, symtab_hdr,
9629                       &pic_ext_target);
9630   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_16BIT_S1
9631       || foff >= CONSERVATIVE_16BIT_S1)
9632     return FALSE;
9633
9634   /* Get the all corresponding instructions.  */
9635   if (first_size == 4)
9636     {
9637       insn = bfd_getb32 (contents + laddr);
9638       nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
9639     }
9640   else
9641     {
9642       insn16 = bfd_getb16 (contents + laddr);
9643       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
9644     }
9645
9646   if (re_insn16 && foff >= -(ACCURATE_8BIT_S1 - first_size)
9647       && foff < ACCURATE_8BIT_S1 - first_size)
9648     {
9649       if (first_size == 4)
9650         {
9651           /* Don't convert it to 16-bit now, keep this as relaxable for
9652              ``label reloc; INSN16''.  */
9653
9654           /* Save comp_insn32 to buffer.  */
9655           bfd_putb32 (re_insn, contents + irel->r_offset);
9656           *insn_len = 4;
9657           reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
9658             R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
9659           cond_reloc = R_NDS32_INSN16;
9660         }
9661       else
9662         {
9663           bfd_putb16 (re_insn16, contents + irel->r_offset);
9664           *insn_len = 2;
9665           reloc = R_NDS32_9_PCREL_RELA;
9666           cond_reloc = R_NDS32_NONE;
9667         }
9668     }
9669   else if (N32_OP6 (re_insn) == N32_OP6_BR1
9670            && (foff >= -(ACCURATE_14BIT_S1 - first_size)
9671                && foff < ACCURATE_14BIT_S1 - first_size))
9672     {
9673       /* beqs     label    ; 15_PCREL */
9674       bfd_putb32 (re_insn, contents + irel->r_offset);
9675       *insn_len = 4;
9676       reloc = R_NDS32_15_PCREL_RELA;
9677       cond_reloc = R_NDS32_NONE;
9678     }
9679   else if (N32_OP6 (re_insn) == N32_OP6_BR2
9680            && foff >= -CONSERVATIVE_16BIT_S1
9681            && foff < CONSERVATIVE_16BIT_S1)
9682     {
9683       /* beqz     label ; 17_PCREL */
9684       bfd_putb32 (re_insn, contents + irel->r_offset);
9685       *insn_len = 4;
9686       reloc = R_NDS32_17_PCREL_RELA;
9687       cond_reloc = R_NDS32_NONE;
9688     }
9689   else
9690     return FALSE;
9691
9692   /* Set all relocations.  */
9693   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info), reloc);
9694   irel->r_addend = i2_irelfn->r_addend;
9695
9696   cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
9697                                       cond_reloc);
9698   cond_irelfn->r_addend = 0;
9699
9700   if ((seq_len ^ *insn_len ) & 0x2)
9701     {
9702       insn16 = NDS32_NOP16;
9703       bfd_putb16 (insn16, contents + irel->r_offset + 4);
9704       i2_irelfn->r_offset = 4;
9705       i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
9706                                         R_NDS32_INSN16);
9707       i2_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9708       *insn_len += 2;
9709     }
9710   else
9711     i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
9712                                       R_NDS32_NONE);
9713   return TRUE;
9714 }
9715
9716 /* Relax LONGJUMP3 relocation for nds32_elf_relax_section.  */
9717
9718 static bfd_boolean
9719 nds32_elf_relax_longjump3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9720                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9721                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9722                            Elf_Internal_Shdr *symtab_hdr)
9723 {
9724   /* There are 5 variations for LONGJUMP3
9725      case 1: 2-4-4-2; 1st insn convertible, 16-bit on,
9726      optimize off or optimize for space
9727      bnes38   rt, ra, $1            ; LONGJUMP3
9728      sethi    ta, hi20(symbol)      ; HI20
9729      ori      ta, ta, lo12(symbol)  ; LO12S0
9730      jr5      ta                    ;
9731      $1:                            ;
9732
9733      case 2: 2-4-4-2; 1st insn convertible, 16-bit on, optimize for speed
9734      bnes38   rt, ra, $1           ; LONGJUMP3
9735      sethi    ta, hi20(symbol)     ; HI20
9736      ori      ta, ta, lo12(symbol) ; LO12S0
9737      jr5      ta                   ;
9738      $1:                           ; LABEL
9739
9740      case 3: 4-4-4-2; 1st insn not convertible, 16-bit on,
9741      optimize off or optimize for space
9742      bne   rt, ra, $1           ; LONGJUMP3
9743      sethi ta, hi20(symbol)     ; HI20
9744      ori   ta, ta, lo12(symbol) ; LO12S0
9745      jr5   ta                   ;
9746      $1:                        ;
9747
9748      case 4: 4-4-4-4; 1st insn don't care, 16-bit off, optimize don't care
9749      16-bit off if no INSN16
9750      bne   rt, ra, $1           ; LONGJUMP3
9751      sethi ta, hi20(symbol)     ; HI20
9752      ori   ta, ta, lo12(symbol) ; LO12S0
9753      jr    ta                   ;
9754      $1:                        ;
9755
9756      case 5: 4-4-4-4; 1st insn not convertible, 16-bit on, optimize for speed
9757      16-bit off if no INSN16
9758      bne   rt, ra, $1           ; LONGJUMP3
9759      sethi ta, hi20(symbol)     ; HI20
9760      ori   ta, ta, lo12(symbol) ; LO12S0
9761      jr    ta                   ;
9762      $1:                        ; LABEL */
9763
9764   /* Get the reloc for the address from which the register is
9765      being loaded.  This reloc will tell us which function is
9766      actually being called.  */
9767   enum elf_nds32_reloc_type checked_types[] =
9768     { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
9769
9770   int reloc_off = 0, cond_removed = 0, convertible;
9771   bfd_vma laddr;
9772   int seq_len;  /* Original length of instruction sequence.  */
9773   Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
9774   int pic_ext_target = 0, first_size;
9775   unsigned int i;
9776   bfd_signed_vma foff;
9777   uint32_t insn, re_insn = 0;
9778   uint16_t insn16, re_insn16 = 0;
9779   unsigned long reloc, cond_reloc;
9780
9781   irelend = internal_relocs + sec->reloc_count;
9782   seq_len = GET_SEQ_LEN (irel->r_addend);
9783   laddr = irel->r_offset;
9784   *insn_len = seq_len;
9785
9786   convertible = IS_1ST_CONVERT (irel->r_addend);
9787
9788   if (convertible)
9789     first_size = 2;
9790   else
9791     first_size = 4;
9792
9793   /* Get all needed relocations.  */
9794   hi_irelfn =
9795     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9796                                  R_NDS32_HI20_RELA, laddr + first_size);
9797   lo_irelfn =
9798     find_relocs_at_address_addr (irel, internal_relocs, irelend,
9799                                  R_NDS32_LO12S0_ORI_RELA,
9800                                  laddr + first_size + 4);
9801
9802   for (i = 0; i < sizeof (checked_types) / sizeof (checked_types[0]); i++)
9803     {
9804       cond_irelfn =
9805         find_relocs_at_address_addr (irel, internal_relocs, irelend,
9806                                      checked_types[i], laddr);
9807       if (cond_irelfn != irelend)
9808         break;
9809     }
9810
9811   if (hi_irelfn == irelend || lo_irelfn == irelend || cond_irelfn == irelend)
9812     {
9813       _bfd_error_handler
9814         ("%B: warning: R_NDS32_LONGJUMP3 points to unrecognized"
9815          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
9816       return FALSE;
9817     }
9818
9819   /* Get the value of the symbol referred to by the reloc.  */
9820   foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr,
9821                            &pic_ext_target);
9822
9823   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
9824       || foff >= CONSERVATIVE_24BIT_S1)
9825     return FALSE;
9826
9827   /* Get the all corresponding instructions.  */
9828   if (first_size == 4)
9829     {
9830       insn = bfd_getb32 (contents + laddr);
9831       nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
9832     }
9833   else
9834     {
9835       insn16 = bfd_getb16 (contents + laddr);
9836       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
9837     }
9838
9839   /* For simplicity of coding, we are going to modify the section
9840      contents, the section relocs, and the BFD symbol table.  We
9841      must tell the rest of the code not to free up this
9842      information.  It would be possible to instead create a table
9843      of changes which have to be made, as is done in coff-mips.c;
9844      that would be more work, but would require less memory when
9845      the linker is run.  */
9846
9847   if (re_insn16 && foff >= -ACCURATE_8BIT_S1 - first_size
9848       && foff < ACCURATE_8BIT_S1 - first_size)
9849     {
9850       if (!(seq_len & 0x2))
9851         {
9852           /* Don't convert it to 16-bit now, keep this as relaxable
9853              for ``label reloc; INSN1a''6.  */
9854           /* Save comp_insn32 to buffer.  */
9855           bfd_putb32 (re_insn, contents + irel->r_offset);
9856           *insn_len = 4;
9857           reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
9858             R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
9859           cond_reloc = R_NDS32_INSN16;
9860         }
9861       else
9862         {
9863           /* Not optimize for speed; convert sequence to 16-bit.  */
9864           /* Save comp_insn16 to buffer.  */
9865           bfd_putb16 (re_insn16, contents + irel->r_offset);
9866           *insn_len = 2;
9867           reloc = R_NDS32_9_PCREL_RELA;
9868           cond_reloc = R_NDS32_NONE;
9869         }
9870       cond_removed = 1;
9871     }
9872   else if (N32_OP6 (re_insn) == N32_OP6_BR1
9873            && (foff >= -(ACCURATE_14BIT_S1 - first_size)
9874                && foff < ACCURATE_14BIT_S1 - first_size))
9875     {
9876       /* beqs     label    ; 15_PCREL */
9877       bfd_putb32 (re_insn, contents + irel->r_offset);
9878       *insn_len = 4;
9879       reloc = R_NDS32_15_PCREL_RELA;
9880       cond_reloc = R_NDS32_NONE;
9881       cond_removed = 1;
9882     }
9883   else if (N32_OP6 (re_insn) == N32_OP6_BR2
9884            && foff >= -CONSERVATIVE_16BIT_S1
9885            && foff < CONSERVATIVE_16BIT_S1)
9886     {
9887       /* beqz     label ; 17_PCREL */
9888       bfd_putb32 (re_insn, contents + irel->r_offset);
9889       *insn_len = 4;
9890       reloc = R_NDS32_17_PCREL_RELA;
9891       cond_reloc = R_NDS32_NONE;
9892       cond_removed = 1;
9893     }
9894   else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
9895            && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
9896     {
9897       /* Relax to one of the following 3 variations
9898
9899          case 2-4; 1st insn convertible, 16-bit on, optimize off or optimize
9900          for space
9901          bnes38  rt, $1 ; LONGJUMP2
9902          j       label  ; 25_PCREL
9903          $1
9904
9905          case 4-4; 1st insn not convertible, others don't care
9906          bne   rt, ra, $1 ; LONGJUMP2
9907          j     label      ; 25_PCREL
9908          $1
9909
9910          case 4-4; 1st insn convertible, 16-bit on, optimize for speed
9911          bne   rt, ra, $1 ; LONGJUMP2
9912          j     label      ; 25_PCREL
9913          $1 */
9914
9915       /* Offset for first instruction.  */
9916
9917       /* Use j label as second instruction.  */
9918       *insn_len = 4 + first_size;
9919       insn = INSN_J;
9920       bfd_putb32 (insn, contents + hi_irelfn->r_offset);
9921       reloc = R_NDS32_LONGJUMP2;
9922       cond_reloc = R_NDS32_25_PLTREL;
9923     }
9924     else
9925       return FALSE;
9926
9927     if (cond_removed == 1)
9928       {
9929         /* Set all relocations.  */
9930         irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
9931         irel->r_addend = hi_irelfn->r_addend;
9932
9933         cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
9934                                             cond_reloc);
9935         cond_irelfn->r_addend = 0;
9936         hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9937                                           R_NDS32_NONE);
9938       }
9939     else
9940       {
9941         irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
9942         irel->r_addend = irel->r_addend;
9943         hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
9944                                           cond_reloc);
9945       }
9946
9947   if ((seq_len ^ *insn_len ) & 0x2)
9948     {
9949       insn16 = NDS32_NOP16;
9950       bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
9951       lo_irelfn->r_offset = *insn_len;
9952       lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
9953                                         R_NDS32_INSN16);
9954       lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
9955       *insn_len += 2;
9956     }
9957   else
9958     lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
9959                                       R_NDS32_NONE);
9960   return TRUE;
9961 }
9962
9963 /* Relax LONGCALL4 relocation for nds32_elf_relax_section.  */
9964
9965 static bfd_boolean
9966 nds32_elf_relax_longcall4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
9967                            Elf_Internal_Rela *internal_relocs, int *insn_len,
9968                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
9969                            Elf_Internal_Shdr *symtab_hdr)
9970 {
9971   /* The pattern for LONGCALL4.  Support for function cse.
9972      sethi ta, hi20(symbol)     ; LONGCALL4/HI20
9973      ori   ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
9974      jral  ta                   ; PTR_RES/EMPTY/INSN16  */
9975
9976   bfd_vma laddr;
9977   uint32_t insn;
9978   Elf_Internal_Rela *hi_irel, *ptr_irel, *insn_irel, *em_irel, *call_irel;
9979   Elf_Internal_Rela *irelend;
9980   int pic_ext_target = 0;
9981   bfd_signed_vma foff;
9982
9983   irelend = internal_relocs + sec->reloc_count;
9984   laddr = irel->r_offset;
9985
9986   /* Get the reloc for the address from which the register is
9987      being loaded.  This reloc will tell us which function is
9988      actually being called.  */
9989   hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
9990                                          R_NDS32_HI20_RELA, laddr);
9991
9992   if (hi_irel == irelend)
9993     {
9994       _bfd_error_handler
9995         ("%B: warning: R_NDS32_LONGCALL4 points to unrecognized"
9996          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
9997       return FALSE;
9998     }
9999
10000   /* Get the value of the symbol referred to by the reloc.  */
10001   foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr,
10002                            &pic_ext_target);
10003
10004   /* This condition only happened when symbol is undefined.  */
10005   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
10006       || foff >= CONSERVATIVE_24BIT_S1)
10007     return FALSE;
10008
10009   /* Relax to: jal symbol; 25_PCREL */
10010   /* For simplicity of coding, we are going to modify the section
10011      contents, the section relocs, and the BFD symbol table.  We
10012      must tell the rest of the code not to free up this
10013      information.  It would be possible to instead create a table
10014      of changes which have to be made, as is done in coff-mips.c;
10015      that would be more work, but would require less memory when
10016      the linker is run.  */
10017
10018   ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10019                                           R_NDS32_PTR_RESOLVED, irel->r_addend);
10020   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10021                                           R_NDS32_EMPTY, irel->r_addend);
10022
10023   if (ptr_irel == irelend || em_irel == irelend)
10024     {
10025       _bfd_error_handler
10026         ("%B: warning: R_NDS32_LONGCALL4 points to unrecognized"
10027          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
10028       return FALSE;
10029     }
10030   /* Check these is enough space to insert jal in R_NDS32_EMPTY.  */
10031   insn = bfd_getb32 (contents + irel->r_addend);
10032   if (insn & 0x80000000)
10033     return FALSE;
10034
10035   /* Replace the long call with a jal.  */
10036   em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
10037                                   R_NDS32_25_PCREL_RELA);
10038   ptr_irel->r_addend = 1;
10039
10040   /* We don't resolve this here but resolve it in relocate_section.  */
10041   insn = INSN_JAL;
10042   bfd_putb32 (insn, contents + em_irel->r_offset);
10043
10044   irel->r_info =
10045     ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10046
10047   /* If there is function cse, HI20 can not remove now.  */
10048   call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10049                                            R_NDS32_LONGCALL4, laddr);
10050   if (call_irel == irelend)
10051     {
10052       *insn_len = 0;
10053       hi_irel->r_info =
10054         ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
10055     }
10056
10057   insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10058                                           R_NDS32_INSN16, irel->r_addend);
10059   if (insn_irel != irelend)
10060     insn_irel->r_info =
10061       ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10062
10063   return TRUE;
10064 }
10065
10066 /* Relax LONGCALL5 relocation for nds32_elf_relax_section.  */
10067
10068 static bfd_boolean
10069 nds32_elf_relax_longcall5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10070                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10071                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10072                            Elf_Internal_Shdr *symtab_hdr)
10073 {
10074   /* The pattern for LONGCALL5.
10075      bltz  rt, .L1      ; LONGCALL5/17_PCREL
10076      jal   symbol       ; 25_PCREL
10077      .L1:  */
10078
10079   bfd_vma laddr;
10080   uint32_t insn;
10081   Elf_Internal_Rela *cond_irel, *irelend;
10082   int pic_ext_target = 0;
10083   bfd_signed_vma foff;
10084
10085   irelend = internal_relocs + sec->reloc_count;
10086   laddr = irel->r_offset;
10087   insn = bfd_getb32 (contents + laddr);
10088
10089   /* Get the reloc for the address from which the register is
10090      being loaded.  This reloc will tell us which function is
10091      actually being called.  */
10092   cond_irel =
10093     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10094                                  R_NDS32_25_PCREL_RELA, irel->r_addend);
10095   if (cond_irel == irelend)
10096     {
10097       _bfd_error_handler
10098         ("%B: warning: R_NDS32_LONGCALL5 points to unrecognized"
10099          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
10100       return FALSE;
10101     }
10102
10103   /* Get the value of the symbol referred to by the reloc.  */
10104   foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr,
10105                            &pic_ext_target);
10106
10107   if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1
10108       || foff >= CONSERVATIVE_16BIT_S1)
10109     return FALSE;
10110
10111   /* Relax to   bgezal   rt, label ; 17_PCREL
10112      or         bltzal   rt, label ; 17_PCREL */
10113
10114   /* Convert to complimentary conditional call.  */
10115   insn = CONVERT_CONDITION_CALL (insn);
10116
10117   /* For simplicity of coding, we are going to modify the section
10118      contents, the section relocs, and the BFD symbol table.  We
10119      must tell the rest of the code not to free up this
10120      information.  It would be possible to instead create a table
10121      of changes which have to be made, as is done in coff-mips.c;
10122      that would be more work, but would require less memory when
10123      the linker is run.  */
10124
10125   /* Modify relocation and contents.  */
10126   cond_irel->r_info =
10127     ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_17_PCREL_RELA);
10128
10129   /* Replace the long call with a bgezal.  */
10130   bfd_putb32 (insn, contents + cond_irel->r_offset);
10131   *insn_len = 0;
10132
10133   /* Clean unnessary relocations.  */
10134   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10135
10136   cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10137                                            R_NDS32_17_PCREL_RELA, laddr);
10138   cond_irel->r_info =
10139     ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10140
10141   return TRUE;
10142 }
10143
10144 /* Relax LONGCALL6 relocation for nds32_elf_relax_section.  */
10145
10146 static bfd_boolean
10147 nds32_elf_relax_longcall6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10148                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10149                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10150                            Elf_Internal_Shdr *symtab_hdr)
10151 {
10152   /* The pattern for LONGCALL6.
10153      bltz  rt,   .L1                    ; LONGCALL6/17_PCREL
10154      sethi ta,   hi20(symbol)           ; HI20/PTR
10155      ori   ta, ta,  lo12(symbol)        ; LO12S0_ORI/PTR
10156      jral  ta                           ; PTR_RES/EMPTY/INSN16
10157      .L1  */
10158
10159   bfd_vma laddr;
10160   uint32_t insn;
10161   Elf_Internal_Rela *em_irel, *cond_irel, *irelend;
10162   int pic_ext_target = 0;
10163   bfd_signed_vma foff;
10164
10165   irelend = internal_relocs + sec->reloc_count;
10166   laddr = irel->r_offset;
10167
10168   /* Get the reloc for the address from which the register is
10169      being loaded.  This reloc will tell us which function is
10170      actually being called.  */
10171   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10172                                          R_NDS32_EMPTY, irel->r_addend);
10173
10174   if (em_irel == irelend)
10175     {
10176       _bfd_error_handler
10177         ("%B: warning: R_NDS32_LONGCALL6 points to unrecognized"
10178          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
10179       return FALSE;
10180     }
10181
10182   /* Get the value of the symbol referred to by the reloc.  */
10183   foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr,
10184                            &pic_ext_target);
10185
10186   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
10187       || foff >= CONSERVATIVE_24BIT_S1)
10188     return FALSE;
10189
10190   /* Check these is enough space to insert jal in R_NDS32_EMPTY.  */
10191   insn = bfd_getb32 (contents + irel->r_addend);
10192   if (insn & 0x80000000)
10193     return FALSE;
10194
10195   insn = bfd_getb32 (contents + laddr);
10196   if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
10197     {
10198       /* Relax to  bgezal   rt, label ; 17_PCREL
10199          or        bltzal   rt, label ; 17_PCREL */
10200
10201       /* Convert to complimentary conditional call.  */
10202       *insn_len = 0;
10203       insn = CONVERT_CONDITION_CALL (insn);
10204       bfd_putb32 (insn, contents + em_irel->r_offset);
10205
10206       em_irel->r_info =
10207         ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_17_PCREL_RELA);
10208
10209       /* Set resolved relocation.  */
10210       cond_irel =
10211         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10212                                      R_NDS32_PTR_RESOLVED, irel->r_addend);
10213       if (cond_irel == irelend)
10214         {
10215           _bfd_error_handler
10216             ("%B: warning: R_NDS32_LONGCALL6 points to unrecognized"
10217              "reloc at 0x%lx.", abfd, (long) irel->r_offset);
10218           return FALSE;
10219         }
10220       cond_irel->r_addend = 1;
10221
10222       /* Clear relocations.  */
10223
10224       irel->r_info =
10225         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10226
10227       cond_irel =
10228         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10229                                      R_NDS32_17_PCREL_RELA, laddr);
10230       if (cond_irel != irelend)
10231         cond_irel->r_info =
10232           ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10233
10234       cond_irel =
10235         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10236                                      R_NDS32_INSN16, irel->r_addend);
10237       if (cond_irel != irelend)
10238         cond_irel->r_info =
10239           ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10240
10241     }
10242   else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
10243     {
10244       /* Relax to the following instruction sequence
10245          bltz  rt, .L1  ; LONGCALL2/17_PCREL
10246          jal   symbol   ; 25_PCREL/PTR_RES
10247          .L1  */
10248       *insn_len = 4;
10249       /* Convert instruction.  */
10250       insn = INSN_JAL;
10251       bfd_putb32 (insn, contents + em_irel->r_offset);
10252
10253       /* Convert relocations.  */
10254       em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
10255                                       R_NDS32_25_PCREL_RELA);
10256       irel->r_info =
10257         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL5);
10258
10259       /* Set resolved relocation.  */
10260       cond_irel =
10261         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10262                                      R_NDS32_PTR_RESOLVED, irel->r_addend);
10263       if (cond_irel == irelend)
10264         {
10265           _bfd_error_handler
10266             ("%B: warning: R_NDS32_LONGCALL6 points to unrecognized"
10267              "reloc at 0x%lx.", abfd, (long) irel->r_offset);
10268           return FALSE;
10269         }
10270       cond_irel->r_addend = 1;
10271
10272       cond_irel =
10273         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10274                                      R_NDS32_INSN16, irel->r_addend);
10275       if (cond_irel != irelend)
10276         cond_irel->r_info =
10277           ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10278     }
10279   return TRUE;
10280 }
10281
10282 /* Relax LONGJUMP4 relocation for nds32_elf_relax_section.  */
10283
10284 static bfd_boolean
10285 nds32_elf_relax_longjump4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10286                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10287                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10288                            Elf_Internal_Shdr *symtab_hdr)
10289 {
10290   /* The pattern for LONGJUMP4.
10291      sethi ta, hi20(symbol)     ; LONGJUMP4/HI20
10292      ori   ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10293      jr    ta                   ; PTR_RES/INSN16/EMPTY  */
10294
10295   bfd_vma laddr;
10296   int seq_len;  /* Original length of instruction sequence.  */
10297   uint32_t insn;
10298   Elf_Internal_Rela *hi_irel, *ptr_irel, *em_irel, *call_irel, *irelend;
10299   int pic_ext_target = 0;
10300   bfd_signed_vma foff;
10301
10302   irelend = internal_relocs + sec->reloc_count;
10303   seq_len = GET_SEQ_LEN (irel->r_addend);
10304   laddr = irel->r_offset;
10305   *insn_len = seq_len;
10306
10307   /* Get the reloc for the address from which the register is
10308      being loaded.  This reloc will tell us which function is
10309      actually being called.  */
10310
10311   hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10312                                          R_NDS32_HI20_RELA, laddr);
10313
10314   if (hi_irel == irelend)
10315     {
10316       _bfd_error_handler
10317         ("%B: warning: R_NDS32_LONGJUMP4 points to unrecognized"
10318          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
10319       return FALSE;
10320     }
10321
10322   /* Get the value of the symbol referred to by the reloc.  */
10323   foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr,
10324                            &pic_ext_target);
10325
10326   if (pic_ext_target || foff == 0 || foff >= CONSERVATIVE_24BIT_S1
10327       || foff < -CONSERVATIVE_24BIT_S1)
10328     return FALSE;
10329
10330   /* Convert it to "j label", it may be converted to j8 in the final
10331      pass of relaxation.  Therefore, we do not consider this currently.  */
10332   ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10333                                           R_NDS32_PTR_RESOLVED, irel->r_addend);
10334   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10335                                          R_NDS32_EMPTY, irel->r_addend);
10336
10337   if (ptr_irel == irelend || em_irel == irelend)
10338     {
10339       _bfd_error_handler
10340         ("%B: warning: R_NDS32_LONGJUMP4 points to unrecognized"
10341          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
10342       return FALSE;
10343     }
10344
10345   em_irel->r_info =
10346     ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_25_PCREL_RELA);
10347   ptr_irel->r_addend = 1;
10348
10349   /* Write instruction.  */
10350   insn = INSN_J;
10351   bfd_putb32 (insn, contents + em_irel->r_offset);
10352
10353   /* Clear relocations.  */
10354   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10355
10356   /* If there is function cse, HI20 can not remove now.  */
10357   call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10358                                            R_NDS32_LONGJUMP4, laddr);
10359   if (call_irel == irelend)
10360     {
10361       *insn_len = 0;
10362       hi_irel->r_info =
10363         ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
10364     }
10365
10366   return TRUE;
10367 }
10368
10369 /* Relax LONGJUMP5 relocation for nds32_elf_relax_section.  */
10370
10371 static bfd_boolean
10372 nds32_elf_relax_longjump5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10373                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10374                            int *seq_len, bfd_byte *contents,
10375                            Elf_Internal_Sym *isymbuf,
10376                            Elf_Internal_Shdr *symtab_hdr)
10377 {
10378   /* There are 2 variations for LONGJUMP5
10379      case 2-4;  1st insn convertible, 16-bit on.
10380      bnes38  rt, ra, .L1        ; LONGJUMP5/9_PCREL/INSN16
10381      j       label              ; 25_PCREL/INSN16
10382      $1:
10383
10384      case 4-4; 1st insn not convertible
10385      bne  rt, ra, .L1   ; LONGJUMP5/15_PCREL/INSN16
10386      j    label         ; 25_PCREL/INSN16
10387      .L1:  */
10388
10389   bfd_vma laddr;
10390   Elf_Internal_Rela *cond_irel,  *irelend;
10391   int pic_ext_target = 0;
10392   unsigned int i;
10393   bfd_signed_vma foff;
10394   uint32_t insn, re_insn = 0;
10395   uint16_t insn16, re_insn16 = 0;
10396   unsigned long reloc;
10397
10398   enum elf_nds32_reloc_type checked_types[] =
10399     { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
10400       R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
10401
10402   irelend = internal_relocs + sec->reloc_count;
10403   laddr = irel->r_offset;
10404
10405   /* Get the reloc for the address from which the register is
10406      being loaded.  This reloc will tell us which function is
10407      actually being called.  */
10408
10409   cond_irel =
10410     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10411                                  R_NDS32_25_PCREL_RELA, irel->r_addend);
10412   if (cond_irel == irelend)
10413     {
10414       _bfd_error_handler
10415         ("%B: warning: R_NDS32_LONGJUMP5 points to unrecognized"
10416          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
10417       return FALSE;
10418     }
10419
10420   /* Get the value of the symbol referred to by the reloc.  */
10421   foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr,
10422                            &pic_ext_target);
10423
10424   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_16BIT_S1
10425       || foff >= CONSERVATIVE_16BIT_S1)
10426     return FALSE;
10427
10428   /* Get the all corresponding instructions.  */
10429   insn = bfd_getb32 (contents + laddr);
10430   /* Check instruction size.  */
10431   if (insn & 0x80000000)
10432     {
10433       *seq_len = 0;
10434       insn16 = insn >> 16;
10435       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
10436     }
10437   else
10438     nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
10439
10440   if (N32_OP6 (re_insn) == N32_OP6_BR1
10441       && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
10442     {
10443       /* beqs label ; 15_PCREL.  */
10444       bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10445       reloc = R_NDS32_15_PCREL_RELA;
10446     }
10447   else if (N32_OP6 (re_insn) == N32_OP6_BR2
10448            && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
10449     {
10450       /* beqz label ; 17_PCREL.  */
10451       bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10452       reloc = R_NDS32_17_PCREL_RELA;
10453     }
10454   else if ( N32_OP6 (re_insn) == N32_OP6_BR3
10455            && foff >= -CONSERVATIVE_8BIT_S1 && foff < CONSERVATIVE_8BIT_S1)
10456     {
10457       /* beqc label ; 9_PCREL.  */
10458       bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10459       reloc = R_NDS32_WORD_9_PCREL_RELA;
10460     }
10461   else
10462     return FALSE;
10463
10464   /* Set all relocations.  */
10465   cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), reloc);
10466
10467   /* Clean relocations.  */
10468   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10469   for (i = 0; i < sizeof (checked_types) / sizeof (checked_types[0]); i++)
10470     {
10471       cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10472                                                checked_types[i], laddr);
10473       if (cond_irel != irelend)
10474         {
10475           if (*seq_len == 0
10476               && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
10477             {
10478               /* If the branch instruction is 2 byte, it cannot remove
10479                  directly.  Only convert it to nop16 and remove it after
10480                  checking alignment issue.  */
10481               insn16 = NDS32_NOP16;
10482               bfd_putb16 (insn16, contents + laddr);
10483               cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10484             }
10485           else
10486             cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10487                                               R_NDS32_NONE);
10488         }
10489     }
10490   *insn_len = 0;
10491
10492   return TRUE;
10493 }
10494
10495 /* Relax LONGJUMP6 relocation for nds32_elf_relax_section.  */
10496
10497 static bfd_boolean
10498 nds32_elf_relax_longjump6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10499                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10500                            int *seq_len, bfd_byte *contents,
10501                            Elf_Internal_Sym *isymbuf,
10502                            Elf_Internal_Shdr *symtab_hdr)
10503 {
10504   /* There are 5 variations for LONGJUMP6
10505      case : 2-4-4-4; 1st insn convertible, 16-bit on.
10506      bnes38   rt, ra, .L1               ; LONGJUMP6/15_PCREL/INSN16
10507      sethi    ta, hi20(symbol)          ; HI20/PTR
10508      ori      ta, ta, lo12(symbol)      ; LO12S0_ORI/PTR
10509      jr       ta                        ; PTR_RES/INSN16/EMPTY
10510      .L1:
10511
10512      case : 4-4-4-4; 1st insn not convertible, 16-bit on.
10513      bne   rt, ra, .L1          ; LONGJUMP6/15_PCREL/INSN16
10514      sethi ta, hi20(symbol)     ; HI20/PTR
10515      ori   ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
10516      jr    ta                   ; PTR_RES/INSN16/EMPTY
10517      .L1:  */
10518
10519   enum elf_nds32_reloc_type checked_types[] =
10520     { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
10521       R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
10522
10523   int reloc_off = 0, cond_removed = 0;
10524   bfd_vma laddr;
10525   Elf_Internal_Rela *cond_irel, *em_irel, *irelend, *insn_irel;
10526   int pic_ext_target = 0;
10527   unsigned int i;
10528   bfd_signed_vma foff;
10529   uint32_t insn, re_insn = 0;
10530   uint16_t insn16, re_insn16 = 0;
10531   unsigned long reloc;
10532
10533   irelend = internal_relocs + sec->reloc_count;
10534   laddr = irel->r_offset;
10535
10536   /* Get the reloc for the address from which the register is
10537      being loaded.  This reloc will tell us which function is
10538      actually being called.  */
10539   em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10540                                          R_NDS32_EMPTY, irel->r_addend);
10541
10542   if (em_irel == irelend)
10543     {
10544       _bfd_error_handler
10545         ("%B: warning: R_NDS32_LONGJUMP6 points to unrecognized"
10546          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
10547       return FALSE;
10548     }
10549
10550   /* Get the value of the symbol referred to by the reloc.  */
10551   foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr,
10552                            &pic_ext_target);
10553
10554   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_24BIT_S1
10555       || foff >= CONSERVATIVE_24BIT_S1)
10556     return FALSE;
10557
10558   insn = bfd_getb32 (contents + laddr);
10559   /* Check instruction size.  */
10560   if (insn & 0x80000000)
10561     {
10562       *seq_len = 0;
10563       insn16 = insn >> 16;
10564       nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
10565     }
10566   else
10567     nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
10568
10569   /* For simplicity of coding, we are going to modify the section
10570      contents, the section relocs, and the BFD symbol table.  We
10571      must tell the rest of the code not to free up this
10572      information.  It would be possible to instead create a table
10573      of changes which have to be made, as is done in coff-mips.c;
10574      that would be more work, but would require less memory when
10575      the linker is run.  */
10576
10577   if (N32_OP6 (re_insn) == N32_OP6_BR1
10578       && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
10579     {
10580       /* beqs     label    ; 15_PCREL */
10581       bfd_putb32 (re_insn, contents + em_irel->r_offset);
10582       reloc = R_NDS32_15_PCREL_RELA;
10583       cond_removed = 1;
10584     }
10585   else if (N32_OP6 (re_insn) == N32_OP6_BR2
10586            && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
10587     {
10588       /* beqz     label ; 17_PCREL */
10589       bfd_putb32 (re_insn, contents + em_irel->r_offset);
10590       reloc = R_NDS32_17_PCREL_RELA;
10591       cond_removed = 1;
10592     }
10593   else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
10594            && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
10595     {
10596       /* Relax to one of the following 2 variations
10597
10598          case 2-4;  1st insn convertible, 16-bit on.
10599          bnes38  rt, ra, .L1    ; LONGJUMP5/9_PCREL/INSN16
10600          j       label          ; 25_PCREL/INSN16
10601          $1:
10602
10603          case 4-4; 1st insn not convertible
10604          bne  rt, ra, .L1       ; LONGJUMP5/15_PCREL/INSN16
10605          j    label             ; 25_PCREL/INSN16
10606          .L1:  */
10607
10608       /* Use j label as second instruction.  */
10609       insn = INSN_J;
10610       reloc = R_NDS32_25_PCREL_RELA;
10611       bfd_putb32 (insn, contents + em_irel->r_offset);
10612     }
10613   else
10614     return FALSE;
10615
10616   /* Set all relocations.  */
10617   em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), reloc);
10618
10619   cond_irel =
10620     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10621                                  R_NDS32_PTR_RESOLVED, em_irel->r_offset);
10622   cond_irel->r_addend = 1;
10623
10624   /* Use INSN16 of first branch instruction to distinguish if keeping
10625      INSN16 of final instruction or not.  */
10626   insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10627                                            R_NDS32_INSN16, irel->r_offset);
10628   if (insn_irel == irelend)
10629     {
10630       /* Clean the final INSN16.  */
10631       insn_irel =
10632         find_relocs_at_address_addr (irel, internal_relocs, irelend,
10633                                      R_NDS32_INSN16, em_irel->r_offset);
10634       insn_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10635                                         R_NDS32_NONE);
10636     }
10637
10638   if (cond_removed == 1)
10639     {
10640       *insn_len = 0;
10641
10642       /* Clear relocations.  */
10643       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10644
10645       for (i = 0; i < sizeof (checked_types) / sizeof (checked_types[0]); i++)
10646         {
10647           cond_irel =
10648             find_relocs_at_address_addr (irel, internal_relocs, irelend,
10649                                          checked_types[i], laddr);
10650           if (cond_irel != irelend)
10651             {
10652               if (*seq_len == 0
10653                   && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
10654                 {
10655                   /* If the branch instruction is 2 byte, it cannot remove
10656                      directly.  Only convert it to nop16 and remove it after
10657                      checking alignment issue.  */
10658                   insn16 = NDS32_NOP16;
10659                   bfd_putb16 (insn16, contents + laddr);
10660                   cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10661                 }
10662               else
10663                 cond_irel->r_info =
10664                   ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
10665             }
10666         }
10667     }
10668   else
10669     {
10670       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
10671                                    R_NDS32_LONGJUMP5);
10672     }
10673
10674   return TRUE;
10675 }
10676
10677 /* Relax LONGJUMP7 relocation for nds32_elf_relax_section.  */
10678
10679 static bfd_boolean
10680 nds32_elf_relax_longjump7 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
10681                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10682                            int *seq_len, bfd_byte *contents,
10683                            Elf_Internal_Sym *isymbuf,
10684                            Elf_Internal_Shdr *symtab_hdr)
10685 {
10686   /* There are 2 variations for LONGJUMP5
10687      case 2-4;  1st insn convertible, 16-bit on.
10688      movi55  ta, imm11          ; LONGJUMP7/INSN16
10689      beq     rt, ta, label      ; 15_PCREL
10690
10691      case 4-4; 1st insn not convertible
10692      movi55  ta, imm11          ; LONGJUMP7/INSN16
10693      beq     rt, ta, label      ; 15_PCREL  */
10694
10695   bfd_vma laddr;
10696   Elf_Internal_Rela *cond_irel,  *irelend, *insn_irel;
10697   int pic_ext_target = 0;
10698   bfd_signed_vma foff;
10699   uint32_t insn, re_insn = 0;
10700   uint16_t insn16;
10701   uint32_t imm11;
10702
10703   irelend = internal_relocs + sec->reloc_count;
10704   laddr = irel->r_offset;
10705
10706   /* Get the reloc for the address from which the register is
10707      being loaded.  This reloc will tell us which function is
10708      actually being called.  */
10709
10710   cond_irel =
10711     find_relocs_at_address_addr (irel, internal_relocs, irelend,
10712                                  R_NDS32_15_PCREL_RELA, irel->r_addend);
10713   if (cond_irel == irelend)
10714     {
10715       _bfd_error_handler
10716         ("%B: warning: R_NDS32_LONGJUMP7 points to unrecognized"
10717          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
10718       return FALSE;
10719     }
10720
10721   /* Get the value of the symbol referred to by the reloc.  */
10722   foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr,
10723                            &pic_ext_target);
10724
10725   if (pic_ext_target || foff == 0 || foff < -CONSERVATIVE_8BIT_S1
10726       || foff >= CONSERVATIVE_8BIT_S1)
10727     return FALSE;
10728
10729   /* Get the first instruction for its size.  */
10730   insn = bfd_getb32 (contents + laddr);
10731   if (insn & 0x80000000)
10732     {
10733       *seq_len = 0;
10734       /* Get the immediate from movi55.  */
10735       imm11 = N16_IMM5S (insn >> 16);
10736     }
10737   else
10738     {
10739       /* Get the immediate from movi.  */
10740       imm11 = N32_IMM20S (insn);
10741     }
10742
10743   /* Get the branch instruction.  */
10744   insn = bfd_getb32 (contents + irel->r_addend);
10745   /* Convert instruction to BR3.  */
10746   if ((insn >> 14) & 0x1)
10747     re_insn = N32_BR3 (BNEC, N32_RT5 (insn), imm11, 0);
10748   else
10749     re_insn = N32_BR3 (BEQC, N32_RT5 (insn), imm11, 0);
10750
10751   bfd_putb32 (re_insn, contents + cond_irel->r_offset);
10752
10753   /* Set all relocations.  */
10754   cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10755                                     R_NDS32_WORD_9_PCREL_RELA);
10756
10757   /* Clean relocations.  */
10758   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10759   insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10760                                            R_NDS32_INSN16, irel->r_offset);
10761   if (insn_irel != irelend)
10762     {
10763       if (*seq_len == 0)
10764         {
10765           /* If the first insntruction is 16bit, convert it to nop16.  */
10766           insn16 = NDS32_NOP16;
10767           bfd_putb16 (insn16, contents + laddr);
10768           insn_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
10769         }
10770       else
10771         cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
10772                                           R_NDS32_NONE);
10773     }
10774   *insn_len = 0;
10775
10776   return TRUE;
10777 }
10778
10779 #define GET_LOADSTORE_RANGE(addend) (((addend) >> 8) & 0x3f)
10780
10781 /* Relax LOADSTORE relocation for nds32_elf_relax_section.  */
10782
10783 static bfd_boolean
10784 nds32_elf_relax_loadstore (struct bfd_link_info *link_info, bfd *abfd,
10785                            asection *sec, Elf_Internal_Rela *irel,
10786                            Elf_Internal_Rela *internal_relocs, int *insn_len,
10787                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
10788                            Elf_Internal_Shdr *symtab_hdr, int load_store_relax)
10789 {
10790   int eliminate_sethi = 0, range_type;
10791   unsigned int i;
10792   bfd_vma local_sda, laddr;
10793   int seq_len;  /* Original length of instruction sequence.  */
10794   uint32_t insn;
10795   Elf_Internal_Rela *hi_irelfn = NULL, *irelend;
10796   bfd_vma access_addr = 0;
10797   bfd_vma range_l = 0, range_h = 0;     /* Upper/lower bound.  */
10798   enum elf_nds32_reloc_type checked_types[] =
10799     { R_NDS32_HI20_RELA, R_NDS32_GOT_HI20,
10800       R_NDS32_GOTPC_HI20, R_NDS32_GOTOFF_HI20,
10801       R_NDS32_PLTREL_HI20, R_NDS32_PLT_GOTREL_HI20,
10802       R_NDS32_TLS_LE_HI20
10803     };
10804
10805   irelend = internal_relocs + sec->reloc_count;
10806   seq_len = GET_SEQ_LEN (irel->r_addend);
10807   laddr = irel->r_offset;
10808   *insn_len = seq_len;
10809
10810   /* Get the high part relocation.  */
10811   for (i = 0; i < ARRAY_SIZE (checked_types); i++)
10812     {
10813       hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
10814                                                checked_types[i], laddr);
10815       if (hi_irelfn != irelend)
10816         break;
10817     }
10818
10819   if (hi_irelfn == irelend)
10820     {
10821       _bfd_error_handler
10822         ("%B: warning: R_NDS32_LOADSTORE points to unrecognized"
10823          "reloc at 0x%lx.", abfd, (long) irel->r_offset);
10824         return FALSE;
10825     }
10826
10827   range_type = GET_LOADSTORE_RANGE (irel->r_addend);
10828   nds32_elf_final_sda_base (sec->output_section->owner,
10829                             link_info, &local_sda, FALSE);
10830
10831   switch (ELF32_R_TYPE (hi_irelfn->r_info))
10832     {
10833     case R_NDS32_HI20_RELA:
10834       insn = bfd_getb32 (contents + laddr);
10835       access_addr =
10836         calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
10837
10838       if (range_type == NDS32_LOADSTORE_IMM)
10839         {
10840           struct elf_link_hash_entry *h = NULL;
10841           int indx;
10842
10843           if (ELF32_R_SYM (hi_irelfn->r_info) >= symtab_hdr->sh_info)
10844             {
10845               indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
10846               h = elf_sym_hashes (abfd)[indx];
10847             }
10848
10849           if ((access_addr < CONSERVATIVE_20BIT)
10850               && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
10851             {
10852               eliminate_sethi = 1;
10853               break;
10854             }
10855
10856           /* This is avoid to relax symbol address which is fixed
10857              relocations.  Ex: _stack.  */
10858           if (h && bfd_is_abs_section (h->root.u.def.section))
10859             return FALSE;
10860         }
10861
10862       if (!load_store_relax)
10863         return FALSE;
10864
10865       /* Case for set gp register.  */
10866       if (N32_RT5 (insn) == REG_GP)
10867         break;
10868
10869       if (range_type == NDS32_LOADSTORE_FLOAT_S
10870           || range_type == NDS32_LOADSTORE_FLOAT_S)
10871         {
10872           range_l = sdata_range[0][0];
10873           range_h = sdata_range[0][1];
10874         }
10875       else
10876         {
10877           range_l = sdata_range[1][0];
10878           range_h = sdata_range[1][1];
10879         }
10880       break;
10881
10882     case R_NDS32_GOT_HI20:
10883       access_addr =
10884         calculate_got_memory_address (abfd, link_info, hi_irelfn, symtab_hdr);
10885
10886       /* If this symbol is not in .got, the return value will be -1.
10887          Since the gp value is set to SDA_BASE but not GLOBAL_OFFSET_TABLE,
10888          a negative offset is allowed.  */
10889       if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
10890           && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
10891         eliminate_sethi = 1;
10892       break;
10893
10894     case R_NDS32_PLT_GOTREL_HI20:
10895       access_addr = calculate_plt_memory_address (abfd, link_info, isymbuf,
10896                                                   hi_irelfn, symtab_hdr);
10897
10898       if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
10899           && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
10900         eliminate_sethi = 1;
10901       break;
10902
10903     case R_NDS32_GOTOFF_HI20:
10904       access_addr =
10905         calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
10906
10907       if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
10908           && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
10909         eliminate_sethi = 1;
10910       break;
10911
10912     case R_NDS32_GOTPC_HI20:
10913       /* The access_addr must consider r_addend of hi_irel.  */
10914       access_addr = sec->output_section->vma + sec->output_offset
10915         + irel->r_offset + hi_irelfn->r_addend;
10916
10917       if ((bfd_signed_vma) (local_sda - access_addr) < CONSERVATIVE_20BIT
10918           && (bfd_signed_vma) (local_sda - access_addr) >= -CONSERVATIVE_20BIT)
10919         eliminate_sethi = 1;
10920       break;
10921
10922     case R_NDS32_TLS_LE_HI20:
10923       access_addr =
10924         calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
10925       BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
10926       access_addr -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
10927       if ((range_type == NDS32_LOADSTORE_IMM)
10928           && (bfd_signed_vma) (access_addr) < CONSERVATIVE_20BIT
10929           && (bfd_signed_vma) (access_addr) >= -CONSERVATIVE_20BIT)
10930         eliminate_sethi = 1;
10931       break;
10932
10933     default:
10934       return FALSE;
10935     }
10936
10937   /* Delete sethi instruction.  */
10938   if (eliminate_sethi == 1
10939       || (local_sda <= access_addr && (access_addr - local_sda) < range_h)
10940       || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
10941     {
10942       hi_irelfn->r_info =
10943         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
10944       irel->r_info =
10945         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
10946       *insn_len = 0;
10947     }
10948   return TRUE;
10949 }
10950
10951 /* Relax LO12 relocation for nds32_elf_relax_section.  */
10952
10953 static void
10954 nds32_elf_relax_lo12 (struct bfd_link_info *link_info, bfd *abfd,
10955                       asection *sec, Elf_Internal_Rela *irel,
10956                       Elf_Internal_Rela *internal_relocs, bfd_byte *contents,
10957                       Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr)
10958 {
10959   uint32_t insn;
10960   bfd_vma local_sda, laddr;
10961   unsigned long reloc;
10962   bfd_vma access_addr;
10963   bfd_vma range_l = 0, range_h = 0;     /* Upper/lower bound.  */
10964   Elf_Internal_Rela *irelfn = NULL, *irelend;
10965   struct elf_link_hash_entry *h = NULL;
10966   int indx;
10967
10968   /* For SDA base relative relaxation.  */
10969   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
10970                             &local_sda, FALSE);
10971
10972   irelend = internal_relocs + sec->reloc_count;
10973   laddr = irel->r_offset;
10974   insn = bfd_getb32 (contents + laddr);
10975
10976   if (!is_sda_access_insn (insn) && N32_OP6 (insn) != N32_OP6_ORI)
10977     return;
10978
10979   access_addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
10980
10981   if (ELF32_R_SYM (irel->r_info) >= symtab_hdr->sh_info)
10982     {
10983       indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
10984       h = elf_sym_hashes (abfd)[indx];
10985     }
10986
10987   if (N32_OP6 (insn) == N32_OP6_ORI && access_addr < CONSERVATIVE_20BIT
10988       && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
10989     {
10990       reloc = R_NDS32_20_RELA;
10991       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
10992       insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
10993       bfd_putb32 (insn, contents + laddr);
10994     }
10995   /* This is avoid to relax symbol address which is fixed
10996      relocations.  Ex: _stack.  */
10997   else if (N32_OP6 (insn) == N32_OP6_ORI
10998            && h && bfd_is_abs_section (h->root.u.def.section))
10999     return;
11000   else
11001     {
11002       range_l = sdata_range[1][0];
11003       range_h = sdata_range[1][1];
11004       switch (ELF32_R_TYPE (irel->r_info))
11005         {
11006         case R_NDS32_LO12S0_RELA:
11007           reloc = R_NDS32_SDA19S0_RELA;
11008           break;
11009         case R_NDS32_LO12S1_RELA:
11010           reloc = R_NDS32_SDA18S1_RELA;
11011           break;
11012         case R_NDS32_LO12S2_RELA:
11013           reloc = R_NDS32_SDA17S2_RELA;
11014           break;
11015         case R_NDS32_LO12S2_DP_RELA:
11016           range_l = sdata_range[0][0];
11017           range_h = sdata_range[0][1];
11018           reloc = R_NDS32_SDA12S2_DP_RELA;
11019           break;
11020         case R_NDS32_LO12S2_SP_RELA:
11021           range_l = sdata_range[0][0];
11022           range_h = sdata_range[0][1];
11023           reloc = R_NDS32_SDA12S2_SP_RELA;
11024           break;
11025         default:
11026           return;
11027         }
11028
11029       /* There are range_h and range_l because linker has to promise
11030          all sections move cross one page together.  */
11031       if ((local_sda <= access_addr && (access_addr - local_sda) < range_h)
11032           || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
11033         {
11034           if (N32_OP6 (insn) == N32_OP6_ORI && N32_RT5 (insn) == REG_GP)
11035             {
11036               /* Maybe we should add R_NDS32_INSN16 reloc type here
11037                  or manually do some optimization.  sethi can't be
11038                  eliminated when updating $gp so the relative ori
11039                  needs to be preserved.  */
11040               return;
11041             }
11042           if (!turn_insn_to_sda_access (insn, ELF32_R_TYPE (irel->r_info),
11043                                         &insn))
11044             return;
11045           irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
11046           bfd_putb32 (insn, contents + laddr);
11047
11048           irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11049                                            R_NDS32_INSN16);
11050           /* SDA17 must keep INSN16 for converting fp_as_gp.  */
11051           if (irelfn != irelend && reloc != R_NDS32_SDA17S2_RELA)
11052             irelfn->r_info =
11053               ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_NDS32_NONE);
11054
11055         }
11056     }
11057   return;
11058 }
11059
11060 /* Relax low part of PIC instruction pattern.  */
11061
11062 static void
11063 nds32_elf_relax_piclo12 (struct bfd_link_info *link_info, bfd *abfd,
11064                          asection *sec, Elf_Internal_Rela *irel,
11065                          bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11066                          Elf_Internal_Shdr *symtab_hdr)
11067 {
11068   uint32_t insn;
11069   bfd_vma local_sda, laddr;
11070   bfd_signed_vma foff;
11071   unsigned long reloc;
11072
11073   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11074                             &local_sda, FALSE);
11075   laddr = irel->r_offset;
11076   insn = bfd_getb32 (contents + laddr);
11077
11078   if (N32_OP6 (insn) != N32_OP6_ORI)
11079     return;
11080
11081   if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12)
11082     {
11083       foff = calculate_got_memory_address (abfd, link_info, irel,
11084                                            symtab_hdr) - local_sda;
11085       reloc = R_NDS32_GOT20;
11086     }
11087   else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12)
11088     {
11089       foff = calculate_plt_memory_address (abfd, link_info, isymbuf, irel,
11090                                            symtab_hdr) - local_sda;
11091       reloc = R_NDS32_PLT_GOTREL_LO20;
11092     }
11093   else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12)
11094     {
11095       foff = calculate_memory_address (abfd, irel, isymbuf,
11096                                        symtab_hdr) - local_sda;
11097       reloc = R_NDS32_GOTOFF;
11098     }
11099   else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12)
11100     {
11101       foff = local_sda - sec->output_section->vma + sec->output_offset
11102         + irel->r_offset + irel->r_addend;
11103       reloc = R_NDS32_GOTPC20;
11104     }
11105   else
11106     return;
11107
11108   if ((foff < CONSERVATIVE_20BIT) && (foff >= -CONSERVATIVE_20BIT))
11109     {
11110       /* Turn into MOVI.  */
11111       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
11112       insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
11113       bfd_putb32 (insn, contents + laddr);
11114     }
11115 }
11116
11117 /* Relax low part of LE TLS instruction pattern.  */
11118
11119 static void
11120 nds32_elf_relax_letlslo12 (struct bfd_link_info *link_info, bfd *abfd,
11121                            Elf_Internal_Rela *irel,
11122                            bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11123                            Elf_Internal_Shdr *symtab_hdr)
11124 {
11125   uint32_t insn;
11126   bfd_vma laddr;
11127   bfd_signed_vma foff;
11128   unsigned long reloc;
11129
11130   laddr = irel->r_offset;
11131   foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11132   BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
11133   foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
11134   insn = bfd_getb32 (contents + laddr);
11135
11136   if ( (bfd_signed_vma) (foff) < CONSERVATIVE_20BIT
11137       && (bfd_signed_vma) (foff) >= -CONSERVATIVE_20BIT)
11138     {
11139       /* Pattern sethi-ori transform to movi.  */
11140       reloc = R_NDS32_TLS_LE_20;
11141       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
11142       insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
11143       bfd_putb32 (insn, contents + laddr);
11144     }
11145 }
11146
11147 /* Relax LE TLS calculate address instruction pattern.  */
11148
11149 static void
11150 nds32_elf_relax_letlsadd (struct bfd_link_info *link_info, bfd *abfd,
11151                           asection *sec, Elf_Internal_Rela *irel,
11152                           Elf_Internal_Rela *internal_relocs,
11153                           bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11154                           Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11155 {
11156   /* Local TLS non-pic
11157      sethi    ta, hi20(symbol@tpoff)      ; TLS_LE_HI20
11158      ori      ta, ta, lo12(symbol@tpoff)  ; TLS_LE_LO12
11159      add      ra, ta, tp                  ; TLS_LE_ADD */
11160
11161   uint32_t insn;
11162   bfd_vma laddr;
11163   bfd_signed_vma foff;
11164   Elf_Internal_Rela *i1_irelfn, *irelend;
11165
11166   irelend = internal_relocs + sec->reloc_count;
11167   laddr = irel->r_offset;
11168   insn = bfd_getb32 (contents + laddr);
11169   i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11170                                       R_NDS32_PTR_RESOLVED);
11171   foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11172   BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
11173   foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
11174
11175   /* The range is +/-16k.  */
11176   if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT
11177       && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT)
11178     {
11179       /* Transform add to addi.  */
11180       insn = N32_TYPE2 (ADDI, N32_RT5 (insn), N32_RB5 (insn), 0);
11181       irel->r_info =
11182         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S0);
11183
11184       bfd_putb32 (insn, contents + laddr);
11185       if (i1_irelfn != irelend)
11186         {
11187           i1_irelfn->r_addend |= 1;
11188           *again = TRUE;
11189         }
11190     }
11191 }
11192
11193 /* Relax LE TLS load store instruction pattern.  */
11194
11195 static void
11196 nds32_elf_relax_letlsls (struct bfd_link_info *link_info, bfd *abfd,
11197                          asection *sec, Elf_Internal_Rela *irel,
11198                          Elf_Internal_Rela *internal_relocs,
11199                          bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11200                          Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11201 {
11202
11203   uint32_t insn;
11204   bfd_vma laddr;
11205   bfd_signed_vma foff;
11206   Elf_Internal_Rela *i1_irelfn, *irelend;
11207   int success = 0;
11208
11209   irelend = internal_relocs + sec->reloc_count;
11210   laddr = irel->r_offset;
11211   insn = bfd_getb32 (contents + laddr);
11212   i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11213                                       R_NDS32_PTR_RESOLVED);
11214   foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11215   BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
11216   foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
11217
11218   switch ((N32_OP6 (insn) << 8) | (insn & 0xff))
11219     {
11220     case (N32_OP6_MEM << 8) | N32_MEM_LB:
11221     case (N32_OP6_MEM << 8) | N32_MEM_SB:
11222     case (N32_OP6_MEM << 8) | N32_MEM_LBS:
11223       /* The range is +/-16k.  */
11224       if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT
11225           && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT)
11226         {
11227           insn =
11228             ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
11229           irel->r_info =
11230             ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S0);
11231           success = 1;
11232           break;
11233         }
11234       /* Fall through.  */
11235     case (N32_OP6_MEM << 8) | N32_MEM_LH:
11236     case (N32_OP6_MEM << 8) | N32_MEM_SH:
11237     case (N32_OP6_MEM << 8) | N32_MEM_LHS:
11238       /* The range is +/-32k.  */
11239       if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT_S1
11240           && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT_S1)
11241         {
11242           insn =
11243             ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
11244           irel->r_info =
11245             ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S1);
11246           success = 1;
11247           break;
11248         }
11249       /* Fall through.  */
11250     case (N32_OP6_MEM << 8) | N32_MEM_LW:
11251     case (N32_OP6_MEM << 8) | N32_MEM_SW:
11252       /* The range is +/-64k.  */
11253       if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT_S2
11254           && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT_S2)
11255         {
11256           insn =
11257             ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
11258           irel->r_info =
11259             ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S2);
11260           success = 1;
11261           break;
11262         }
11263       /* Fall through.  */
11264     default:
11265       break;
11266     }
11267
11268   if (success)
11269     {
11270       bfd_putb32 (insn, contents + laddr);
11271       if (i1_irelfn != irelend)
11272         {
11273           i1_irelfn->r_addend |= 1;
11274           *again = TRUE;
11275         }
11276     }
11277 }
11278
11279 /* Relax PTR relocation for nds32_elf_relax_section.  */
11280
11281 static bfd_boolean
11282 nds32_elf_relax_ptr (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
11283                      Elf_Internal_Rela *internal_relocs, int *insn_len,
11284                      int *seq_len, bfd_byte *contents)
11285 {
11286   Elf_Internal_Rela *ptr_irel, *irelend, *count_irel, *re_irel;
11287
11288   irelend = internal_relocs + sec->reloc_count;
11289
11290   re_irel =
11291     find_relocs_at_address_addr (irel, internal_relocs, irelend,
11292                                  R_NDS32_PTR_RESOLVED, irel->r_addend);
11293
11294   if (re_irel == irelend)
11295     {
11296       _bfd_error_handler
11297         ("%B: warning: R_NDS32_PTR points to unrecognized reloc at 0x%lx.",
11298          abfd, (long) irel->r_offset);
11299       return FALSE;
11300     }
11301
11302   if (re_irel->r_addend != 1)
11303     return FALSE;
11304
11305   /* Pointed target is relaxed and no longer needs this void *,
11306      change the type to NONE.  */
11307   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11308
11309   /* Find PTR_COUNT to decide remove it or not.  If PTR_COUNT does
11310      not exist, it means only count 1 and remove it directly.  */
11311   /* TODO: I hope we can obsolate R_NDS32_COUNT in the future.  */
11312   count_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11313                                        R_NDS32_PTR_COUNT);
11314   ptr_irel = find_relocs_at_address (irel, internal_relocs, irelend,
11315                                      R_NDS32_PTR);
11316   if (count_irel != irelend)
11317     {
11318       if (--count_irel->r_addend > 0)
11319         return FALSE;
11320     }
11321
11322   if (ptr_irel != irelend)
11323     return FALSE;
11324
11325   /* If the PTR_COUNT is already 0, remove current instruction.  */
11326   *seq_len = nds32_elf_insn_size (abfd, contents, irel->r_offset);
11327   *insn_len = 0;
11328   return TRUE;
11329 }
11330
11331 /* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section.  */
11332
11333 static void
11334 nds32_elf_relax_pltgot_suff (struct bfd_link_info *link_info, bfd *abfd,
11335                              asection *sec, Elf_Internal_Rela *irel,
11336                              Elf_Internal_Rela *internal_relocs,
11337                              bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11338                              Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11339 {
11340   uint32_t insn;
11341   bfd_signed_vma foff;
11342   Elf_Internal_Rela *i1_irelfn, *irelend;
11343   bfd_vma local_sda, laddr;
11344
11345   irelend = internal_relocs + sec->reloc_count;
11346   laddr = irel->r_offset;
11347   insn = bfd_getb32 (contents + laddr);
11348
11349   /* FIXME: It's a little trouble to turn JRAL5 to JAL since
11350      we need additional space.  It might be help if we could
11351      borrow some space from instructions to be eliminated
11352      such as sethi, ori, add.  */
11353   if (insn & 0x80000000)
11354     return;
11355
11356   if (nds32_elf_check_dup_relocs
11357       (irel, internal_relocs, irelend, R_NDS32_PLT_GOT_SUFF))
11358     return;
11359
11360   i1_irelfn =
11361     find_relocs_at_address (irel, internal_relocs, irelend,
11362                             R_NDS32_PTR_RESOLVED);
11363
11364   /* FIXIT 090606
11365      The boundary should be reduced since the .plt section hasn't
11366      been created and the address of specific entry is still unknown
11367      Maybe the range between the function call and the begin of the
11368      .text section can be used to decide if the .plt is in the range
11369      of function call.  */
11370
11371   if (N32_OP6 (insn) == N32_OP6_ALU1
11372       && N32_SUB5 (insn) == N32_ALU1_ADD)
11373     {
11374       /* Get the value of the symbol referred to by the reloc.  */
11375       nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11376                                 &local_sda, FALSE);
11377       foff = (bfd_signed_vma) (calculate_plt_memory_address
11378                                (abfd, link_info, isymbuf, irel,
11379                                 symtab_hdr) - local_sda);
11380       /* This condition only happened when symbol is undefined.  */
11381       if (foff == 0)
11382         return;
11383
11384       if (foff < -CONSERVATIVE_19BIT || foff >= CONSERVATIVE_19BIT)
11385         return;
11386       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
11387                                    R_NDS32_PLT_GOTREL_LO19);
11388       /* addi.gp */
11389       insn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19));
11390     }
11391   else if (N32_OP6 (insn) == N32_OP6_JREG
11392            && N32_SUB5 (insn) == N32_JREG_JRAL)
11393     {
11394       /* Get the value of the symbol referred to by the reloc.  */
11395       foff =
11396         calculate_plt_offset (abfd, sec, link_info, isymbuf, irel, symtab_hdr);
11397       /* This condition only happened when symbol is undefined.  */
11398       if (foff == 0)
11399         return;
11400       if (foff < -CONSERVATIVE_24BIT_S1 || foff >= CONSERVATIVE_24BIT_S1)
11401         return;
11402       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_25_PLTREL);
11403       insn = INSN_JAL;
11404     }
11405   else
11406     return;
11407
11408   bfd_putb32 (insn, contents + laddr);
11409   if (i1_irelfn != irelend)
11410     {
11411       i1_irelfn->r_addend |= 1;
11412       *again = TRUE;
11413     }
11414 }
11415
11416 /* Relax GOT_SUFF relocation for nds32_elf_relax_section.  */
11417
11418 static void
11419 nds32_elf_relax_got_suff (struct bfd_link_info *link_info, bfd *abfd,
11420                           asection *sec, Elf_Internal_Rela *irel,
11421                           Elf_Internal_Rela *internal_relocs,
11422                           bfd_byte *contents, Elf_Internal_Shdr *symtab_hdr,
11423                           bfd_boolean *again)
11424 {
11425   uint32_t insn;
11426   bfd_signed_vma foff;
11427   Elf_Internal_Rela *i1_irelfn, *irelend;
11428   bfd_vma local_sda, laddr;
11429
11430   irelend = internal_relocs + sec->reloc_count;
11431   laddr = irel->r_offset;
11432   insn = bfd_getb32 (contents + laddr);
11433   if (insn & 0x80000000)
11434     return;
11435
11436   if (nds32_elf_check_dup_relocs
11437       (irel, internal_relocs, irelend, R_NDS32_GOT_SUFF))
11438     return;
11439
11440   i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11441                                       R_NDS32_PTR_RESOLVED);
11442
11443   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11444                             &local_sda, FALSE);
11445   foff = calculate_got_memory_address (abfd, link_info, irel,
11446                                        symtab_hdr) - local_sda;
11447
11448   if (foff < CONSERVATIVE_19BIT && foff >= -CONSERVATIVE_19BIT)
11449     {
11450       /* Turn LW to LWI.GP.  Change relocation type to R_NDS32_GOT_REL.  */
11451       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
11452       irel->r_info =
11453         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_GOT17S2_RELA);
11454       bfd_putb32 (insn, contents + laddr);
11455       if (i1_irelfn != irelend)
11456         {
11457           i1_irelfn->r_addend |= 1;
11458           *again = TRUE;
11459         }
11460     }
11461 }
11462
11463 /* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section.  */
11464
11465 static void
11466 nds32_elf_relax_gotoff_suff (struct bfd_link_info *link_info, bfd *abfd,
11467                              asection *sec, Elf_Internal_Rela *irel,
11468                              Elf_Internal_Rela *internal_relocs,
11469                              bfd_byte *contents, Elf_Internal_Sym *isymbuf,
11470                              Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
11471 {
11472   int opc_insn_gotoff;
11473   uint32_t insn;
11474   bfd_signed_vma foff;
11475   Elf_Internal_Rela *i1_irelfn, *i2_irelfn, *irelend;
11476   bfd_vma local_sda, laddr;
11477
11478   irelend = internal_relocs + sec->reloc_count;
11479   laddr = irel->r_offset;
11480   insn = bfd_getb32 (contents + laddr);
11481
11482   if (insn & 0x80000000)
11483     return;
11484
11485   if (nds32_elf_check_dup_relocs
11486       (irel, internal_relocs, irelend, R_NDS32_GOTOFF_SUFF))
11487     return;
11488
11489   i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11490                                       R_NDS32_PTR_RESOLVED);
11491   nds32_elf_final_sda_base (sec->output_section->owner, link_info,
11492                             &local_sda, FALSE);
11493   foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
11494   foff = foff - local_sda;
11495
11496   if (foff >= CONSERVATIVE_19BIT || foff < -CONSERVATIVE_19BIT)
11497     return;
11498
11499   /* Concatenate opcode and sub-opcode for switch case.
11500      It may be MEM or ALU1.  */
11501   opc_insn_gotoff = (N32_OP6 (insn) << 8) | (insn & 0xff);
11502   switch (opc_insn_gotoff)
11503     {
11504     case (N32_OP6_MEM << 8) | N32_MEM_LW:
11505       /* 4-byte aligned.  */
11506       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
11507       irel->r_info =
11508         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA17S2_RELA);
11509       break;
11510     case (N32_OP6_MEM << 8) | N32_MEM_SW:
11511       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3));
11512       irel->r_info =
11513         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA17S2_RELA);
11514       break;
11515     case (N32_OP6_MEM << 8) | N32_MEM_LH:
11516       /* 2-byte aligned.  */
11517       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0);
11518       irel->r_info =
11519         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
11520       break;
11521     case (N32_OP6_MEM << 8) | N32_MEM_LHS:
11522       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (18));
11523       irel->r_info =
11524         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
11525       break;
11526     case (N32_OP6_MEM << 8) | N32_MEM_SH:
11527       insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (19));
11528       irel->r_info =
11529         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
11530       break;
11531     case (N32_OP6_MEM << 8) | N32_MEM_LB:
11532       /* 1-byte aligned.  */
11533       insn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0);
11534       irel->r_info =
11535         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11536       break;
11537     case (N32_OP6_MEM << 8) | N32_MEM_LBS:
11538       insn = N32_TYPE1 (LBGP, N32_RT5 (insn), __BIT (19));
11539       irel->r_info =
11540         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11541       break;
11542     case (N32_OP6_MEM << 8) | N32_MEM_SB:
11543       insn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0);
11544       irel->r_info =
11545         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11546       break;
11547     case (N32_OP6_ALU1 << 8) | N32_ALU1_ADD:
11548       insn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19));
11549       irel->r_info =
11550         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
11551       break;
11552     default:
11553       return;
11554     }
11555
11556   bfd_putb32 (insn, contents + laddr);
11557   if (i1_irelfn != irelend)
11558     {
11559       i1_irelfn->r_addend |= 1;
11560       *again = TRUE;
11561     }
11562   if ((i2_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
11563                                            R_NDS32_INSN16)) != irelend)
11564     i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11565
11566 }
11567
11568 static bfd_boolean
11569 nds32_relax_adjust_label (bfd *abfd, asection *sec,
11570                           Elf_Internal_Rela *internal_relocs,
11571                           bfd_byte *contents,
11572                           nds32_elf_blank_t **relax_blank_list,
11573                           int optimize, int opt_size)
11574 {
11575   /* This code block is used to adjust 4-byte alignment by relax a pair
11576      of instruction a time.
11577
11578      It recognizes three types of relocations.
11579      1. R_NDS32_LABEL - a aligment.
11580      2. R_NDS32_INSN16 - relax a 32-bit instruction to 16-bit.
11581      3. is_16bit_NOP () - remove a 16-bit instruction.  */
11582
11583   /* TODO: It seems currently implementation only support 4-byte aligment.
11584      We should handle any-aligment.  */
11585
11586   Elf_Internal_Rela *insn_rel = NULL, *label_rel = NULL, *irel;
11587   Elf_Internal_Rela *tmp_rel, *tmp2_rel = NULL;
11588   Elf_Internal_Rela rel_temp;
11589   Elf_Internal_Rela *irelend;
11590   bfd_vma address;
11591   uint16_t insn16;
11592
11593   /* Checking for branch relaxation relies on the relocations to
11594      be sorted on 'r_offset'.  This is not guaranteed so we must sort.  */
11595   nds32_insertion_sort (internal_relocs, sec->reloc_count,
11596                         sizeof (Elf_Internal_Rela), compar_reloc);
11597
11598   irelend = internal_relocs + sec->reloc_count;
11599
11600   /* Force R_NDS32_LABEL before R_NDS32_INSN16.  */
11601   /* FIXME: Can we generate the right order in assembler?
11602      So we don't have to swapping them here.  */
11603
11604   for (label_rel = internal_relocs, insn_rel = internal_relocs;
11605        label_rel < irelend; label_rel++)
11606     {
11607       if (ELF32_R_TYPE (label_rel->r_info) != R_NDS32_LABEL)
11608         continue;
11609
11610       /* Find the first reloc has the same offset with label_rel.  */
11611       while (insn_rel < irelend && insn_rel->r_offset < label_rel->r_offset)
11612         insn_rel++;
11613
11614       for (;insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset;
11615            insn_rel++)
11616         /* Check if there were R_NDS32_INSN16 and R_NDS32_LABEL at the same
11617            address.  */
11618         if (ELF32_R_TYPE (insn_rel->r_info) == R_NDS32_INSN16)
11619           break;
11620
11621       if (insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset
11622           && insn_rel < label_rel)
11623         {
11624           /* Swap the two reloc if the R_NDS32_INSN16 is
11625              before R_NDS32_LABEL.  */
11626           memcpy (&rel_temp, insn_rel, sizeof (Elf_Internal_Rela));
11627           memcpy (insn_rel, label_rel, sizeof (Elf_Internal_Rela));
11628           memcpy (label_rel, &rel_temp, sizeof (Elf_Internal_Rela));
11629         }
11630     }
11631
11632   label_rel = NULL;
11633   insn_rel = NULL;
11634   /* If there were a sequence of R_NDS32_LABEL end up with .align 2
11635      or higher, remove other R_NDS32_LABEL with lower alignment.
11636      If an R_NDS32_INSN16 in between R_NDS32_LABELs must be converted,
11637      then the R_NDS32_LABEL sequence is broke.  */
11638   for (tmp_rel = internal_relocs; tmp_rel < irelend; tmp_rel++)
11639     {
11640       if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_LABEL)
11641         {
11642           if (label_rel == NULL)
11643             {
11644               if (tmp_rel->r_addend < 2)
11645                 label_rel = tmp_rel;
11646               continue;
11647             }
11648           else if (tmp_rel->r_addend > 1)
11649             {
11650               /* Remove all LABEL relocation from label_rel to tmp_rel
11651                  including relocations with same offset as tmp_rel.  */
11652               for (tmp2_rel = label_rel; tmp2_rel < tmp_rel
11653                    || tmp2_rel->r_offset == tmp_rel->r_offset; tmp2_rel++)
11654                 {
11655                   if (ELF32_R_TYPE (tmp2_rel->r_info) == R_NDS32_LABEL
11656                       && tmp2_rel->r_addend < 2)
11657                     tmp2_rel->r_info =
11658                       ELF32_R_INFO (ELF32_R_SYM (tmp2_rel->r_info),
11659                                     R_NDS32_NONE);
11660                 }
11661               label_rel = NULL;
11662             }
11663         }
11664       else if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16 && label_rel)
11665         {
11666           /* A new INSN16 which can be converted, so clear label_rel.  */
11667           if (is_convert_32_to_16 (abfd, sec, tmp_rel, internal_relocs,
11668                                    irelend, &insn16)
11669               || is_16bit_NOP (abfd, sec, tmp_rel))
11670             label_rel = NULL;
11671         }
11672     }
11673
11674   label_rel = NULL;
11675   insn_rel = NULL;
11676   /* Optimized for speed and nothing has not been relaxed.
11677      It's time to align labels.
11678      We may convert a 16-bit instruction right before a label to
11679      32-bit, in order to align the label if necessary
11680      all reloc entries has been sorted by r_offset.  */
11681   for (irel = internal_relocs; irel < irelend; irel++)
11682     {
11683       if (ELF32_R_TYPE (irel->r_info) != R_NDS32_INSN16
11684           && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL)
11685         continue;
11686
11687       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_INSN16)
11688         {
11689           /* A new INSN16 found, resize the old one.  */
11690           if (is_convert_32_to_16
11691               (abfd, sec, irel, internal_relocs, irelend, &insn16)
11692               || is_16bit_NOP (abfd, sec, irel))
11693             {
11694               if (insn_rel)
11695                 {
11696                   /* Previous INSN16 reloc exists, reduce its
11697                      size to 16-bit.  */
11698                   if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
11699                                            irelend, &insn16))
11700                     {
11701                       nds32_elf_write_16 (abfd, contents, insn_rel,
11702                                           internal_relocs, irelend, insn16);
11703
11704                       if (!insert_nds32_elf_blank_recalc_total
11705                           (relax_blank_list, insn_rel->r_offset + 2, 2))
11706                         return FALSE;
11707                     }
11708                   else if (is_16bit_NOP (abfd, sec, insn_rel))
11709                     {
11710                       if (!insert_nds32_elf_blank_recalc_total
11711                           (relax_blank_list, insn_rel->r_offset, 2))
11712                         return FALSE;
11713                     }
11714                   insn_rel->r_info =
11715                     ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info), R_NDS32_NONE);
11716                 }
11717               /* Save the new one for later use.  */
11718               insn_rel = irel;
11719             }
11720           else
11721             irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
11722                                          R_NDS32_NONE);
11723         }
11724       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL)
11725         {
11726           /* Search for label.  */
11727           int force_relax = 0;
11728
11729           /* Label on 16-bit instruction or optimization
11730              needless, just reset this reloc.  */
11731           insn16 = bfd_getb16 (contents + irel->r_offset);
11732           if ((irel->r_addend & 0x1f) < 2 && (!optimize || (insn16 & 0x8000)))
11733             {
11734               irel->r_info =
11735                 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
11736               continue;
11737             }
11738
11739           address =
11740             irel->r_offset - get_nds32_elf_blank_total (relax_blank_list,
11741                                                         irel->r_offset, 1);
11742
11743           if (!insn_rel)
11744             {
11745               /* Check if there is case which can not be aligned.  */
11746               if (irel->r_addend == 2 && address & 0x2)
11747                 return FALSE;
11748               continue;
11749             }
11750
11751           /* Try to align this label.  */
11752
11753           if ((irel->r_addend & 0x1f) < 2)
11754             {
11755               /* Check if there is a INSN16 at the same address.
11756                  Label_rel always seats before insn_rel after
11757                  our sort.  */
11758
11759               /* Search for INSN16 at LABEL location.  If INSN16 is at
11760                  same location and this LABEL alignment is lower than 2,
11761                  the INSN16 can be converted to 2-byte.  */
11762               for (tmp_rel = irel;
11763                    tmp_rel < irelend && tmp_rel->r_offset == irel->r_offset;
11764                    tmp_rel++)
11765                 {
11766                   if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16
11767                       && (is_convert_32_to_16
11768                           (abfd, sec, tmp_rel, internal_relocs,
11769                            irelend, &insn16)
11770                           || is_16bit_NOP (abfd, sec, tmp_rel)))
11771                     {
11772                       force_relax = 1;
11773                       break;
11774                     }
11775                 }
11776             }
11777
11778           if (force_relax || irel->r_addend == 1 || address & 0x2)
11779             {
11780               /* Label not aligned.  */
11781               /* Previous reloc exists, reduce its size to 16-bit.  */
11782               if (is_convert_32_to_16 (abfd, sec, insn_rel,
11783                                        internal_relocs, irelend, &insn16))
11784                 {
11785                   nds32_elf_write_16 (abfd, contents, insn_rel,
11786                                       internal_relocs, irelend, insn16);
11787
11788                   if (!insert_nds32_elf_blank_recalc_total
11789                       (relax_blank_list, insn_rel->r_offset + 2, 2))
11790                     return FALSE;
11791                 }
11792               else if (is_16bit_NOP (abfd, sec, insn_rel))
11793                 {
11794                   if (!insert_nds32_elf_blank_recalc_total
11795                       (relax_blank_list, insn_rel->r_offset, 2))
11796                     return FALSE;
11797                 }
11798
11799             }
11800           /* INSN16 reloc is used.  */
11801           insn_rel = NULL;
11802         }
11803     }
11804
11805   address =
11806     sec->size - get_nds32_elf_blank_total (relax_blank_list, sec->size, 0);
11807   if (insn_rel && (address & 0x2 || opt_size))
11808     {
11809       if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
11810                                irelend, &insn16))
11811         {
11812           nds32_elf_write_16 (abfd, contents, insn_rel, internal_relocs,
11813                               irelend, insn16);
11814           if (!insert_nds32_elf_blank_recalc_total
11815               (relax_blank_list, insn_rel->r_offset + 2, 2))
11816             return FALSE;
11817           insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
11818                                            R_NDS32_NONE);
11819         }
11820       else if (is_16bit_NOP (abfd, sec, insn_rel))
11821         {
11822           if (!insert_nds32_elf_blank_recalc_total
11823               (relax_blank_list, insn_rel->r_offset, 2))
11824             return FALSE;
11825           insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
11826                                            R_NDS32_NONE);
11827         }
11828     }
11829   insn_rel = NULL;
11830   return TRUE;
11831 }
11832
11833 /* Pick relaxation round.  */
11834
11835 static int
11836 nds32_elf_pick_relax (bfd_boolean init, asection *sec, bfd_boolean *again,
11837                       struct elf_nds32_link_hash_table *table,
11838                       struct bfd_link_info *link_info)
11839 {
11840   static asection *final_sec, *first_sec = NULL;
11841   static bfd_boolean normal_again = FALSE;
11842   static bfd_boolean set = FALSE;
11843   static bfd_boolean first = TRUE;
11844   int round_table[] = {
11845       NDS32_RELAX_NORMAL_ROUND,
11846       NDS32_RELAX_JUMP_IFC_ROUND,
11847       NDS32_RELAX_EX9_BUILD_ROUND,
11848       NDS32_RELAX_EX9_REPLACE_ROUND,
11849   };
11850   static int pass = 0;
11851   static int relax_round;
11852
11853   /* The new round.  */
11854   if (init && first_sec == sec)
11855     {
11856       set = TRUE;
11857       normal_again = FALSE;
11858     }
11859
11860   if (first)
11861     {
11862       /* Run an empty run to get the final section.  */
11863       relax_round = NDS32_RELAX_EMPTY_ROUND;
11864
11865       /* It has to enter relax again because we can
11866          not make sure what the final turn is.  */
11867       *again = TRUE;
11868
11869       first = FALSE;
11870       first_sec = sec;
11871     }
11872
11873   if (!set)
11874     {
11875       /* Not reenter yet.  */
11876       final_sec = sec;
11877       return relax_round;
11878     }
11879
11880   relax_round = round_table[pass];
11881
11882   if (!init && relax_round == NDS32_RELAX_NORMAL_ROUND && *again)
11883     normal_again = TRUE;
11884
11885   if (!init && final_sec == sec)
11886     {
11887       switch (relax_round)
11888         {
11889         case NDS32_RELAX_NORMAL_ROUND:
11890           if (!normal_again)
11891             {
11892               /* Normal relaxation done.  */
11893               if (table->target_optimize & NDS32_RELAX_JUMP_IFC_ON)
11894                 {
11895                   pass++;
11896                   *again = TRUE;
11897                 }
11898               else if (table->target_optimize & NDS32_RELAX_EX9_ON)
11899                 {
11900                   pass += 2;    /* NDS32_RELAX_EX9_BUILD_ROUND */
11901                   *again = TRUE;
11902                 }
11903               else if (table->ex9_import_file)
11904                 {
11905                   /* Import ex9 table.  */
11906                   if (table->update_ex9_table)
11907                     pass += 2;  /* NDS32_RELAX_EX9_BUILD_ROUND */
11908                   else
11909                     pass += 3;  /* NDS32_RELAX_EX9_REPLACE_ROUND */
11910                   nds32_elf_ex9_import_table (link_info);
11911                   *again = TRUE;
11912                 }
11913             }
11914           break;
11915         case NDS32_RELAX_JUMP_IFC_ROUND:
11916           if (!nds32_elf_ifc_finish (link_info))
11917             _bfd_error_handler (_("error: Jump IFC Fail."));
11918           if (table->target_optimize & NDS32_RELAX_EX9_ON)
11919             {
11920               pass++;
11921               *again = TRUE;
11922             }
11923           break;
11924         case NDS32_RELAX_EX9_BUILD_ROUND:
11925           nds32_elf_ex9_finish (link_info);
11926           pass++;
11927           *again = TRUE;
11928           break;
11929         case NDS32_RELAX_EX9_REPLACE_ROUND:
11930           if (table->target_optimize & NDS32_RELAX_JUMP_IFC_ON)
11931             {
11932               /* Do jump IFC optimization again.  */
11933               if (!nds32_elf_ifc_finish (link_info))
11934                 _bfd_error_handler (_("error: Jump IFC Fail."));
11935             }
11936           break;
11937         default:
11938           break;
11939         }
11940     }
11941
11942   return relax_round;
11943 }
11944
11945 static bfd_boolean
11946 nds32_elf_relax_section (bfd *abfd, asection *sec,
11947                          struct bfd_link_info *link_info, bfd_boolean *again)
11948 {
11949   nds32_elf_blank_t *relax_blank_list = NULL;
11950   Elf_Internal_Shdr *symtab_hdr;
11951   Elf_Internal_Rela *internal_relocs;
11952   Elf_Internal_Rela *irel;
11953   Elf_Internal_Rela *irelend;
11954   Elf_Internal_Sym *isymbuf = NULL;
11955   bfd_byte *contents = NULL;
11956   bfd_boolean result = TRUE;
11957   int optimize = 0;
11958   int opt_size = 0;
11959   uint32_t insn;
11960   uint16_t insn16;
11961
11962   /* Target dependnet option.  */
11963   struct elf_nds32_link_hash_table *table;
11964   int load_store_relax;
11965   int relax_round;
11966
11967   relax_blank_list = NULL;
11968
11969   *again = FALSE;
11970
11971   /* Nothing to do for
11972    * relocatable link or
11973    * non-relocatable section or
11974    * non-code section or
11975    * empty content or
11976    * no reloc entry.  */
11977   if (bfd_link_relocatable (link_info)
11978       || (sec->flags & SEC_RELOC) == 0
11979       || (sec->flags & SEC_EXCLUDE) == 1
11980       || (sec->flags & SEC_CODE) == 0
11981       || sec->size == 0)
11982     return TRUE;
11983
11984   /* 09.12.11 Workaround.  */
11985   /*  We have to adjust align for R_NDS32_LABEL if needed.
11986       The adjust approach only can fix 2-byte align once.  */
11987   if (sec->alignment_power > 2)
11988     return TRUE;
11989
11990   /* The optimization type to do.  */
11991
11992   table = nds32_elf_hash_table (link_info);
11993   relax_round = nds32_elf_pick_relax (TRUE, sec, again, table, link_info);
11994   switch (relax_round)
11995     {
11996     case NDS32_RELAX_JUMP_IFC_ROUND:
11997       /* Here is the entrance of ifc jump relaxation.  */
11998       if (!nds32_elf_ifc_calc (link_info, abfd, sec))
11999         return FALSE;
12000       nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
12001       return TRUE;
12002
12003     case NDS32_RELAX_EX9_BUILD_ROUND:
12004       /* Here is the entrance of ex9 relaxation.  There are two pass of
12005          ex9 relaxation.  The one is to traverse all instructions and build
12006          the hash table.  The other one is to compare instructions and replace
12007          it by ex9.it.  */
12008       if (!nds32_elf_ex9_build_hash_table (abfd, sec, link_info))
12009         return FALSE;
12010       nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
12011       return TRUE;
12012
12013     case NDS32_RELAX_EX9_REPLACE_ROUND:
12014       if (!nds32_elf_ex9_replace_instruction (link_info, abfd, sec))
12015         return FALSE;
12016       return TRUE;
12017
12018     case NDS32_RELAX_EMPTY_ROUND:
12019       nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
12020       return TRUE;
12021
12022     case NDS32_RELAX_NORMAL_ROUND:
12023     default:
12024       if (sec->reloc_count == 0)
12025         return TRUE;
12026       break;
12027     }
12028
12029   /* The begining of general relaxation.  */
12030
12031   if (is_SDA_BASE_set == 0)
12032     {
12033       bfd_vma gp;
12034       is_SDA_BASE_set = 1;
12035       nds32_elf_final_sda_base (sec->output_section->owner, link_info,
12036                                 &gp, FALSE);
12037       relax_range_measurement (abfd);
12038     }
12039
12040   if (is_ITB_BASE_set == 0)
12041     {
12042       /* Set the _ITB_BASE_.  */
12043       if (!nds32_elf_ex9_itb_base (link_info))
12044         {
12045           _bfd_error_handler (_("%B: error: Cannot set _ITB_BASE_"), abfd);
12046           bfd_set_error (bfd_error_bad_value);
12047         }
12048     }
12049
12050   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12051   /* Relocations MUST be kept in memory, because relaxation adjust them.  */
12052   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
12053                                                TRUE /* keep_memory */);
12054   if (internal_relocs == NULL)
12055     goto error_return;
12056
12057   irelend = internal_relocs + sec->reloc_count;
12058   irel = find_relocs_at_address (internal_relocs, internal_relocs,
12059                                  irelend, R_NDS32_RELAX_ENTRY);
12060
12061   if (irel == irelend)
12062     return TRUE;
12063
12064   if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
12065     {
12066       if (irel->r_addend & R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG)
12067         {
12068           nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
12069           return TRUE;
12070         }
12071
12072       if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG)
12073         optimize = 1;
12074
12075       if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG)
12076         opt_size = 1;
12077     }
12078
12079   load_store_relax = table->load_store_relax;
12080
12081   /* Get symbol table and section content.  */
12082   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
12083       || !nds32_get_local_syms (abfd, sec, &isymbuf))
12084     goto error_return;
12085
12086   /* Do relax loop only when finalize is not done.
12087      Take care of relaxable relocs except INSN16.  */
12088   for (irel = internal_relocs; irel < irelend; irel++)
12089     {
12090       int seq_len;              /* Original length of instruction sequence.  */
12091       int insn_len = 0;         /* Final length of instruction sequence.  */
12092       bfd_boolean removed;
12093
12094       insn = 0;
12095       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
12096           && (irel->r_addend & 0x1f) >= 2)
12097         optimize = 1;
12098
12099       /* Relocation Types
12100          R_NDS32_LONGCALL1      53
12101          R_NDS32_LONGCALL2      54
12102          R_NDS32_LONGCALL3      55
12103          R_NDS32_LONGJUMP1      56
12104          R_NDS32_LONGJUMP2      57
12105          R_NDS32_LONGJUMP3      58
12106          R_NDS32_LOADSTORE      59  */
12107       if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL1
12108           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LOADSTORE)
12109         seq_len = GET_SEQ_LEN (irel->r_addend);
12110
12111       /* Relocation Types
12112          R_NDS32_LONGCALL4      107
12113          R_NDS32_LONGCALL5      108
12114          R_NDS32_LONGCALL6      109
12115          R_NDS32_LONGJUMP4      110
12116          R_NDS32_LONGJUMP5      111
12117          R_NDS32_LONGJUMP6      112
12118          R_NDS32_LONGJUMP7      113  */
12119       else if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL4
12120                && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LONGJUMP7)
12121         seq_len = 4;
12122
12123         /* Relocation Types
12124          R_NDS32_LO12S0_RELA            30
12125          R_NDS32_LO12S1_RELA            29
12126          R_NDS32_LO12S2_RELA            28
12127          R_NDS32_LO12S2_SP_RELA         71
12128          R_NDS32_LO12S2_DP_RELA         70
12129          R_NDS32_GOT_LO12               46
12130          R_NDS32_GOTOFF_LO12            50
12131          R_NDS32_PLTREL_LO12            65
12132          R_NDS32_PLT_GOTREL_LO12        67
12133          R_NDS32_17IFC_PCREL_RELA       96
12134          R_NDS32_GOT_SUFF               193
12135          R_NDS32_GOTOFF_SUFF            194
12136          R_NDS32_PLT_GOT_SUFF           195
12137          R_NDS32_MULCALL_SUFF           196
12138          R_NDS32_PTR                    197  */
12139       else if ((ELF32_R_TYPE (irel->r_info) <= R_NDS32_LO12S0_RELA
12140                 && ELF32_R_TYPE (irel->r_info) >= R_NDS32_LO12S2_RELA)
12141                || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_SP_RELA
12142                || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_DP_RELA
12143                || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12
12144                || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12
12145                || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12
12146                || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLTREL_LO12
12147                || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12
12148                || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_GOT_SUFF
12149                    && ELF32_R_TYPE (irel->r_info) <= R_NDS32_PTR)
12150                || ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
12151                || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LO12
12152                || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_ADD
12153                || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LS)
12154         seq_len = 0;
12155       else
12156         continue;
12157
12158       insn_len = seq_len;
12159       removed = FALSE;
12160
12161       switch (ELF32_R_TYPE (irel->r_info))
12162         {
12163         case R_NDS32_LONGCALL1:
12164           removed = nds32_elf_relax_longcall1 (abfd, sec, irel, internal_relocs,
12165                                                &insn_len, contents, isymbuf,
12166                                                symtab_hdr);
12167           break;
12168         case R_NDS32_LONGCALL2:
12169           removed = nds32_elf_relax_longcall2 (abfd, sec, irel, internal_relocs,
12170                                                &insn_len, contents, isymbuf,
12171                                                symtab_hdr);
12172           break;
12173         case R_NDS32_LONGCALL3:
12174           removed = nds32_elf_relax_longcall3 (abfd, sec, irel, internal_relocs,
12175                                                &insn_len, contents, isymbuf,
12176                                                symtab_hdr);
12177           break;
12178         case R_NDS32_LONGJUMP1:
12179           removed = nds32_elf_relax_longjump1 (abfd, sec, irel, internal_relocs,
12180                                                &insn_len, contents, isymbuf,
12181                                                symtab_hdr);
12182           break;
12183         case R_NDS32_LONGJUMP2:
12184           removed = nds32_elf_relax_longjump2 (abfd, sec, irel, internal_relocs,
12185                                                &insn_len, contents, isymbuf,
12186                                                symtab_hdr);
12187           break;
12188         case R_NDS32_LONGJUMP3:
12189           removed = nds32_elf_relax_longjump3 (abfd, sec, irel, internal_relocs,
12190                                                &insn_len, contents, isymbuf,
12191                                                symtab_hdr);
12192           break;
12193         case R_NDS32_LONGCALL4:
12194           removed = nds32_elf_relax_longcall4 (abfd, sec, irel, internal_relocs,
12195                                                &insn_len, contents, isymbuf,
12196                                                symtab_hdr);
12197           break;
12198         case R_NDS32_LONGCALL5:
12199           removed = nds32_elf_relax_longcall5 (abfd, sec, irel, internal_relocs,
12200                                                &insn_len, contents, isymbuf,
12201                                                symtab_hdr);
12202           break;
12203         case R_NDS32_LONGCALL6:
12204           removed = nds32_elf_relax_longcall6 (abfd, sec, irel, internal_relocs,
12205                                                &insn_len, contents, isymbuf,
12206                                                symtab_hdr);
12207           break;
12208         case R_NDS32_LONGJUMP4:
12209           removed = nds32_elf_relax_longjump4 (abfd, sec, irel, internal_relocs,
12210                                                &insn_len, contents, isymbuf,
12211                                                symtab_hdr);
12212           break;
12213         case R_NDS32_LONGJUMP5:
12214           removed = nds32_elf_relax_longjump5 (abfd, sec, irel, internal_relocs,
12215                                                &insn_len, &seq_len, contents,
12216                                                isymbuf, symtab_hdr);
12217           break;
12218         case R_NDS32_LONGJUMP6:
12219           removed = nds32_elf_relax_longjump6 (abfd, sec, irel, internal_relocs,
12220                                                &insn_len, &seq_len, contents,
12221                                                isymbuf, symtab_hdr);
12222           break;
12223         case R_NDS32_LONGJUMP7:
12224           removed = nds32_elf_relax_longjump7 (abfd, sec, irel, internal_relocs,
12225                                                &insn_len, &seq_len, contents,
12226                                                isymbuf, symtab_hdr);
12227           break;
12228         case R_NDS32_LOADSTORE:
12229           removed = nds32_elf_relax_loadstore (link_info, abfd, sec, irel,
12230                                                internal_relocs, &insn_len,
12231                                                contents, isymbuf, symtab_hdr,
12232                                                load_store_relax);
12233           break;
12234         case R_NDS32_LO12S0_RELA:
12235         case R_NDS32_LO12S1_RELA:
12236         case R_NDS32_LO12S2_DP_RELA:
12237         case R_NDS32_LO12S2_SP_RELA:
12238         case R_NDS32_LO12S2_RELA:
12239           /* Relax for low part.  */
12240           nds32_elf_relax_lo12 (link_info, abfd, sec, irel, internal_relocs,
12241                                 contents, isymbuf, symtab_hdr);
12242
12243           /* It is impossible to delete blank, so just continue.  */
12244           continue;
12245         case R_NDS32_GOT_LO12:
12246         case R_NDS32_GOTOFF_LO12:
12247         case R_NDS32_PLTREL_LO12:
12248         case R_NDS32_PLT_GOTREL_LO12:
12249         case R_NDS32_GOTPC_LO12:
12250           /* Relax for PIC gp-relative low part.  */
12251           nds32_elf_relax_piclo12 (link_info, abfd, sec, irel, contents,
12252                                    isymbuf, symtab_hdr);
12253
12254           /* It is impossible to delete blank, so just continue.  */
12255           continue;
12256         case R_NDS32_TLS_LE_LO12:
12257           /* Relax for LE TLS low part.  */
12258           nds32_elf_relax_letlslo12 (link_info, abfd, irel, contents,
12259                                      isymbuf, symtab_hdr);
12260
12261           /* It is impossible to delete blank, so just continue.  */
12262           continue;
12263         case R_NDS32_TLS_LE_ADD:
12264           nds32_elf_relax_letlsadd (link_info, abfd, sec, irel, internal_relocs,
12265                                     contents, isymbuf, symtab_hdr, again);
12266           /* It is impossible to delete blank, so just continue.  */
12267           continue;
12268         case R_NDS32_TLS_LE_LS:
12269           nds32_elf_relax_letlsls (link_info, abfd, sec, irel, internal_relocs,
12270                                    contents, isymbuf, symtab_hdr, again);
12271           continue;
12272         case R_NDS32_PTR:
12273           removed = nds32_elf_relax_ptr (abfd, sec, irel, internal_relocs,
12274                                          &insn_len, &seq_len, contents);
12275           break;
12276         case R_NDS32_PLT_GOT_SUFF:
12277           nds32_elf_relax_pltgot_suff (link_info, abfd, sec, irel,
12278                                        internal_relocs, contents,
12279                                        isymbuf, symtab_hdr, again);
12280           /* It is impossible to delete blank, so just continue.  */
12281           continue;
12282         case R_NDS32_GOT_SUFF:
12283           nds32_elf_relax_got_suff (link_info, abfd, sec, irel,
12284                                     internal_relocs, contents,
12285                                     symtab_hdr, again);
12286           /* It is impossible to delete blank, so just continue.  */
12287           continue;
12288         case R_NDS32_GOTOFF_SUFF:
12289           nds32_elf_relax_gotoff_suff (link_info, abfd, sec, irel,
12290                                        internal_relocs, contents,
12291                                        isymbuf, symtab_hdr, again);
12292           /* It is impossible to delete blank, so just continue.  */
12293           continue;
12294         default:
12295           continue;
12296
12297         }
12298       if (removed && seq_len - insn_len > 0)
12299         {
12300           if (!insert_nds32_elf_blank
12301               (&relax_blank_list, irel->r_offset + insn_len,
12302                seq_len - insn_len))
12303             goto error_return;
12304           *again = TRUE;
12305         }
12306     }
12307
12308   calc_nds32_blank_total (relax_blank_list);
12309
12310   if (table->relax_fp_as_gp)
12311     {
12312       if (!nds32_relax_fp_as_gp (link_info, abfd, sec, internal_relocs,
12313                                  irelend, isymbuf))
12314         goto error_return;
12315
12316       if (*again == FALSE)
12317         {
12318           if (!nds32_fag_remove_unused_fpbase (abfd, sec, internal_relocs,
12319                                                irelend))
12320             goto error_return;
12321         }
12322     }
12323
12324   nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
12325
12326   if (*again == FALSE)
12327     {
12328       if (!nds32_relax_adjust_label (abfd, sec, internal_relocs, contents,
12329                                      &relax_blank_list, optimize, opt_size))
12330         goto error_return;
12331     }
12332
12333   /* It doesn't matter optimize_for_space_no_align anymore.
12334        If object file is assembled with flag '-Os',
12335        the we don't adjust jump-destination on 4-byte boundary.  */
12336
12337   if (relax_blank_list)
12338     {
12339       nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
12340       relax_blank_list = NULL;
12341     }
12342
12343   if (*again == FALSE)
12344     {
12345       /* Closing the section, so we don't relax it anymore.  */
12346       bfd_vma sec_size_align;
12347       Elf_Internal_Rela *tmp_rel;
12348
12349       /* Pad to alignment boundary.  Only handle current section alignment.  */
12350       sec_size_align = (sec->size + (~((-1U) << sec->alignment_power)))
12351                        & ((-1U) << sec->alignment_power);
12352       if ((sec_size_align - sec->size) & 0x2)
12353         {
12354           insn16 = NDS32_NOP16;
12355           bfd_putb16 (insn16, contents + sec->size);
12356           sec->size += 2;
12357         }
12358
12359       while (sec_size_align != sec->size)
12360         {
12361           insn = NDS32_NOP32;
12362           bfd_putb32 (insn, contents + sec->size);
12363           sec->size += 4;
12364         }
12365
12366       tmp_rel = find_relocs_at_address (internal_relocs, internal_relocs,
12367                                         irelend, R_NDS32_RELAX_ENTRY);
12368       if (tmp_rel != irelend)
12369         tmp_rel->r_addend |= R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG;
12370
12371       clean_nds32_elf_blank ();
12372     }
12373
12374 finish:
12375   if (internal_relocs != NULL
12376       && elf_section_data (sec)->relocs != internal_relocs)
12377     free (internal_relocs);
12378
12379   if (contents != NULL
12380       && elf_section_data (sec)->this_hdr.contents != contents)
12381     free (contents);
12382
12383   if (isymbuf != NULL && symtab_hdr->contents != (bfd_byte *) isymbuf)
12384     free (isymbuf);
12385
12386   return result;
12387
12388 error_return:
12389   result = FALSE;
12390   goto finish;
12391 }
12392
12393 static struct bfd_elf_special_section const nds32_elf_special_sections[] =
12394 {
12395   {".sdata", 6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE},
12396   {".sbss", 5, -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE},
12397   {NULL, 0, 0, 0, 0}
12398 };
12399
12400 static bfd_boolean
12401 nds32_elf_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED,
12402                             struct bfd_link_info *info,
12403                             void *finfo ATTRIBUTE_UNUSED,
12404                             bfd_boolean (*func) (void *, const char *,
12405                                                  Elf_Internal_Sym *,
12406                                                  asection *,
12407                                                  struct elf_link_hash_entry *)
12408                             ATTRIBUTE_UNUSED)
12409 {
12410   FILE *sym_ld_script = NULL;
12411   struct elf_nds32_link_hash_table *table;
12412
12413   table = nds32_elf_hash_table (info);
12414   sym_ld_script = table->sym_ld_script;
12415
12416   if (check_start_export_sym)
12417     fprintf (sym_ld_script, "}\n");
12418
12419   return TRUE;
12420 }
12421
12422 static enum elf_reloc_type_class
12423 nds32_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
12424                             const asection *rel_sec ATTRIBUTE_UNUSED,
12425                             const Elf_Internal_Rela *rela)
12426 {
12427   switch ((int) ELF32_R_TYPE (rela->r_info))
12428     {
12429     case R_NDS32_RELATIVE:
12430       return reloc_class_relative;
12431     case R_NDS32_JMP_SLOT:
12432       return reloc_class_plt;
12433     case R_NDS32_COPY:
12434       return reloc_class_copy;
12435     default:
12436       return reloc_class_normal;
12437     }
12438 }
12439
12440 /* Put target dependent option into info hash table.  */
12441 void
12442 bfd_elf32_nds32_set_target_option (struct bfd_link_info *link_info,
12443                                    int relax_fp_as_gp,
12444                                    int eliminate_gc_relocs,
12445                                    FILE * sym_ld_script, int load_store_relax,
12446                                    int target_optimize, int relax_status,
12447                                    int relax_round, FILE * ex9_export_file,
12448                                    FILE * ex9_import_file,
12449                                    int update_ex9_table, int ex9_limit,
12450                                    bfd_boolean ex9_loop_aware,
12451                                    bfd_boolean ifc_loop_aware)
12452 {
12453   struct elf_nds32_link_hash_table *table;
12454
12455   table = nds32_elf_hash_table (link_info);
12456   if (table == NULL)
12457     return;
12458
12459   table->relax_fp_as_gp = relax_fp_as_gp;
12460   table->eliminate_gc_relocs = eliminate_gc_relocs;
12461   table->sym_ld_script = sym_ld_script;
12462   table ->load_store_relax = load_store_relax;
12463   table->target_optimize = target_optimize;
12464   table->relax_status = relax_status;
12465   table->relax_round = relax_round;
12466   table->ex9_export_file = ex9_export_file;
12467   table->ex9_import_file = ex9_import_file;
12468   table->update_ex9_table = update_ex9_table;
12469   table->ex9_limit = ex9_limit;
12470   table->ex9_loop_aware = ex9_loop_aware;
12471   table->ifc_loop_aware = ifc_loop_aware;
12472 }
12473 \f
12474 /* These functions and data-structures are used for fp-as-gp
12475    optimization.  */
12476
12477 #define FAG_THRESHOLD   3       /* At least 3 gp-access.  */
12478 /* lwi37.fp covers 508 bytes, but there may be 32-byte padding between
12479    the read-only section and read-write section.  */
12480 #define FAG_WINDOW      (508 - 32)
12481
12482 /* An nds32_fag represent a gp-relative access.
12483    We find best fp-base by using a sliding window
12484    to find a base address which can cover most gp-access.  */
12485 struct nds32_fag
12486 {
12487   struct nds32_fag *next;       /* NULL-teminated linked list.  */
12488   bfd_vma addr;                 /* The address of this fag.  */
12489   Elf_Internal_Rela **relas;    /* The relocations associated with this fag.
12490                                    It is used for applying FP7U2_FLAG.  */
12491   int count;                    /* How many times this address is referred.
12492                                    There should be exactly `count' relocations
12493                                    in relas.  */
12494   int relas_capcity;            /* The buffer size of relas.
12495                                    We use an array instead of linked-list,
12496                                    and realloc is used to adjust buffer size.  */
12497 };
12498
12499 static void
12500 nds32_fag_init (struct nds32_fag *head)
12501 {
12502   memset (head, 0, sizeof (struct nds32_fag));
12503 }
12504
12505 static void
12506 nds32_fag_verify (struct nds32_fag *head)
12507 {
12508   struct nds32_fag *iter;
12509   struct nds32_fag *prev;
12510
12511   prev = NULL;
12512   iter = head->next;
12513   while (iter)
12514     {
12515       if (prev && prev->addr >= iter->addr)
12516         puts ("Bug in fp-as-gp insertion.");
12517       prev = iter;
12518       iter = iter->next;
12519     }
12520 }
12521
12522 /* Insert a fag in ascending order.
12523    If a fag of the same address already exists,
12524    they are chained by relas array.  */
12525
12526 static void
12527 nds32_fag_insert (struct nds32_fag *head, bfd_vma addr,
12528                   Elf_Internal_Rela * rel)
12529 {
12530   struct nds32_fag *iter;
12531   struct nds32_fag *new_fag;
12532   const int INIT_RELAS_CAP = 4;
12533
12534   for (iter = head;
12535        iter->next && iter->next->addr <= addr;
12536        iter = iter->next)
12537     /* Find somewhere to insert.  */ ;
12538
12539   /* `iter' will be equal to `head' if the list is empty.  */
12540   if (iter != head && iter->addr == addr)
12541     {
12542       /* The address exists in the list.
12543          Insert `rel' into relocation list, relas.  */
12544
12545       /* Check whether relas is big enough.  */
12546       if (iter->count >= iter->relas_capcity)
12547         {
12548           iter->relas_capcity *= 2;
12549           iter->relas = bfd_realloc
12550             (iter->relas, iter->relas_capcity * sizeof (void *));
12551         }
12552       iter->relas[iter->count++] = rel;
12553       return;
12554     }
12555
12556   /* This is a new address.  Create a fag node for it.  */
12557   new_fag = bfd_malloc (sizeof (struct nds32_fag));
12558   memset (new_fag, 0, sizeof (*new_fag));
12559   new_fag->addr = addr;
12560   new_fag->count = 1;
12561   new_fag->next = iter->next;
12562   new_fag->relas_capcity = INIT_RELAS_CAP;
12563   new_fag->relas = (Elf_Internal_Rela **)
12564     bfd_malloc (new_fag->relas_capcity * sizeof (void *));
12565   new_fag->relas[0] = rel;
12566   iter->next = new_fag;
12567
12568   nds32_fag_verify (head);
12569 }
12570
12571 static void
12572 nds32_fag_free_list (struct nds32_fag *head)
12573 {
12574   struct nds32_fag *iter;
12575
12576   iter = head->next;
12577   while (iter)
12578     {
12579       struct nds32_fag *tmp = iter;
12580       iter = iter->next;
12581       free (tmp->relas);
12582       tmp->relas = NULL;
12583       free (tmp);
12584     }
12585 }
12586
12587 /* Find the best fp-base address.
12588    The relocation associated with that address is returned,
12589    so we can track the symbol instead of a fixed address.
12590
12591    When relaxation, the address of an datum may change,
12592    because a text section is shrinked, so the data section
12593    moves forward.  If the aligments of text and data section
12594    are different, their distance may change too.
12595    Therefore, tracking a fixed address is not appriate.  */
12596
12597 static int
12598 nds32_fag_find_base (struct nds32_fag *head, struct nds32_fag **bestpp)
12599 {
12600   struct nds32_fag *base;       /* First fag in the window.  */
12601   struct nds32_fag *last;       /* First fag outside the window.  */
12602   int accu = 0;                 /* Usage accumulation.  */
12603   struct nds32_fag *best;       /* Best fag.  */
12604   int baccu = 0;                /* Best accumulation.  */
12605
12606   /* Use first fag for initial, and find the last fag in the window.
12607
12608      In each iteration, we could simply subtract previous fag
12609      and accumulate following fags which are inside the window,
12610      untill we each the end.  */
12611
12612   if (head->next == NULL)
12613     {
12614       *bestpp = NULL;
12615       return 0;
12616     }
12617
12618   /* Initialize base.  */
12619   base = head->next;
12620   best = base;
12621   for (last = base;
12622        last && last->addr < base->addr + FAG_WINDOW;
12623        last = last->next)
12624     accu += last->count;
12625
12626   baccu = accu;
12627
12628   /* Record the best base in each iteration.  */
12629   while (base->next)
12630     {
12631       accu -= base->count;
12632       base = base->next;
12633       /* Account fags in window.  */
12634       for (/* Nothing.  */;
12635            last && last->addr < base->addr + FAG_WINDOW;
12636            last = last->next)
12637         accu += last->count;
12638
12639       /* A better fp-base?  */
12640       if (accu > baccu)
12641         {
12642           best = base;
12643           baccu = accu;
12644         }
12645     }
12646
12647   if (bestpp)
12648     *bestpp = best;
12649   return baccu;
12650 }
12651
12652 /* Apply R_NDS32_INSN16_FP7U2_FLAG on gp-relative accesses,
12653    so we can convert it fo fp-relative access later.
12654    `best_fag' is the best fp-base.  Only those inside the window
12655    of best_fag is applied the flag.  */
12656
12657 static bfd_boolean
12658 nds32_fag_mark_relax (struct bfd_link_info *link_info,
12659                       bfd *abfd, struct nds32_fag *best_fag,
12660                       Elf_Internal_Rela *internal_relocs,
12661                       Elf_Internal_Rela *irelend)
12662 {
12663   struct nds32_fag *ifag;
12664   bfd_vma best_fpbase, gp;
12665   bfd *output_bfd;
12666
12667   output_bfd = abfd->sections->output_section->owner;
12668   nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
12669   best_fpbase = best_fag->addr;
12670
12671   if (best_fpbase > gp + sdata_range[1][1]
12672       || best_fpbase < gp - sdata_range[1][0])
12673     return FALSE;
12674
12675   /* Mark these inside the window R_NDS32_INSN16_FP7U2_FLAG flag,
12676      so we know they can be converted to lwi37.fp.   */
12677   for (ifag = best_fag;
12678        ifag && ifag->addr < best_fpbase + FAG_WINDOW; ifag = ifag->next)
12679     {
12680       int i;
12681
12682       for (i = 0; i < ifag->count; i++)
12683         {
12684           Elf_Internal_Rela *insn16_rel;
12685           Elf_Internal_Rela *fag_rel;
12686
12687           fag_rel = ifag->relas[i];
12688
12689           /* Only if this is within the WINDOWS, FP7U2_FLAG
12690              is applied.  */
12691
12692           insn16_rel = find_relocs_at_address
12693             (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
12694
12695           if (insn16_rel != irelend)
12696             insn16_rel->r_addend = R_NDS32_INSN16_FP7U2_FLAG;
12697         }
12698     }
12699   return TRUE;
12700 }
12701
12702 /* Reset INSN16 to clean fp as gp.  */
12703
12704 static void
12705 nds32_fag_unmark_relax (struct nds32_fag *fag,
12706                         Elf_Internal_Rela *internal_relocs,
12707                         Elf_Internal_Rela *irelend)
12708 {
12709   struct nds32_fag *ifag;
12710   int i;
12711   Elf_Internal_Rela *insn16_rel;
12712   Elf_Internal_Rela *fag_rel;
12713
12714   for (ifag = fag; ifag; ifag = ifag->next)
12715     {
12716       for (i = 0; i < ifag->count; i++)
12717         {
12718           fag_rel = ifag->relas[i];
12719
12720           /* Restore the INSN16 relocation.  */
12721           insn16_rel = find_relocs_at_address
12722             (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
12723
12724           if (insn16_rel != irelend)
12725             insn16_rel->r_addend &= ~R_NDS32_INSN16_FP7U2_FLAG;
12726         }
12727     }
12728 }
12729
12730 /* This is the main function of fp-as-gp optimization.
12731    It should be called by relax_section.  */
12732
12733 static bfd_boolean
12734 nds32_relax_fp_as_gp (struct bfd_link_info *link_info,
12735                       bfd *abfd, asection *sec,
12736                       Elf_Internal_Rela *internal_relocs,
12737                       Elf_Internal_Rela *irelend,
12738                       Elf_Internal_Sym *isymbuf)
12739 {
12740   Elf_Internal_Rela *begin_rel = NULL;
12741   Elf_Internal_Rela *irel;
12742   struct nds32_fag fag_head;
12743   Elf_Internal_Shdr *symtab_hdr;
12744   bfd_byte *contents;
12745   bfd_boolean ifc_inside = FALSE;
12746
12747   /* FIXME: Can we bfd_elf_link_read_relocs for the relocs?  */
12748
12749   /* Per-function fp-base selection.
12750      1. Create a list for all the gp-relative access.
12751      2. Base on those gp-relative address,
12752         find a fp-base which can cover most access.
12753      3. Use the fp-base for fp-as-gp relaxation.
12754
12755      NOTE: If fp-as-gp is not worth to do, (e.g., less than 3 times),
12756      we should
12757      1. delete the `la $fp, _FP_BASE_' instruction and
12758      2. not convert lwi.gp to lwi37.fp.
12759
12760      To delete the _FP_BASE_ instruction, we simply apply
12761      R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG flag in the r_addend to disable it.
12762
12763      To suppress the conversion, we simply NOT to apply
12764      R_NDS32_INSN16_FP7U2_FLAG flag.  */
12765
12766   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12767
12768   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
12769       || !nds32_get_local_syms (abfd, sec, &isymbuf))
12770     return FALSE;
12771
12772   /* Check whether it is worth for fp-as-gp optimization,
12773      i.e., at least 3 gp-load.
12774
12775      Set R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG if we should NOT
12776      apply this optimization.  */
12777
12778   for (irel = internal_relocs; irel < irelend; irel++)
12779     {
12780       /* We recognize R_NDS32_RELAX_REGION_BEGIN/_END for the region.
12781          One we enter the begin of the region, we track all the LW/ST
12782          instructions, so when we leave the region, we try to find
12783          the best fp-base address for those LW/ST instructions.  */
12784
12785       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
12786           && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
12787         {
12788           /* Begin of the region.  */
12789           if (begin_rel)
12790             _bfd_error_handler (_("%B: Nested OMIT_FP in %A."), abfd, sec);
12791
12792           begin_rel = irel;
12793           nds32_fag_init (&fag_head);
12794           ifc_inside = FALSE;
12795         }
12796       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
12797                && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
12798         {
12799           int accu;
12800           struct nds32_fag *best_fag, *tmp_fag;
12801           int dist;
12802
12803           /* End of the region.
12804              Check whether it is worth to do fp-as-gp.  */
12805
12806           if (begin_rel == NULL)
12807             {
12808               _bfd_error_handler (_("%B: Unmatched OMIT_FP in %A."), abfd, sec);
12809               continue;
12810             }
12811
12812           accu = nds32_fag_find_base (&fag_head, &best_fag);
12813
12814           /* Clean FP7U2_FLAG because they may set ever.  */
12815           tmp_fag = fag_head.next;
12816           nds32_fag_unmark_relax (tmp_fag, internal_relocs, irelend);
12817
12818           /* Check if it is worth, and FP_BASE is near enough to SDA_BASE.  */
12819           if (accu < FAG_THRESHOLD
12820               || !nds32_fag_mark_relax (link_info, abfd, best_fag,
12821                                         internal_relocs, irelend))
12822             {
12823               /* Not worth to do fp-as-gp.  */
12824               begin_rel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
12825               begin_rel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
12826               irel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
12827               irel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
12828               nds32_fag_free_list (&fag_head);
12829               begin_rel = NULL;
12830               continue;
12831             }
12832
12833           /* R_SYM of R_NDS32_RELAX_REGION_BEGIN is not used by assembler,
12834              so we use it to record the distance to the reloction of best
12835              fp-base.  */
12836           dist = best_fag->relas[0] - begin_rel;
12837           BFD_ASSERT (dist > 0 && dist < 0xffffff);
12838           /* Use high 16 bits of addend to record the _FP_BASE_ matched
12839              relocation.  And get the base value when relocating.  */
12840           begin_rel->r_addend &= (0x1 << 16) - 1;
12841           begin_rel->r_addend |= dist << 16;
12842
12843           nds32_fag_free_list (&fag_head);
12844           begin_rel = NULL;
12845         }
12846
12847       if (begin_rel == NULL || ifc_inside)
12848         /* Skip if we are not in the region of fp-as-gp.  */
12849         continue;
12850
12851       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S2_RELA
12852           || ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA17S2_RELA)
12853         {
12854           bfd_vma addr;
12855           uint32_t insn;
12856
12857           /* A gp-relative access is found.  Insert it to the fag-list.  */
12858
12859           /* Rt is necessary an RT3, so it can be converted to lwi37.fp.  */
12860           insn = bfd_getb32 (contents + irel->r_offset);
12861           if (!N32_IS_RT3 (insn))
12862             continue;
12863
12864           addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
12865           nds32_fag_insert (&fag_head, addr, irel);
12866         }
12867       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA_FP7U2_RELA)
12868         {
12869           begin_rel = NULL;
12870         }
12871       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
12872                || ELF32_R_TYPE (irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
12873         {
12874           /* Suppress fp as gp when encounter ifc.  */
12875           ifc_inside = TRUE;
12876         }
12877     }
12878
12879   return TRUE;
12880 }
12881
12882 /* Remove unused `la $fp, _FD_BASE_' instruction.  */
12883
12884 static bfd_boolean
12885 nds32_fag_remove_unused_fpbase (bfd *abfd, asection *sec,
12886                                 Elf_Internal_Rela *internal_relocs,
12887                                 Elf_Internal_Rela *irelend)
12888 {
12889   Elf_Internal_Rela *irel;
12890   Elf_Internal_Shdr *symtab_hdr;
12891   bfd_byte *contents = NULL;
12892   nds32_elf_blank_t *relax_blank_list = NULL;
12893   bfd_boolean result = TRUE;
12894   bfd_boolean unused_region = FALSE;
12895
12896   /*
12897      NOTE: Disable fp-as-gp if we encounter ifcall relocations.
12898      * R_NDS32_17IFC_PCREL_RELA
12899      * R_NDS32_10IFCU_PCREL_RELA
12900
12901      CASE??????????????
12902   */
12903
12904   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12905   nds32_get_section_contents (abfd, sec, &contents, TRUE);
12906
12907   for (irel = internal_relocs; irel < irelend; irel++)
12908     {
12909       /* To remove unused fp-base, we simply find the REGION_NOT_OMIT_FP
12910          we marked to in previous pass.
12911          DO NOT scan relocations again, since we've alreadly decided it
12912          and set the flag.  */
12913       const char *syname;
12914       int syndx;
12915       uint32_t insn;
12916
12917       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
12918           && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
12919         unused_region = TRUE;
12920       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
12921                && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
12922         unused_region = FALSE;
12923
12924       /* We're not in the region.  */
12925       if (!unused_region)
12926         continue;
12927
12928       /* _FP_BASE_ must be a GLOBAL symbol.  */
12929       syndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
12930       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
12931         continue;
12932
12933       /* The symbol name must be _FP_BASE_.  */
12934       syname = elf_sym_hashes (abfd)[syndx]->root.root.string;
12935       if (strcmp (syname, FP_BASE_NAME) != 0)
12936         continue;
12937
12938       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA19S0_RELA)
12939         {
12940           /* addi.gp  $fp, -256  */
12941           insn = bfd_getb32 (contents + irel->r_offset);
12942           if (insn != INSN_ADDIGP_TO_FP)
12943             continue;
12944         }
12945       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S0_RELA)
12946         {
12947           /* addi  $fp, $gp, -256  */
12948           insn = bfd_getb32 (contents + irel->r_offset);
12949           if (insn != INSN_ADDI_GP_TO_FP)
12950             continue;
12951         }
12952       else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_20_RELA)
12953         {
12954           /* movi  $fp, FP_BASE  */
12955           insn = bfd_getb32 (contents + irel->r_offset);
12956           if (insn != INSN_MOVI_TO_FP)
12957             continue;
12958         }
12959       else
12960         continue;
12961
12962       /* We got here because a FP_BASE instruction is found.  */
12963       if (!insert_nds32_elf_blank_recalc_total
12964           (&relax_blank_list, irel->r_offset, 4))
12965         goto error_return;
12966     }
12967
12968 finish:
12969   if (relax_blank_list)
12970     {
12971       nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
12972       relax_blank_list = NULL;
12973     }
12974   return result;
12975
12976 error_return:
12977   result = FALSE;
12978   goto finish;
12979 }
12980
12981 /* This is a version of bfd_generic_get_relocated_section_contents.
12982    We need this variety because relaxation will modify the dwarf
12983    infomation.  When there is undefined symbol reference error mesage,
12984    linker need to dump line number where the symbol be used.  However
12985    the address is be relaxed, it can not get the original dwarf contents.
12986    The variety only modify function call for reading in the section.  */
12987
12988 static bfd_byte *
12989 nds32_elf_get_relocated_section_contents (bfd *abfd,
12990                                           struct bfd_link_info *link_info,
12991                                           struct bfd_link_order *link_order,
12992                                           bfd_byte *data,
12993                                           bfd_boolean relocatable,
12994                                           asymbol **symbols)
12995 {
12996   bfd *input_bfd = link_order->u.indirect.section->owner;
12997   asection *input_section = link_order->u.indirect.section;
12998   long reloc_size;
12999   arelent **reloc_vector;
13000   long reloc_count;
13001
13002   reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
13003   if (reloc_size < 0)
13004     return NULL;
13005
13006   /* Read in the section.  */
13007   if (!nds32_get_section_contents (input_bfd, input_section, &data, FALSE))
13008     return NULL;
13009
13010   if (reloc_size == 0)
13011     return data;
13012
13013   reloc_vector = (arelent **) bfd_malloc (reloc_size);
13014   if (reloc_vector == NULL)
13015     return NULL;
13016
13017   reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
13018                                         reloc_vector, symbols);
13019   if (reloc_count < 0)
13020     goto error_return;
13021
13022   if (reloc_count > 0)
13023     {
13024       arelent **parent;
13025       for (parent = reloc_vector; *parent != NULL; parent++)
13026         {
13027           char *error_message = NULL;
13028           asymbol *symbol;
13029           bfd_reloc_status_type r;
13030
13031           symbol = *(*parent)->sym_ptr_ptr;
13032           if (symbol->section && discarded_section (symbol->section))
13033             {
13034               bfd_byte *p;
13035               static reloc_howto_type none_howto
13036                 = HOWTO (0, 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL,
13037                          "unused", FALSE, 0, 0, FALSE);
13038
13039               p = data + (*parent)->address * bfd_octets_per_byte (input_bfd);
13040               _bfd_clear_contents ((*parent)->howto, input_bfd, input_section,
13041                                    p);
13042               (*parent)->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
13043               (*parent)->addend = 0;
13044               (*parent)->howto = &none_howto;
13045               r = bfd_reloc_ok;
13046             }
13047           else
13048             r = bfd_perform_relocation (input_bfd, *parent, data,
13049                                         input_section,
13050                                         relocatable ? abfd : NULL,
13051                                         &error_message);
13052
13053           if (relocatable)
13054             {
13055               asection *os = input_section->output_section;
13056
13057               /* A partial link, so keep the relocs.  */
13058               os->orelocation[os->reloc_count] = *parent;
13059               os->reloc_count++;
13060             }
13061
13062           if (r != bfd_reloc_ok)
13063             {
13064               switch (r)
13065                 {
13066                 case bfd_reloc_undefined:
13067                   (*link_info->callbacks->undefined_symbol)
13068                     (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13069                      input_bfd, input_section, (*parent)->address, TRUE);
13070                   break;
13071                 case bfd_reloc_dangerous:
13072                   BFD_ASSERT (error_message != NULL);
13073                   (*link_info->callbacks->reloc_dangerous)
13074                     (link_info, error_message,
13075                      input_bfd, input_section, (*parent)->address);
13076                   break;
13077                 case bfd_reloc_overflow:
13078                   (*link_info->callbacks->reloc_overflow)
13079                     (link_info, NULL,
13080                      bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13081                      (*parent)->howto->name, (*parent)->addend,
13082                      input_bfd, input_section, (*parent)->address);
13083                   break;
13084                 case bfd_reloc_outofrange:
13085                   /* PR ld/13730:
13086                      This error can result when processing some partially
13087                      complete binaries.  Do not abort, but issue an error
13088                      message instead.  */
13089                   link_info->callbacks->einfo
13090                     (_("%X%P: %B(%A): relocation \"%R\" goes out of range\n"),
13091                      abfd, input_section, * parent);
13092                   goto error_return;
13093
13094                 default:
13095                   abort ();
13096                   break;
13097                 }
13098             }
13099         }
13100     }
13101
13102   free (reloc_vector);
13103   return data;
13104
13105 error_return:
13106   free (reloc_vector);
13107   return NULL;
13108 }
13109 \f
13110 /* Link-time IFC relaxation.
13111    In this optimization, we chains jump instructions
13112    of the same destination with ifcall.  */
13113
13114
13115 /* List to save jal and j relocation.  */
13116 struct elf_nds32_ifc_symbol_entry
13117 {
13118   asection *sec;
13119   struct elf_link_hash_entry *h;
13120   struct elf_nds32_ifc_irel_list *irel_head;
13121   unsigned long insn;
13122   int times;
13123   int enable;           /* Apply ifc.  */
13124   int ex9_enable;       /* Apply ifc after ex9.  */
13125   struct elf_nds32_ifc_symbol_entry *next;
13126 };
13127
13128 struct elf_nds32_ifc_irel_list
13129 {
13130   Elf_Internal_Rela *irel;
13131   asection *sec;
13132   bfd_vma addr;
13133   /* If this is set, then it is the last instruction for
13134      ifc-chain, so it must be keep for the actual branching.  */
13135   int keep;
13136   struct elf_nds32_ifc_irel_list *next;
13137 };
13138
13139 static struct elf_nds32_ifc_symbol_entry *ifc_symbol_head = NULL;
13140
13141 /* Insert symbol of jal and j for ifc.  */
13142
13143 static void
13144 nds32_elf_ifc_insert_symbol (asection *sec,
13145                              struct elf_link_hash_entry *h,
13146                              Elf_Internal_Rela *irel,
13147                              unsigned long insn)
13148 {
13149   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13150
13151   /* Check there is target of existing entry the same as the new one.  */
13152   while (ptr != NULL)
13153     {
13154       if (((h == NULL && ptr->sec == sec
13155             && ELF32_R_SYM (ptr->irel_head->irel->r_info) == ELF32_R_SYM (irel->r_info)
13156             && ptr->irel_head->irel->r_addend == irel->r_addend)
13157            || h != NULL)
13158           && ptr->h == h
13159           && ptr->insn == insn)
13160         {
13161           /* The same target exist, so insert into list.  */
13162           struct elf_nds32_ifc_irel_list *irel_list = ptr->irel_head;
13163
13164           while (irel_list->next != NULL)
13165             irel_list = irel_list->next;
13166           irel_list->next = bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list));
13167           irel_list = irel_list->next;
13168           irel_list->irel = irel;
13169           irel_list->keep = 1;
13170
13171           if (h == NULL)
13172             irel_list->sec = NULL;
13173           else
13174             irel_list->sec = sec;
13175           irel_list->next = NULL;
13176           return;
13177         }
13178       if (ptr->next == NULL)
13179         break;
13180       ptr = ptr->next;
13181     }
13182
13183   /* There is no same target entry, so build a new one.  */
13184   if (ifc_symbol_head == NULL)
13185     {
13186       ifc_symbol_head = bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry));
13187       ptr = ifc_symbol_head;
13188     }
13189   else
13190     {
13191       ptr->next = bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry));
13192       ptr = ptr->next;
13193     }
13194
13195   ptr->h = h;
13196   ptr->irel_head = bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list));
13197   ptr->irel_head->irel = irel;
13198   ptr->insn = insn;
13199   ptr->irel_head->keep = 1;
13200
13201   if (h == NULL)
13202     {
13203       /* Local symbols.  */
13204       ptr->sec = sec;
13205       ptr->irel_head->sec = NULL;
13206     }
13207   else
13208     {
13209       /* Global symbol.  */
13210       ptr->sec = NULL;
13211       ptr->irel_head->sec = sec;
13212     }
13213
13214   ptr->irel_head->next = NULL;
13215   ptr->times = 0;
13216   ptr->enable = 0;
13217   ptr->ex9_enable = 0;
13218   ptr->next = NULL;
13219 }
13220
13221 /* Gather all jal and j instructions.  */
13222
13223 static bfd_boolean
13224 nds32_elf_ifc_calc (struct bfd_link_info *info,
13225                     bfd *abfd, asection *sec)
13226 {
13227   Elf_Internal_Rela *internal_relocs;
13228   Elf_Internal_Rela *irelend;
13229   Elf_Internal_Rela *irel;
13230   Elf_Internal_Shdr *symtab_hdr;
13231   bfd_byte *contents = NULL;
13232   uint32_t insn, insn_with_reg;
13233   unsigned long r_symndx;
13234   struct elf_link_hash_entry *h;
13235   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
13236   struct elf_nds32_link_hash_table *table;
13237   bfd_boolean ifc_loop_aware;
13238
13239   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
13240                                                TRUE /* keep_memory */);
13241   irelend = internal_relocs + sec->reloc_count;
13242   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13243
13244   /* Check if the object enable ifc.  */
13245   irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend,
13246                                  R_NDS32_RELAX_ENTRY);
13247
13248   if (irel == NULL
13249       || irel >= irelend
13250       || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
13251       || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
13252           && !(irel->r_addend & R_NDS32_RELAX_ENTRY_IFC_FLAG)))
13253     return TRUE;
13254
13255   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
13256     return FALSE;
13257
13258   table = nds32_elf_hash_table (info);
13259   ifc_loop_aware = table->ifc_loop_aware;
13260   while (irel != NULL && irel < irelend)
13261     {
13262       /* Traverse all relocation and gather all of them to build the list.  */
13263
13264       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN)
13265         {
13266           if (ifc_loop_aware == 1
13267               && (irel->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG) != 0)
13268             {
13269               /* Check the region if loop or not.  If it is true and
13270                  ifc-loop-aware is true, ignore the region till region end.  */
13271               while (irel != NULL
13272                      && irel < irelend
13273                      && (ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_END
13274                          || (irel->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG) != 0))
13275                 irel++;
13276             }
13277         }
13278
13279       if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA)
13280         {
13281           insn = bfd_getb32 (contents + irel->r_offset);
13282           nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
13283           r_symndx = ELF32_R_SYM (irel->r_info);
13284           if (r_symndx < symtab_hdr->sh_info)
13285             {
13286               /* Local symbol.  */
13287               nds32_elf_ifc_insert_symbol (sec, NULL, irel, insn_with_reg);
13288             }
13289           else
13290             {
13291               /* External symbol.  */
13292               h = sym_hashes[r_symndx - symtab_hdr->sh_info];
13293               nds32_elf_ifc_insert_symbol (sec, h, irel, insn_with_reg);
13294             }
13295         }
13296       irel++;
13297     }
13298   return TRUE;
13299 }
13300
13301 /* Determine whether j and jal should be substituted.  */
13302
13303 static void
13304 nds32_elf_ifc_filter (struct bfd_link_info *info)
13305 {
13306   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13307   struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13308   struct elf_nds32_ifc_irel_list *irel_keeper = NULL;
13309   struct elf_nds32_link_hash_table *table;
13310   int target_optimize;
13311   bfd_vma address;
13312
13313   table = nds32_elf_hash_table (info);
13314   target_optimize = table->target_optimize;
13315   while (ptr)
13316     {
13317       irel_ptr = ptr->irel_head;
13318       if (ptr->h == NULL)
13319         {
13320           /* Local symbol.  */
13321           irel_keeper = irel_ptr;
13322           while (irel_ptr && irel_ptr->next)
13323             {
13324               /* Check there is jump target can be used.  */
13325               if ((irel_ptr->next->irel->r_offset
13326                    - irel_keeper->irel->r_offset) > 1022)
13327                 irel_keeper = irel_ptr->next;
13328               else
13329                 {
13330                   ptr->enable = 1;
13331                   irel_ptr->keep = 0;
13332                 }
13333               irel_ptr = irel_ptr->next;
13334             }
13335         }
13336       else
13337         {
13338           /* Global symbol.  */
13339           /* We have to get the absolute address and decide
13340              whether to keep it or not.  */
13341           while (irel_ptr)
13342             {
13343               address = (irel_ptr->irel->r_offset
13344                          + irel_ptr->sec->output_section->vma
13345                          + irel_ptr->sec->output_offset);
13346               irel_ptr->addr = address;
13347               irel_ptr = irel_ptr->next;
13348             }
13349
13350           irel_ptr = ptr->irel_head;
13351           while (irel_ptr)
13352             {
13353               /* Sort by address.  */
13354               struct elf_nds32_ifc_irel_list *irel_dest = irel_ptr;
13355               struct elf_nds32_ifc_irel_list *irel_temp = irel_ptr;
13356               struct elf_nds32_ifc_irel_list *irel_ptr_prev = NULL;
13357               struct elf_nds32_ifc_irel_list *irel_dest_prev = NULL;
13358
13359               /* Get the smallest one.  */
13360               while (irel_temp->next)
13361                 {
13362                   if (irel_temp->next->addr < irel_dest->addr)
13363                     {
13364                       irel_dest_prev = irel_temp;
13365                       irel_dest = irel_temp->next;
13366                     }
13367                   irel_temp = irel_temp->next;
13368                 }
13369
13370               if (irel_dest != irel_ptr)
13371                 {
13372                   if (irel_ptr_prev)
13373                     irel_ptr_prev->next = irel_dest;
13374                   if (irel_dest_prev)
13375                     irel_dest_prev->next = irel_ptr;
13376                   irel_temp = irel_ptr->next;
13377                   irel_ptr->next = irel_dest->next;
13378                   irel_dest->next = irel_temp;
13379                 }
13380               irel_ptr_prev = irel_ptr;
13381               irel_ptr = irel_ptr->next;
13382             }
13383
13384           irel_ptr = ptr->irel_head;
13385           irel_keeper = irel_ptr;
13386           while (irel_ptr && irel_ptr->next)
13387             {
13388               if ((irel_ptr->next->addr - irel_keeper->addr) > 1022)
13389                 irel_keeper = irel_ptr->next;
13390               else
13391                 {
13392                   ptr->enable = 1;
13393                   irel_ptr->keep = 0;
13394                 }
13395               irel_ptr = irel_ptr->next;
13396             }
13397         }
13398
13399         /* Ex9 enable.  Reserve it for ex9.  */
13400       if ((target_optimize & NDS32_RELAX_EX9_ON)
13401           && ptr->irel_head != irel_keeper)
13402         ptr->enable = 0;
13403       ptr = ptr->next;
13404     }
13405 }
13406
13407 /* Determine whether j and jal should be substituted after ex9 done.  */
13408
13409 static void
13410 nds32_elf_ifc_filter_after_ex9 (void)
13411 {
13412   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13413   struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13414
13415   while (ptr)
13416     {
13417       if (ptr->enable == 0)
13418         {
13419           /* Check whether ifc is applied or not.  */
13420           irel_ptr = ptr->irel_head;
13421           ptr->ex9_enable = 1;
13422           while (irel_ptr)
13423             {
13424               if (ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_TRAN)
13425                 {
13426                   /* Ex9 already.  */
13427                   ptr->ex9_enable = 0;
13428                   break;
13429                 }
13430               irel_ptr = irel_ptr->next;
13431             }
13432         }
13433       ptr = ptr->next;
13434     }
13435 }
13436
13437 /* Wrapper to do ifc relaxation.  */
13438
13439 bfd_boolean
13440 nds32_elf_ifc_finish (struct bfd_link_info *info)
13441 {
13442   int relax_status;
13443   struct elf_nds32_link_hash_table *table;
13444
13445   table = nds32_elf_hash_table (info);
13446   relax_status = table->relax_status;
13447
13448   if (!(relax_status & NDS32_RELAX_JUMP_IFC_DONE))
13449     nds32_elf_ifc_filter (info);
13450   else
13451     nds32_elf_ifc_filter_after_ex9 ();
13452
13453   if (!nds32_elf_ifc_replace (info))
13454     return FALSE;
13455
13456   if (table)
13457     table->relax_status |= NDS32_RELAX_JUMP_IFC_DONE;
13458   return TRUE;
13459 }
13460
13461 /* Traverse the result of ifc filter and replace it with ifcall9.  */
13462
13463 static bfd_boolean
13464 nds32_elf_ifc_replace (struct bfd_link_info *info)
13465 {
13466   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13467   struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13468   nds32_elf_blank_t *relax_blank_list = NULL;
13469   bfd_byte *contents = NULL;
13470   Elf_Internal_Rela *internal_relocs;
13471   Elf_Internal_Rela *irel;
13472   Elf_Internal_Rela *irelend;
13473   unsigned short insn16 = INSN_IFCALL9;
13474   struct elf_nds32_link_hash_table *table;
13475   int relax_status;
13476
13477   table = nds32_elf_hash_table (info);
13478   relax_status = table->relax_status;
13479
13480   while (ptr)
13481     {
13482       /* Traverse the ifc gather list, and replace the
13483          filter entries by ifcall9.  */
13484       if ((!(relax_status & NDS32_RELAX_JUMP_IFC_DONE) && ptr->enable == 1)
13485           || ((relax_status & NDS32_RELAX_JUMP_IFC_DONE)
13486               && ptr->ex9_enable == 1))
13487         {
13488           irel_ptr = ptr->irel_head;
13489           if (ptr->h == NULL)
13490             {
13491               /* Local symbol.  */
13492               internal_relocs = _bfd_elf_link_read_relocs
13493                 (ptr->sec->owner, ptr->sec, NULL, NULL, TRUE /* keep_memory */);
13494               irelend = internal_relocs + ptr->sec->reloc_count;
13495
13496               if (!nds32_get_section_contents (ptr->sec->owner, ptr->sec,
13497                                                &contents, TRUE))
13498                 return FALSE;
13499
13500               while (irel_ptr)
13501                 {
13502                   if (irel_ptr->keep == 0 && irel_ptr->next)
13503                     {
13504                       /* The one can be replaced.  We have to check whether
13505                          there is any alignment point in the region.  */
13506                       irel = irel_ptr->irel;
13507                       while (((irel_ptr->next->keep == 0
13508                                && irel < irel_ptr->next->irel)
13509                               || (irel_ptr->next->keep == 1 && irel < irelend))
13510                              && !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13511                                   && (irel->r_addend & 0x1f) == 2))
13512                         irel++;
13513                       if (irel >= irelend
13514                           || !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13515                                && (irel->r_addend & 0x1f) == 2
13516                                && ((irel->r_offset - get_nds32_elf_blank_total
13517                                     (&relax_blank_list, irel->r_offset, 1))
13518                                    & 0x02) == 0))
13519                         {
13520                           /* Replace by ifcall9.  */
13521                           bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13522                           if (!insert_nds32_elf_blank_recalc_total
13523                               (&relax_blank_list, irel_ptr->irel->r_offset + 2, 2))
13524                             return FALSE;
13525                           irel_ptr->irel->r_info =
13526                             ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13527                                           R_NDS32_10IFCU_PCREL_RELA);
13528                         }
13529                     }
13530                   irel_ptr = irel_ptr->next;
13531                 }
13532
13533               /* Delete the redundant code.  */
13534               if (relax_blank_list)
13535                 {
13536                   nds32_elf_relax_delete_blanks (ptr->sec->owner, ptr->sec,
13537                                                  relax_blank_list);
13538                   relax_blank_list = NULL;
13539                 }
13540             }
13541           else
13542             {
13543               /* Global symbol.  */
13544               while (irel_ptr)
13545                 {
13546                   if (irel_ptr->keep == 0 && irel_ptr->next)
13547                     {
13548                       /* The one can be replaced, and we have to check
13549                          whether there is any alignment point in the region.  */
13550                       internal_relocs = _bfd_elf_link_read_relocs
13551                         (irel_ptr->sec->owner, irel_ptr->sec, NULL, NULL,
13552                          TRUE /* keep_memory */);
13553                       irelend = internal_relocs + irel_ptr->sec->reloc_count;
13554                       if (!nds32_get_section_contents (irel_ptr->sec->owner,
13555                                                        irel_ptr->sec, &contents,
13556                                                        TRUE))
13557                         return FALSE;
13558
13559                       irel = irel_ptr->irel;
13560                       while (((irel_ptr->sec == irel_ptr->next->sec
13561                                && irel_ptr->next->keep == 0
13562                                && irel < irel_ptr->next->irel)
13563                               || ((irel_ptr->sec != irel_ptr->next->sec
13564                                    || irel_ptr->next->keep == 1)
13565                                   && irel < irelend))
13566                              && !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13567                                   && (irel->r_addend & 0x1f) == 2))
13568                         irel++;
13569                       if (irel >= irelend
13570                           || !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
13571                                && (irel->r_addend & 0x1f) == 2
13572                                && ((irel->r_offset
13573                                     - get_nds32_elf_blank_total (&relax_blank_list,
13574                                                             irel->r_offset, 1)) & 0x02) == 0))
13575                         {
13576                           /* Replace by ifcall9.  */
13577                           bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13578                           if (!insert_nds32_elf_blank_recalc_total
13579                               (&relax_blank_list, irel_ptr->irel->r_offset + 2, 2))
13580                             return FALSE;
13581
13582                           /* Delete the redundant code, and clear the relocation.  */
13583                           nds32_elf_relax_delete_blanks (irel_ptr->sec->owner,
13584                                                          irel_ptr->sec,
13585                                                          relax_blank_list);
13586                           irel_ptr->irel->r_info =
13587                             ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13588                                           R_NDS32_10IFCU_PCREL_RELA);
13589                           relax_blank_list = NULL;
13590                         }
13591                     }
13592
13593                   irel_ptr = irel_ptr->next;
13594                 }
13595             }
13596         }
13597       ptr = ptr->next;
13598     }
13599
13600   return TRUE;
13601 }
13602
13603 /* Relocate ifcall.  */
13604
13605 static bfd_boolean
13606 nds32_elf_ifc_reloc (void)
13607 {
13608   struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
13609   struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
13610   struct elf_nds32_ifc_irel_list *irel_keeper = NULL;
13611   bfd_vma relocation, address;
13612   unsigned short insn16;
13613   bfd_byte *contents = NULL;
13614   static bfd_boolean done = FALSE;
13615
13616   if (done)
13617     return TRUE;
13618
13619   done = TRUE;
13620
13621   while (ptr)
13622     {
13623       /* Check the entry is enable ifcall.  */
13624       if (ptr->enable == 1 || ptr->ex9_enable == 1)
13625         {
13626           /* Get the reserve jump.  */
13627           irel_ptr = ptr->irel_head;
13628           while (irel_ptr)
13629             {
13630               if (irel_ptr->keep == 1)
13631                 {
13632                   irel_keeper = irel_ptr;
13633                   break;
13634                 }
13635               irel_ptr = irel_ptr->next;
13636             }
13637
13638           irel_ptr = ptr->irel_head;
13639           if (ptr->h == NULL)
13640             {
13641               /* Local symbol.  */
13642               if (!nds32_get_section_contents (ptr->sec->owner, ptr->sec,
13643                                                &contents, TRUE))
13644                 return FALSE;
13645
13646               while (irel_ptr)
13647                 {
13648                   if (irel_ptr->keep == 0
13649                       && ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
13650                     {
13651                       relocation = irel_keeper->irel->r_offset;
13652                       relocation = relocation - irel_ptr->irel->r_offset;
13653                       while (irel_keeper && relocation > 1022)
13654                         {
13655                           irel_keeper = irel_keeper->next;
13656                           if (irel_keeper && irel_keeper->keep == 1)
13657                             {
13658                               relocation = irel_keeper->irel->r_offset;
13659                               relocation = relocation - irel_ptr->irel->r_offset;
13660                             }
13661                         }
13662                       if (relocation > 1022)
13663                         {
13664                           /* Double check.  */
13665                           irel_keeper = ptr->irel_head;
13666                           while (irel_keeper)
13667                             {
13668                               if (irel_keeper->keep == 1)
13669                                 {
13670                                   relocation = irel_keeper->irel->r_offset;
13671                                   relocation = relocation - irel_ptr->irel->r_offset;
13672                                 }
13673                               if (relocation <= 1022)
13674                                 break;
13675                               irel_keeper = irel_keeper->next;
13676                             }
13677                           if (!irel_keeper)
13678                             return FALSE;
13679                         }
13680                       irel_ptr->irel->r_info =
13681                         ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13682                                       R_NDS32_NONE);
13683                       insn16 = INSN_IFCALL9 | (relocation >> 1);
13684                       bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13685                     }
13686                   irel_ptr = irel_ptr->next;
13687                 }
13688             }
13689           else
13690             {
13691               /* Global symbol.  */
13692               while (irel_ptr)
13693                 {
13694                   if (irel_ptr->keep == 0
13695                       && ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
13696                     {
13697                       /* Get the distance between ifcall and jump.  */
13698                       relocation = (irel_keeper->irel->r_offset
13699                                     + irel_keeper->sec->output_section->vma
13700                                     + irel_keeper->sec->output_offset);
13701                       address = (irel_ptr->irel->r_offset
13702                                  + irel_ptr->sec->output_section->vma
13703                                  + irel_ptr->sec->output_offset);
13704                       relocation = relocation - address;
13705
13706                       /* The distance is over ragne, find callee again.  */
13707                       while (irel_keeper && relocation > 1022)
13708                         {
13709                           irel_keeper = irel_keeper->next;
13710                           if (irel_keeper && irel_keeper->keep ==1)
13711                             {
13712                               relocation = (irel_keeper->irel->r_offset
13713                                             + irel_keeper->sec->output_section->vma
13714                                             + irel_keeper->sec->output_offset);
13715                               relocation = relocation - address;
13716                             }
13717                         }
13718
13719                       if (relocation > 1022)
13720                         {
13721                           /* Double check.  */
13722                           irel_keeper = ptr->irel_head;
13723                           while (irel_keeper)
13724                             {
13725                               if (irel_keeper->keep == 1)
13726                                 {
13727
13728                                   relocation = (irel_keeper->irel->r_offset
13729                                                 + irel_keeper->sec->output_section->vma
13730                                                 + irel_keeper->sec->output_offset);
13731                                   relocation = relocation - address;
13732                                 }
13733                               if (relocation <= 1022)
13734                                 break;
13735                               irel_keeper = irel_keeper->next;
13736                             }
13737                           if (!irel_keeper)
13738                             return FALSE;
13739                         }
13740                       if (!nds32_get_section_contents
13741                           (irel_ptr->sec->owner, irel_ptr->sec, &contents, TRUE))
13742                         return FALSE;
13743                       insn16 = INSN_IFCALL9 | (relocation >> 1);
13744                       bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
13745                       irel_ptr->irel->r_info =
13746                         ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
13747                                       R_NDS32_NONE);
13748                     }
13749                   irel_ptr =irel_ptr->next;
13750                 }
13751             }
13752         }
13753       ptr = ptr->next;
13754     }
13755
13756   return TRUE;
13757 }
13758
13759 /* End of IFC relaxation.  */
13760 \f
13761 /* EX9 Instruction Table Relaxation.  */
13762
13763 /* Global hash list.  */
13764 struct elf_link_hash_entry_list
13765 {
13766   struct elf_link_hash_entry *h;
13767   struct elf_link_hash_entry_list *next;
13768 };
13769
13770 /* Save different destination but same insn.  */
13771 struct elf_link_hash_entry_mul_list
13772 {
13773   /* Global symbol times.  */
13774   int times;
13775   /* Save relocation for each global symbol but useful??  */
13776   Elf_Internal_Rela *irel;
13777   /* For sethi, two sethi may have the same high-part but different low-parts.  */
13778   Elf_Internal_Rela rel_backup;
13779   struct elf_link_hash_entry_list *h_list;
13780   struct elf_link_hash_entry_mul_list *next;
13781 };
13782
13783 /* Instruction hash table.  */
13784 struct elf_nds32_code_hash_entry
13785 {
13786   struct bfd_hash_entry root;
13787   int times;
13788   /* For insn that can use relocation or constant ex: sethi.  */
13789   int const_insn;
13790   asection *sec;
13791   struct elf_link_hash_entry_mul_list *m_list;
13792   /* Using r_addend.  */
13793   Elf_Internal_Rela *irel;
13794   /* Using r_info.  */
13795   Elf_Internal_Rela rel_backup;
13796 };
13797
13798 /* Instruction count list.  */
13799 struct elf_nds32_insn_times_entry
13800 {
13801   const char *string;
13802   int times;
13803   int order;
13804   asection *sec;
13805   struct elf_link_hash_entry_mul_list *m_list;
13806   Elf_Internal_Rela *irel;
13807   Elf_Internal_Rela rel_backup;
13808   struct elf_nds32_insn_times_entry *next;
13809 };
13810
13811 /* J and JAL symbol list.  */
13812 struct elf_nds32_symbol_entry
13813 {
13814   char *string;
13815   unsigned long insn;
13816   struct elf_nds32_symbol_entry *next;
13817 };
13818
13819 /* Relocation list.  */
13820 struct elf_nds32_irel_entry
13821 {
13822   Elf_Internal_Rela *irel;
13823   struct elf_nds32_irel_entry *next;
13824 };
13825
13826 /* ex9.it insn need to be fixed.  */
13827 struct elf_nds32_ex9_refix
13828 {
13829   Elf_Internal_Rela *irel;
13830   asection *sec;
13831   struct elf_link_hash_entry *h;
13832   int order;
13833   struct elf_nds32_ex9_refix *next;
13834 };
13835
13836 static struct bfd_hash_table ex9_code_table;
13837 static struct elf_nds32_insn_times_entry *ex9_insn_head = NULL;
13838 static struct elf_nds32_ex9_refix *ex9_refix_head = NULL;
13839
13840 /* EX9 hash function.  */
13841
13842 static struct bfd_hash_entry *
13843 nds32_elf_code_hash_newfunc (struct bfd_hash_entry *entry,
13844                              struct bfd_hash_table *table,
13845                              const char *string)
13846 {
13847   struct elf_nds32_code_hash_entry *ret;
13848
13849   /* Allocate the structure if it has not already been allocated by a
13850      subclass.  */
13851   if (entry == NULL)
13852     {
13853       entry = (struct bfd_hash_entry *)
13854         bfd_hash_allocate (table, sizeof (*ret));
13855       if (entry == NULL)
13856         return entry;
13857     }
13858
13859   /* Call the allocation method of the superclass.  */
13860   entry = bfd_hash_newfunc (entry, table, string);
13861   if (entry == NULL)
13862     return entry;
13863
13864   ret = (struct elf_nds32_code_hash_entry*) entry;
13865   ret->times = 0;
13866   ret->const_insn = 0;
13867   ret->m_list = NULL;
13868   ret->sec = NULL;
13869   ret->irel = NULL;
13870   return &ret->root;
13871 }
13872
13873 /* Insert ex9 entry
13874    this insert must be stable sorted by times.  */
13875
13876 static void
13877 nds32_elf_ex9_insert_entry (struct elf_nds32_insn_times_entry *ptr)
13878 {
13879   struct elf_nds32_insn_times_entry *temp;
13880   struct elf_nds32_insn_times_entry *temp2;
13881
13882   if (ex9_insn_head == NULL)
13883     {
13884       ex9_insn_head = ptr;
13885       ptr->next = NULL;
13886     }
13887   else
13888     {
13889       temp = ex9_insn_head;
13890       temp2 = ex9_insn_head;
13891       while (temp->next &&
13892              (temp->next->times >= ptr->times
13893               || temp->times == -1))
13894         {
13895           if (temp->times == -1)
13896             temp2 = temp;
13897           temp = temp->next;
13898         }
13899       if (ptr->times > temp->times && temp->times != -1)
13900         {
13901           ptr->next = temp;
13902           if (temp2->times == -1)
13903             temp2->next = ptr;
13904           else
13905             ex9_insn_head = ptr;
13906         }
13907       else if (temp->next == NULL)
13908         {
13909           temp->next = ptr;
13910           ptr->next = NULL;
13911         }
13912       else
13913         {
13914           ptr->next = temp->next;
13915           temp->next = ptr;
13916         }
13917     }
13918 }
13919
13920 /* Examine each insn times in hash table.
13921    Handle multi-link hash entry.
13922
13923    TODO: This function doesn't assign so much info since it is fake.  */
13924
13925 static int
13926 nds32_elf_examine_insn_times (struct elf_nds32_code_hash_entry *h)
13927 {
13928   struct elf_nds32_insn_times_entry *ptr;
13929   int times;
13930
13931   if (h->m_list == NULL)
13932     {
13933       /* Local symbol insn or insn without relocation.  */
13934       if (h->times < 3)
13935         return TRUE;
13936
13937       ptr = (struct elf_nds32_insn_times_entry *)
13938         bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13939       ptr->times = h->times;
13940       ptr->string = h->root.string;
13941       ptr->m_list = NULL;
13942       ptr->sec = h->sec;
13943       ptr->irel = h->irel;
13944       ptr->rel_backup = h->rel_backup;
13945       nds32_elf_ex9_insert_entry (ptr);
13946     }
13947   else
13948     {
13949       /* Global symbol insn.  */
13950       /* Only sethi insn has multiple m_list.  */
13951       struct elf_link_hash_entry_mul_list *m_list = h->m_list;
13952
13953       times = 0;
13954       while (m_list)
13955         {
13956           times += m_list->times;
13957           m_list = m_list->next;
13958         }
13959       if (times >= 3)
13960         {
13961           m_list = h->m_list;
13962           ptr = (struct elf_nds32_insn_times_entry *)
13963             bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13964           ptr->times = times; /* Use the total times.  */
13965           ptr->string = h->root.string;
13966           ptr->m_list = m_list;
13967           ptr->sec = h->sec;
13968           ptr->irel = m_list->irel;
13969           ptr->rel_backup = m_list->rel_backup;
13970           nds32_elf_ex9_insert_entry (ptr);
13971         }
13972       if (h->const_insn == 1)
13973         {
13974           /* sethi with constant value.  */
13975           if (h->times < 3)
13976             return TRUE;
13977
13978           ptr = (struct elf_nds32_insn_times_entry *)
13979             bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
13980           ptr->times = h->times;
13981           ptr->string = h->root.string;
13982           ptr->m_list = NULL;
13983           ptr->sec = NULL;
13984           ptr->irel = NULL;
13985           ptr->rel_backup = h->rel_backup;
13986           nds32_elf_ex9_insert_entry (ptr);
13987         }
13988     }
13989   return TRUE;
13990 }
13991
13992 /* Count each insn times in hash table.
13993    Handle multi-link hash entry.  */
13994
13995 static int
13996 nds32_elf_count_insn_times (struct elf_nds32_code_hash_entry *h)
13997 {
13998   int reservation, times;
13999   unsigned long relocation, min_relocation;
14000   struct elf_nds32_insn_times_entry *ptr;
14001
14002   if (h->m_list == NULL)
14003     {
14004       /* Local symbol insn or insn without relocation.  */
14005       if (h->times < 3)
14006         return TRUE;
14007       ptr = (struct elf_nds32_insn_times_entry *)
14008         bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
14009       ptr->times = h->times;
14010       ptr->string = h->root.string;
14011       ptr->m_list = NULL;
14012       ptr->sec = h->sec;
14013       ptr->irel = h->irel;
14014       ptr->rel_backup = h->rel_backup;
14015       nds32_elf_ex9_insert_entry (ptr);
14016     }
14017   else
14018     {
14019       /* Global symbol insn.  */
14020       /* Only sethi insn has multiple m_list.  */
14021       struct elf_link_hash_entry_mul_list *m_list = h->m_list;
14022
14023       if (ELF32_R_TYPE (m_list->rel_backup.r_info) == R_NDS32_HI20_RELA
14024           && m_list->next != NULL)
14025         {
14026           /* Sethi insn has different symbol or addend but has same hi20.  */
14027           times = 0;
14028           reservation = 1;
14029           relocation = 0;
14030           min_relocation = 0xffffffff;
14031           while (m_list)
14032             {
14033               /* Get the minimum sethi address
14034                  and calculate how many entry the sethi-list have to use.  */
14035               if ((m_list->h_list->h->root.type == bfd_link_hash_defined
14036                    || m_list->h_list->h->root.type == bfd_link_hash_defweak)
14037                   && (m_list->h_list->h->root.u.def.section != NULL
14038                       && m_list->h_list->h->root.u.def.section->output_section != NULL))
14039                 {
14040                   relocation = (m_list->h_list->h->root.u.def.value +
14041                                 m_list->h_list->h->root.u.def.section->output_section->vma +
14042                                 m_list->h_list->h->root.u.def.section->output_offset);
14043                   relocation += m_list->irel->r_addend;
14044                 }
14045               else
14046                 relocation = 0;
14047               if (relocation < min_relocation)
14048                 min_relocation = relocation;
14049               times += m_list->times;
14050               m_list = m_list->next;
14051             }
14052           if (min_relocation < ex9_relax_size)
14053             reservation = (min_relocation >> 12) + 1;
14054           else
14055             reservation = (min_relocation >> 12)
14056                           - ((min_relocation - ex9_relax_size) >> 12) + 1;
14057           if (reservation < (times / 3))
14058             {
14059               /* Efficient enough to use ex9.  */
14060               int i;
14061
14062               for (i = reservation ; i > 0; i--)
14063                 {
14064                   /* Allocate number of reservation ex9 entry.  */
14065                   ptr = (struct elf_nds32_insn_times_entry *)
14066                     bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
14067                   ptr->times = h->m_list->times / reservation;
14068                   ptr->string = h->root.string;
14069                   ptr->m_list = h->m_list;
14070                   ptr->sec = h->sec;
14071                   ptr->irel = h->m_list->irel;
14072                   ptr->rel_backup = h->m_list->rel_backup;
14073                   nds32_elf_ex9_insert_entry (ptr);
14074                 }
14075             }
14076         }
14077       else
14078         {
14079           /* Normal global symbol that means no different address symbol
14080              using same ex9 entry.  */
14081           if (m_list->times >= 3)
14082             {
14083               ptr = (struct elf_nds32_insn_times_entry *)
14084                 bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
14085               ptr->times = m_list->times;
14086               ptr->string = h->root.string;
14087               ptr->m_list = h->m_list;
14088               ptr->sec = h->sec;
14089               ptr->irel = h->m_list->irel;
14090               ptr->rel_backup = h->m_list->rel_backup;
14091               nds32_elf_ex9_insert_entry (ptr);
14092             }
14093         }
14094
14095       if (h->const_insn == 1)
14096         {
14097           /* sethi with constant value.  */
14098           if (h->times < 3)
14099             return TRUE;
14100
14101           ptr = (struct elf_nds32_insn_times_entry *)
14102             bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
14103           ptr->times = h->times;
14104           ptr->string = h->root.string;
14105           ptr->m_list = NULL;
14106           ptr->sec = NULL;
14107           ptr->irel = NULL;
14108           ptr->rel_backup = h->rel_backup;
14109           nds32_elf_ex9_insert_entry (ptr);
14110         }
14111     }
14112
14113   return TRUE;
14114 }
14115
14116 /* Hash table traverse function.  */
14117
14118 static void
14119 nds32_elf_code_hash_traverse (int (*func) (struct elf_nds32_code_hash_entry*))
14120 {
14121   unsigned int i;
14122
14123   ex9_code_table.frozen = 1;
14124   for (i = 0; i < ex9_code_table.size; i++)
14125     {
14126       struct bfd_hash_entry *p;
14127
14128       for (p = ex9_code_table.table[i]; p != NULL; p = p->next)
14129         if (!func ((struct elf_nds32_code_hash_entry *) p))
14130           goto out;
14131     }
14132 out:
14133   ex9_code_table.frozen = 0;
14134 }
14135
14136
14137 /* Give order number to insn list.  */
14138
14139 static void
14140 nds32_elf_order_insn_times (struct bfd_link_info *info)
14141 {
14142   struct elf_nds32_insn_times_entry *ex9_insn;
14143   struct elf_nds32_insn_times_entry *temp = NULL;
14144   struct elf_nds32_link_hash_table *table;
14145   int ex9_limit;
14146   int number = 0;
14147
14148   if (ex9_insn_head == NULL)
14149     return;
14150
14151 /* The max number of entries is 512.  */
14152   ex9_insn = ex9_insn_head;
14153   table = nds32_elf_hash_table (info);
14154   ex9_limit = table->ex9_limit;
14155
14156   ex9_insn = ex9_insn_head;
14157
14158   while (ex9_insn != NULL && number < ex9_limit)
14159     {
14160       ex9_insn->order = number;
14161       number++;
14162       temp = ex9_insn;
14163       ex9_insn = ex9_insn->next;
14164     }
14165
14166   if (ex9_insn && temp)
14167     temp->next = NULL;
14168
14169   while (ex9_insn != NULL)
14170     {
14171       /* Free useless entry.  */
14172       temp = ex9_insn;
14173       ex9_insn = ex9_insn->next;
14174       free (temp);
14175     }
14176 }
14177
14178 /* Build .ex9.itable section.  */
14179
14180 static void
14181 nds32_elf_ex9_build_itable (struct bfd_link_info *link_info)
14182 {
14183   asection *table_sec;
14184   struct elf_nds32_insn_times_entry *ptr;
14185   bfd *it_abfd;
14186   int number = 0;
14187   bfd_byte *contents = NULL;
14188
14189   for (it_abfd = link_info->input_bfds; it_abfd != NULL;
14190        it_abfd = it_abfd->link.next)
14191     {
14192       /* Find the section .ex9.itable, and put all entries into it.  */
14193       table_sec = bfd_get_section_by_name (it_abfd, ".ex9.itable");
14194       if (table_sec != NULL)
14195         {
14196           if (!nds32_get_section_contents (it_abfd, table_sec, &contents, TRUE))
14197             return;
14198
14199           for (ptr = ex9_insn_head; ptr !=NULL ; ptr = ptr->next)
14200             number++;
14201
14202           table_sec->size = number * 4;
14203
14204           if (number == 0)
14205             return;
14206
14207           elf_elfheader (link_info->output_bfd)->e_flags |= E_NDS32_HAS_EX9_INST;
14208           number = 0;
14209           for (ptr = ex9_insn_head; ptr !=NULL ; ptr = ptr->next)
14210             {
14211               long val;
14212
14213               val = strtol (ptr->string, NULL, 16);
14214               bfd_putb32 ((bfd_vma) val, (char *) contents + (number * 4));
14215               number++;
14216             }
14217           break;
14218         }
14219     }
14220 }
14221
14222 /* Get insn with regs according to relocation type.  */
14223
14224 static void
14225 nds32_elf_get_insn_with_reg (Elf_Internal_Rela *irel,
14226                              uint32_t insn, uint32_t *insn_with_reg)
14227 {
14228   reloc_howto_type *howto = NULL;
14229
14230   if (irel == NULL
14231       || (ELF32_R_TYPE (irel->r_info) >= (int) ARRAY_SIZE (nds32_elf_howto_table)
14232           && (ELF32_R_TYPE (irel->r_info) - R_NDS32_RELAX_ENTRY)
14233              >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table)))
14234     {
14235       *insn_with_reg = insn;
14236       return;
14237     }
14238
14239   howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
14240   *insn_with_reg = insn & (0xffffffff ^ howto->dst_mask);
14241 }
14242
14243 /* Mask number of address bits according to relocation.  */
14244
14245 static unsigned long
14246 nds32_elf_irel_mask (Elf_Internal_Rela *irel)
14247 {
14248   reloc_howto_type *howto = NULL;
14249
14250   if (irel == NULL
14251       || (ELF32_R_TYPE (irel->r_info) >= (int) ARRAY_SIZE (nds32_elf_howto_table)
14252           && (ELF32_R_TYPE (irel->r_info) - R_NDS32_RELAX_ENTRY)
14253              >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table)))
14254     return 0;
14255
14256   howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
14257   return howto->dst_mask;
14258 }
14259
14260 static void
14261 nds32_elf_insert_irel_entry (struct elf_nds32_irel_entry **irel_list,
14262                              struct elf_nds32_irel_entry *irel_ptr)
14263 {
14264   if (*irel_list == NULL)
14265     {
14266       *irel_list = irel_ptr;
14267       irel_ptr->next = NULL;
14268     }
14269   else
14270     {
14271       irel_ptr->next = *irel_list;
14272       *irel_list = irel_ptr;
14273     }
14274 }
14275
14276 static void
14277 nds32_elf_ex9_insert_fix (asection * sec, Elf_Internal_Rela * irel,
14278                           struct elf_link_hash_entry *h, int order)
14279 {
14280   struct elf_nds32_ex9_refix *ptr;
14281
14282   ptr = bfd_malloc (sizeof (struct elf_nds32_ex9_refix));
14283   ptr->sec = sec;
14284   ptr->irel = irel;
14285   ptr->h = h;
14286   ptr->order = order;
14287   ptr->next = NULL;
14288
14289   if (ex9_refix_head == NULL)
14290     ex9_refix_head = ptr;
14291   else
14292     {
14293       struct elf_nds32_ex9_refix *temp = ex9_refix_head;
14294
14295       while (temp->next != NULL)
14296         temp = temp->next;
14297       temp->next = ptr;
14298     }
14299 }
14300
14301 enum
14302 {
14303   DATA_EXIST = 1,
14304   CLEAN_PRE = 1 << 1,
14305   PUSH_PRE = 1 << 2
14306 };
14307
14308 /* Check relocation type if supporting for ex9.  */
14309
14310 static int
14311 nds32_elf_ex9_relocation_check (struct bfd_link_info *info,
14312                                 Elf_Internal_Rela **irel,
14313                                 Elf_Internal_Rela *irelend,
14314                                 nds32_elf_blank_t *relax_blank_list,
14315                                 asection *sec,bfd_vma *off,
14316                                 bfd_byte *contents)
14317 {
14318   /* Suppress ex9 if `.no_relax ex9' or inner loop.  */
14319   bfd_boolean nested_ex9, nested_loop;
14320   bfd_boolean ex9_loop_aware;
14321   /* We use the highest 1 byte of result to record
14322      how many bytes location counter has to move.  */
14323   int result = 0;
14324   Elf_Internal_Rela *irel_save = NULL;
14325   struct elf_nds32_link_hash_table *table;
14326
14327   table = nds32_elf_hash_table (info);
14328   ex9_loop_aware = table->ex9_loop_aware;
14329
14330   while ((*irel) != NULL && (*irel) < irelend && *off == (*irel)->r_offset)
14331     {
14332       switch (ELF32_R_TYPE ((*irel)->r_info))
14333         {
14334         case R_NDS32_RELAX_REGION_BEGIN:
14335           /* Ignore code block.  */
14336           nested_ex9 = FALSE;
14337           nested_loop = FALSE;
14338           if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG)
14339               || (ex9_loop_aware
14340                   && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG)))
14341             {
14342               /* Check the region if loop or not.  If it is true and
14343                  ex9-loop-aware is true, ignore the region till region end.  */
14344               /* To save the status for in .no_relax ex9 region and
14345                  loop region to conform the block can do ex9 relaxation.  */
14346               nested_ex9 = ((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG);
14347               nested_loop = (ex9_loop_aware
14348                              && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG));
14349               while ((*irel) && (*irel) < irelend && (nested_ex9 || nested_loop))
14350                 {
14351                   (*irel)++;
14352                   if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_BEGIN)
14353                     {
14354                       /* There may be nested region.  */
14355                       if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG) != 0)
14356                         nested_ex9 = TRUE;
14357                       else if (ex9_loop_aware
14358                                && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))
14359                         nested_loop = TRUE;
14360                     }
14361                   else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_END)
14362                     {
14363                       /* The end of region.  */
14364                       if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG) != 0)
14365                         nested_ex9 = FALSE;
14366                       else if (ex9_loop_aware
14367                                && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))
14368                         nested_loop = FALSE;
14369                     }
14370                   else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_LABEL
14371                            && ((*irel)->r_addend & 0x1f) == 2)
14372                     {
14373                       /* Alignment exist in the region.  */
14374                       result |= CLEAN_PRE;
14375                       if (((*irel)->r_offset -
14376                            get_nds32_elf_blank_total (&relax_blank_list,
14377                                                       (*irel)->r_offset, 0)) & 0x02)
14378                         result |= PUSH_PRE;
14379                     }
14380                 }
14381               if ((*irel) >= irelend)
14382                 *off = sec->size;
14383               else
14384                 *off = (*irel)->r_offset;
14385
14386               /* The final instruction in the region, regard this one as data to ignore it.  */
14387               result |= DATA_EXIST;
14388               return result;
14389             }
14390           break;
14391
14392         case R_NDS32_LABEL:
14393           if (((*irel)->r_addend & 0x1f) == 2)
14394             {
14395               /* Check this point is align and decide to do ex9 or not.  */
14396               result |= CLEAN_PRE;
14397               if (((*irel)->r_offset -
14398                    get_nds32_elf_blank_total (&relax_blank_list,
14399                                               (*irel)->r_offset, 0)) & 0x02)
14400                 result |= PUSH_PRE;
14401             }
14402           break;
14403         case R_NDS32_32_RELA:
14404           /* Data.  */
14405           result |= (4 << 24);
14406           result |= DATA_EXIST;
14407           break;
14408         case R_NDS32_16_RELA:
14409           /* Data.  */
14410           result |= (2 << 24);
14411           result |= DATA_EXIST;
14412           break;
14413         case R_NDS32_DATA:
14414           /* Data.  */
14415           /* The least code alignment is 2.  If the data is only one byte,
14416              we have to shift one more byte.  */
14417           if ((*irel)->r_addend == 1)
14418             result |= ((*irel)->r_addend << 25) ;
14419           else
14420             result |= ((*irel)->r_addend << 24) ;
14421
14422           result |= DATA_EXIST;
14423           break;
14424
14425         case R_NDS32_25_PCREL_RELA:
14426         case R_NDS32_SDA16S3_RELA:
14427         case R_NDS32_SDA15S3_RELA:
14428         case R_NDS32_SDA15S3:
14429         case R_NDS32_SDA17S2_RELA:
14430         case R_NDS32_SDA15S2_RELA:
14431         case R_NDS32_SDA12S2_SP_RELA:
14432         case R_NDS32_SDA12S2_DP_RELA:
14433         case R_NDS32_SDA15S2:
14434         case R_NDS32_SDA18S1_RELA:
14435         case R_NDS32_SDA15S1_RELA:
14436         case R_NDS32_SDA15S1:
14437         case R_NDS32_SDA19S0_RELA:
14438         case R_NDS32_SDA15S0_RELA:
14439         case R_NDS32_SDA15S0:
14440         case R_NDS32_HI20_RELA:
14441         case R_NDS32_LO12S0_ORI_RELA:
14442         case R_NDS32_LO12S0_RELA:
14443         case R_NDS32_LO12S1_RELA:
14444         case R_NDS32_LO12S2_RELA:
14445           /* These relocation is supported ex9 relaxation currently.  */
14446           /* We have to save the relocation for using later, since we have
14447              to check there is any alignment in the same address.  */
14448           irel_save = *irel;
14449           break;
14450         default:
14451           /* Not support relocations.  */
14452           if (ELF32_R_TYPE ((*irel)->r_info) < ARRAY_SIZE (nds32_elf_howto_table)
14453               && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_NONE
14454               && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_INSN16)
14455             {
14456               /* Note: To optimize aggressively, it maybe can ignore R_NDS32_INSN16 here.
14457                  But we have to consider if there is any side-effect.  */
14458               if (!(result & DATA_EXIST))
14459                 {
14460                   /* We have to confirm there is no data relocation in the
14461                      same address.  In general case, this won't happen.  */
14462                   /* We have to do ex9 conservative, for those relocation not
14463                      considerd we ignore instruction.  */
14464                   result |= DATA_EXIST;
14465                   if (*(contents + *off) & 0x80)
14466                     result |= (2 << 24);
14467                   else
14468                     result |= (4 << 24);
14469                   break;
14470                 }
14471             }
14472         }
14473       if ((*irel) < irelend
14474           && ((*irel) + 1) < irelend
14475           && (*irel)->r_offset == ((*irel) + 1)->r_offset)
14476         /* There are relocations pointing to the same address, we have to
14477            check all of them.  */
14478         (*irel)++;
14479       else
14480         {
14481           if (irel_save)
14482             *irel = irel_save;
14483           return result;
14484         }
14485     }
14486   return result;
14487 }
14488
14489 /* Replace with ex9 instruction.  */
14490
14491 static bfd_boolean
14492 nds32_elf_ex9_push_insn (uint16_t insn16, bfd_byte *contents, bfd_vma pre_off,
14493                          nds32_elf_blank_t **relax_blank_list,
14494                          struct elf_nds32_irel_entry *pre_irel_ptr,
14495                          struct elf_nds32_irel_entry **irel_list)
14496 {
14497   if (insn16 != 0)
14498     {
14499       /* Implement the ex9 relaxation.  */
14500       bfd_putb16 (insn16, contents + pre_off);
14501       if (!insert_nds32_elf_blank_recalc_total (relax_blank_list,
14502                                                 pre_off + 2, 2))
14503         return FALSE;
14504       if (pre_irel_ptr != NULL)
14505         nds32_elf_insert_irel_entry (irel_list, pre_irel_ptr);
14506     }
14507   return TRUE;
14508 }
14509
14510 /* Replace input file instruction which is in ex9 itable.  */
14511
14512 static bfd_boolean
14513 nds32_elf_ex9_replace_instruction (struct bfd_link_info *info, bfd *abfd, asection *sec)
14514 {
14515   struct elf_nds32_insn_times_entry *ex9_insn = ex9_insn_head;
14516   bfd_byte *contents = NULL;
14517   bfd_vma off;
14518   uint16_t insn16, insn_ex9;
14519   /* `pre_*' are used to track previous instruction that can use ex9.it.  */
14520   bfd_vma pre_off = -1;
14521   uint16_t pre_insn16 = 0;
14522   struct elf_nds32_irel_entry *pre_irel_ptr = NULL;
14523   Elf_Internal_Rela *internal_relocs;
14524   Elf_Internal_Rela *irel;
14525   Elf_Internal_Rela *irelend;
14526   Elf_Internal_Shdr *symtab_hdr;
14527   Elf_Internal_Sym *isym = NULL;
14528   nds32_elf_blank_t *relax_blank_list = NULL;
14529   uint32_t insn = 0;
14530   uint32_t insn_with_reg = 0;
14531   uint32_t it_insn;
14532   uint32_t it_insn_with_reg;
14533   unsigned long r_symndx;
14534   asection *isec;
14535   struct elf_nds32_irel_entry *irel_list = NULL;
14536   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
14537   int data_flag, do_replace, save_irel;
14538   struct elf_link_hash_entry_list *h_list;
14539
14540
14541   /* Load section instructions, relocations, and symbol table.  */
14542   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
14543       || !nds32_get_local_syms (abfd, sec, &isym))
14544     return FALSE;
14545   internal_relocs =
14546     _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, TRUE /* keep_memory */);
14547   irelend = internal_relocs + sec->reloc_count;
14548   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
14549
14550   off = 0;
14551
14552   /* Check if the object enable ex9.  */
14553   irel = find_relocs_at_address (internal_relocs, internal_relocs,
14554                                  irelend, R_NDS32_RELAX_ENTRY);
14555
14556   /* Check this section trigger ex9 relaxation.  */
14557   if (irel == NULL
14558       || irel >= irelend
14559       || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
14560       || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
14561           && !(irel->r_addend & R_NDS32_RELAX_ENTRY_EX9_FLAG)))
14562     return TRUE;
14563
14564   irel = internal_relocs;
14565
14566   /* Check alignment and fetch proper relocation.  */
14567   while (off < sec->size)
14568     {
14569       struct elf_link_hash_entry *h = NULL;
14570       struct elf_nds32_irel_entry *irel_ptr = NULL;
14571
14572       /* Syn the instruction and the relocation.  */
14573       while (irel != NULL && irel < irelend && irel->r_offset < off)
14574         irel++;
14575
14576       data_flag = nds32_elf_ex9_relocation_check (info, &irel, irelend,
14577                                                   relax_blank_list, sec,
14578                                                   &off, contents);
14579       if (data_flag & PUSH_PRE)
14580         if (!nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
14581                                       &relax_blank_list, pre_irel_ptr,
14582                                       &irel_list))
14583           return FALSE;
14584
14585       if (data_flag & CLEAN_PRE)
14586         {
14587           pre_off = 0;
14588           pre_insn16 = 0;
14589           pre_irel_ptr = NULL;
14590         }
14591       if (data_flag & DATA_EXIST)
14592         {
14593           /* We save the move offset in the highest byte.  */
14594           off += (data_flag >> 24);
14595           continue;
14596         }
14597
14598       if (*(contents + off) & 0x80)
14599         {
14600           /* 2-byte instruction.  */
14601           off += 2;
14602           continue;
14603         }
14604
14605       /* Load the instruction and its opcode with register for comparing.  */
14606       ex9_insn = ex9_insn_head;
14607       insn = bfd_getb32 (contents + off);
14608       insn_with_reg = 0;
14609       while (ex9_insn)
14610         {
14611           it_insn = strtol (ex9_insn->string, NULL, 16);
14612           it_insn_with_reg = 0;
14613           do_replace = 0;
14614           save_irel = 0;
14615
14616           if (irel != NULL && irel < irelend && irel->r_offset == off)
14617             {
14618               /* Insn with relocation.  */
14619               nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
14620
14621               if (ex9_insn->irel != NULL)
14622                 nds32_elf_get_insn_with_reg (ex9_insn->irel, it_insn,
14623                                              &it_insn_with_reg);
14624
14625               if (ex9_insn->irel != NULL
14626                   && (ELF32_R_TYPE (irel->r_info) ==
14627                       ELF32_R_TYPE (ex9_insn->irel->r_info))
14628                   && (insn_with_reg == it_insn_with_reg))
14629                 {
14630                   /* Insn relocation and format is the same as table entry.  */
14631
14632                   if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA
14633                       || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_ORI_RELA
14634                       || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_RELA
14635                       || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S1_RELA
14636                       || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_RELA
14637                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
14638                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
14639                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
14640                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
14641                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
14642                           && ELF32_R_TYPE (irel->r_info) <=
14643                           R_NDS32_SDA12S2_SP_RELA)
14644                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
14645                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))
14646                     {
14647                       r_symndx = ELF32_R_SYM (irel->r_info);
14648                       if (r_symndx < symtab_hdr->sh_info)
14649                         {
14650                           /* Local symbol.  */
14651                           int shndx = isym[r_symndx].st_shndx;
14652
14653                           isec = elf_elfsections (abfd)[shndx]->bfd_section;
14654                           if (ex9_insn->sec == isec
14655                               && ex9_insn->irel->r_addend == irel->r_addend
14656                               && ex9_insn->irel->r_info == irel->r_info)
14657                             {
14658                               do_replace = 1;
14659                               save_irel = 1;
14660                             }
14661                         }
14662                       else
14663                         {
14664                           /* External symbol.  */
14665                           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
14666                           if (ex9_insn->m_list)
14667                             {
14668                               h_list = ex9_insn->m_list->h_list;
14669                               while (h_list)
14670                                 {
14671                                   if (h == h_list->h
14672                                       && (ex9_insn->m_list->irel->r_addend ==
14673                                           irel->r_addend))
14674                                     {
14675                                       do_replace = 1;
14676                                       save_irel = 1;
14677                                       break;
14678                                     }
14679                                   h_list = h_list->next;
14680                                 }
14681                             }
14682                         }
14683                     }
14684                   else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_HI20_RELA)
14685                     {
14686                       r_symndx = ELF32_R_SYM (irel->r_info);
14687                       if (r_symndx < symtab_hdr->sh_info)
14688                         {
14689                           /* Local symbols.  Compare its base symbol and offset.  */
14690                           int shndx = isym[r_symndx].st_shndx;
14691
14692                           isec = elf_elfsections (abfd)[shndx]->bfd_section;
14693                           if (ex9_insn->sec == isec
14694                               && ex9_insn->irel->r_addend == irel->r_addend
14695                               && ex9_insn->irel->r_info == irel->r_info)
14696                             {
14697                               do_replace = 1;
14698                               save_irel = 1;
14699                             }
14700                         }
14701                       else
14702                         {
14703                           /* External symbol.  */
14704                           struct elf_link_hash_entry_mul_list *m_list;
14705
14706                           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
14707                           m_list = ex9_insn->m_list;
14708
14709                           while (m_list)
14710                             {
14711                               h_list = m_list->h_list;
14712
14713                               while (h_list)
14714                                 {
14715                                   if (h == h_list->h
14716                                       && (m_list->irel->r_addend
14717                                           == irel->r_addend))
14718                                     {
14719                                       do_replace = 1;
14720                                       save_irel = 1;
14721                                       if (ex9_insn->next
14722                                           && ex9_insn->m_list
14723                                           && ex9_insn->m_list == ex9_insn->next->m_list)
14724                                         {
14725                                           /* sethi multiple entry must be fixed */
14726                                           nds32_elf_ex9_insert_fix (sec, irel,
14727                                                                     h, ex9_insn->order);
14728                                         }
14729                                       break;
14730                                     }
14731                                   h_list = h_list->next;
14732                                 }
14733                               m_list = m_list->next;
14734                             }
14735                         }
14736                     }
14737                 }
14738
14739               /* Import table: Check the symbol hash table and the
14740                  jump target.  Only R_NDS32_25_PCREL_RELA now.  */
14741               else if (ex9_insn->times == -1
14742                        && ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA)
14743                 {
14744                   nds32_elf_get_insn_with_reg (irel, it_insn, &it_insn_with_reg);
14745                   if (insn_with_reg == it_insn_with_reg)
14746                     {
14747                       char code[10];
14748                       bfd_vma relocation;
14749
14750                       r_symndx = ELF32_R_SYM (irel->r_info);
14751                       if (r_symndx >= symtab_hdr->sh_info)
14752                         {
14753                           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
14754                           if ((h->root.type == bfd_link_hash_defined
14755                                || h->root.type == bfd_link_hash_defweak)
14756                               && h->root.u.def.section != NULL
14757                               && h->root.u.def.section->output_section != NULL
14758                               && h->root.u.def.section->gc_mark == 1
14759                               && bfd_is_abs_section (h->root.u.def.section)
14760                               && h->root.u.def.value > sec->size)
14761                             {
14762                               relocation = h->root.u.def.value +
14763                                 h->root.u.def.section->output_section->vma +
14764                                 h->root.u.def.section->output_offset;
14765                               relocation += irel->r_addend;
14766                               insn = insn_with_reg
14767                                 | ((relocation >> 1) & 0xffffff);
14768                               snprintf (code, sizeof (code), "%08x", insn);
14769                               if (strcmp (code, ex9_insn->string) == 0)
14770                                 {
14771                                   do_replace = 1;
14772                                   save_irel = 1;
14773                                 }
14774                             }
14775                         }
14776                     }
14777                 }
14778               else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
14779                        || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
14780                        || ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
14781                 {
14782                   /* These relocations do not have to relocate contens, so it can
14783                      be regard as instruction without relocation.  */
14784                   if (insn == it_insn && ex9_insn->irel == NULL)
14785                     do_replace = 1;
14786                 }
14787             }
14788           else
14789             {
14790               /* Instruction without relocation, we only
14791                  have to compare their byte code.  */
14792               if (insn == it_insn && ex9_insn->irel == NULL)
14793                 do_replace = 1;
14794             }
14795
14796           /* Insntruction match so replacing the code here.  */
14797           if (do_replace == 1)
14798             {
14799               /* There are two formats of ex9 instruction.  */
14800               if (ex9_insn->order < 32)
14801                 insn_ex9 = INSN_EX9_IT_2;
14802               else
14803                 insn_ex9 = INSN_EX9_IT_1;
14804               insn16 = insn_ex9 | ex9_insn->order;
14805
14806               /* Insert ex9 instruction.  */
14807               nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
14808                                        &relax_blank_list, pre_irel_ptr,
14809                                        &irel_list);
14810               pre_off = off;
14811               pre_insn16 = insn16;
14812
14813               if (save_irel)
14814                 {
14815                   /* For instuction with relocation do relax.  */
14816                   irel_ptr = (struct elf_nds32_irel_entry *)
14817                     bfd_malloc (sizeof (struct elf_nds32_irel_entry));
14818                   irel_ptr->irel = irel;
14819                   irel_ptr->next = NULL;
14820                   pre_irel_ptr = irel_ptr;
14821                 }
14822               else
14823                 pre_irel_ptr = NULL;
14824               break;
14825             }
14826           ex9_insn = ex9_insn->next;
14827         }
14828       off += 4;
14829     }
14830
14831   /* Insert ex9 instruction.  */
14832   nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
14833                            &relax_blank_list, pre_irel_ptr,
14834                            &irel_list);
14835
14836   /* Delete the redundant code.  */
14837   if (relax_blank_list)
14838     {
14839       nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
14840       relax_blank_list = NULL;
14841     }
14842
14843   /* Clear the relocation that is replaced by ex9.  */
14844   while (irel_list)
14845     {
14846       struct elf_nds32_irel_entry *irel_ptr;
14847
14848       irel_ptr = irel_list;
14849       irel_list = irel_ptr->next;
14850       irel_ptr->irel->r_info =
14851         ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info), R_NDS32_TRAN);
14852       free (irel_ptr);
14853     }
14854   return TRUE;
14855 }
14856
14857 /* Initialize ex9 hash table.  */
14858
14859 int
14860 nds32_elf_ex9_init (void)
14861 {
14862   if (!bfd_hash_table_init_n (&ex9_code_table, nds32_elf_code_hash_newfunc,
14863                               sizeof (struct elf_nds32_code_hash_entry),
14864                               1023))
14865     {
14866       _bfd_error_handler (_("Linker: cannot init ex9 hash table error \n"));
14867       return FALSE;
14868     }
14869   return TRUE;
14870 }
14871
14872 /* Predict how many bytes will be relaxed with ex9 and ifc.  */
14873
14874 static void
14875 nds32_elf_ex9_total_relax (struct bfd_link_info *info)
14876 {
14877   struct elf_nds32_insn_times_entry *ex9_insn;
14878   struct elf_nds32_insn_times_entry *temp;
14879   int target_optimize;
14880   struct elf_nds32_link_hash_table *table;
14881
14882   if (ex9_insn_head == NULL)
14883     return;
14884
14885   table = nds32_elf_hash_table (info);
14886   target_optimize  = table->target_optimize;
14887   ex9_insn = ex9_insn_head;
14888   while (ex9_insn)
14889     {
14890       ex9_relax_size = ex9_insn->times * 2 + ex9_relax_size;
14891       temp = ex9_insn;
14892       ex9_insn = ex9_insn->next;
14893       free (temp);
14894     }
14895   ex9_insn_head = NULL;
14896
14897   if ((target_optimize & NDS32_RELAX_JUMP_IFC_ON))
14898     {
14899       /* Examine ifc reduce size.  */
14900       struct elf_nds32_ifc_symbol_entry *ifc_ent = ifc_symbol_head;
14901       struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
14902       int size = 0;
14903
14904       while (ifc_ent)
14905         {
14906           if (ifc_ent->enable == 0)
14907             {
14908               /* Not ifc yet.  */
14909               irel_ptr = ifc_ent->irel_head;
14910               while (irel_ptr)
14911                 {
14912                   size += 2;
14913                   irel_ptr = irel_ptr->next;
14914                 }
14915             }
14916           size -= 2;
14917           ifc_ent = ifc_ent->next;
14918         }
14919       ex9_relax_size += size;
14920     }
14921 }
14922
14923 /* Finish ex9 table.  */
14924
14925 void
14926 nds32_elf_ex9_finish (struct bfd_link_info *link_info)
14927 {
14928   nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times);
14929   nds32_elf_order_insn_times (link_info);
14930   nds32_elf_ex9_total_relax (link_info);
14931   /* Traverse the hash table and count its times.  */
14932   nds32_elf_code_hash_traverse (nds32_elf_count_insn_times);
14933   nds32_elf_order_insn_times (link_info);
14934   nds32_elf_ex9_build_itable (link_info);
14935 }
14936
14937 /* Relocate the entries in ex9 table.  */
14938
14939 static bfd_vma
14940 nds32_elf_ex9_reloc_insn (struct elf_nds32_insn_times_entry *ptr,
14941                           struct bfd_link_info *link_info)
14942 {
14943   Elf_Internal_Sym *isym = NULL;
14944   bfd_vma relocation = -1;
14945   struct elf_link_hash_entry *h;
14946
14947   if (ptr->m_list != NULL)
14948     {
14949       /* Global symbol.  */
14950       h = ptr->m_list->h_list->h;
14951       if ((h->root.type == bfd_link_hash_defined
14952            || h->root.type == bfd_link_hash_defweak)
14953           && h->root.u.def.section != NULL
14954           && h->root.u.def.section->output_section != NULL)
14955         {
14956
14957           relocation = h->root.u.def.value +
14958             h->root.u.def.section->output_section->vma +
14959             h->root.u.def.section->output_offset;
14960           relocation += ptr->m_list->irel->r_addend;
14961         }
14962       else
14963         relocation = 0;
14964     }
14965   else if (ptr->sec !=NULL)
14966     {
14967       /* Local symbol.  */
14968       Elf_Internal_Sym sym;
14969       asection *sec = NULL;
14970       asection isec;
14971       asection *isec_ptr = &isec;
14972       Elf_Internal_Rela irel_backup = *(ptr->irel);
14973       asection *sec_backup = ptr->sec;
14974       bfd *abfd = ptr->sec->owner;
14975
14976       if (!nds32_get_local_syms (abfd, sec, &isym))
14977         return FALSE;
14978       isym = isym + ELF32_R_SYM (ptr->irel->r_info);
14979
14980       sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
14981       if (sec != NULL)
14982         *isec_ptr = *sec;
14983       sym = *isym;
14984
14985       /* The purpose is same as elf_link_input_bfd.  */
14986       if (isec_ptr != NULL
14987           && isec_ptr->sec_info_type == SEC_INFO_TYPE_MERGE
14988           && ELF_ST_TYPE (isym->st_info) != STT_SECTION)
14989         {
14990           sym.st_value =
14991             _bfd_merged_section_offset (ptr->sec->output_section->owner, &isec_ptr,
14992                                         elf_section_data (isec_ptr)->sec_info,
14993                                         isym->st_value);
14994         }
14995       relocation = _bfd_elf_rela_local_sym (link_info->output_bfd, &sym,
14996                                             &ptr->sec, ptr->irel);
14997       if (ptr->irel != NULL)
14998         relocation += ptr->irel->r_addend;
14999
15000       /* Restore origin value since there may be some insntructions that
15001          could not be replaced with ex9.it.  */
15002       *(ptr->irel) = irel_backup;
15003       ptr->sec = sec_backup;
15004     }
15005
15006   return relocation;
15007 }
15008
15009 /* Import ex9 table and build list.  */
15010
15011 void
15012 nds32_elf_ex9_import_table (struct bfd_link_info *info)
15013 {
15014   int num = 0;
15015   bfd_byte *contents;
15016   unsigned long insn;
15017   FILE *ex9_import_file;
15018   int update_ex9_table;
15019   struct elf_nds32_link_hash_table *table;
15020
15021   table = nds32_elf_hash_table (info);
15022   ex9_import_file = table->ex9_import_file;
15023   rewind (table->ex9_import_file);
15024
15025   contents = bfd_malloc (sizeof (bfd_byte) * 4);
15026
15027   /* Read instructions from the input file and build the list.  */
15028   while (!feof (ex9_import_file))
15029     {
15030       char *code;
15031       struct elf_nds32_insn_times_entry *ptr;
15032       size_t nread;
15033
15034       nread = fread (contents, sizeof (bfd_byte) * 4, 1, ex9_import_file);
15035       /* Ignore the final byte 0x0a.  */
15036       if (nread < 1)
15037         break;
15038       insn = bfd_getb32 (contents);
15039       code = bfd_malloc (sizeof (char) * 9);
15040       snprintf (code, 9, "%08lx", insn);
15041       ptr = bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
15042       ptr->string = code;
15043       ptr->order = num;
15044       ptr->times = -1;
15045       ptr->sec = NULL;
15046       ptr->m_list = NULL;
15047       ptr->rel_backup.r_offset = 0;
15048       ptr->rel_backup.r_info = 0;
15049       ptr->rel_backup.r_addend = 0;
15050       ptr->irel = NULL;
15051       ptr->next = NULL;
15052       nds32_elf_ex9_insert_entry (ptr);
15053       num++;
15054     }
15055
15056   update_ex9_table = table->update_ex9_table;
15057   if (update_ex9_table == 1)
15058     {
15059       /* It has to consider of sethi need to use multiple page
15060          but it not be done yet.  */
15061       nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times);
15062       nds32_elf_order_insn_times (info);
15063     }
15064 }
15065
15066 /* Export ex9 table.  */
15067
15068 static void
15069 nds32_elf_ex9_export (struct bfd_link_info *info,
15070                       bfd_byte *contents, int size)
15071 {
15072   FILE *ex9_export_file;
15073   struct elf_nds32_link_hash_table *table;
15074
15075   table = nds32_elf_hash_table (info);
15076   ex9_export_file = table->ex9_export_file;
15077   fwrite (contents, sizeof (bfd_byte), size, ex9_export_file);
15078   fclose (ex9_export_file);
15079 }
15080
15081 /* Adjust relocations of J and JAL in ex9.itable.
15082    Export ex9 table.  */
15083
15084 static void
15085 nds32_elf_ex9_reloc_jmp (struct bfd_link_info *link_info)
15086 {
15087   asection *table_sec = NULL;
15088   struct elf_nds32_insn_times_entry *ex9_insn = ex9_insn_head;
15089   struct elf_nds32_insn_times_entry *temp_ptr, *temp_ptr2;
15090   bfd *it_abfd;
15091   uint32_t insn, insn_with_reg, source_insn;
15092   bfd_byte *contents = NULL, *source_contents = NULL;
15093   int size = 0;
15094   bfd_vma gp;
15095   int shift, update_ex9_table, offset = 0;
15096   reloc_howto_type *howto = NULL;
15097   Elf_Internal_Rela rel_backup;
15098   unsigned short insn_ex9;
15099   struct elf_nds32_link_hash_table *table;
15100   FILE *ex9_export_file;
15101   static bfd_boolean done = FALSE;
15102
15103   if (done)
15104     return;
15105
15106   done = TRUE;
15107
15108   table = nds32_elf_hash_table (link_info);
15109   if (table)
15110     table->relax_status |= NDS32_RELAX_EX9_DONE;
15111
15112
15113   update_ex9_table = table->update_ex9_table;
15114   /* Generated ex9.itable exactly.  */
15115   if (update_ex9_table == 0)
15116     {
15117       for (it_abfd = link_info->input_bfds; it_abfd != NULL;
15118            it_abfd = it_abfd->link.next)
15119         {
15120           table_sec = bfd_get_section_by_name (it_abfd, ".ex9.itable");
15121           if (table_sec != NULL)
15122             break;
15123         }
15124
15125       if (table_sec != NULL)
15126         {
15127           bfd *output_bfd;
15128
15129           output_bfd = table_sec->output_section->owner;
15130           nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
15131           if (table_sec->size == 0)
15132             return;
15133
15134           if (!nds32_get_section_contents (it_abfd, table_sec, &contents, TRUE))
15135             return;
15136         }
15137     }
15138   else
15139     {
15140       /* Set gp.  */
15141       bfd *output_bfd;
15142
15143       output_bfd = link_info->input_bfds->sections->output_section->owner;
15144       nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
15145       contents = bfd_malloc (sizeof (bfd_byte) * 2048);
15146     }
15147
15148   /* Relocate instruction.  */
15149   while (ex9_insn)
15150     {
15151       bfd_vma relocation, min_relocation = 0xffffffff;
15152
15153       insn = strtol (ex9_insn->string, NULL, 16);
15154       insn_with_reg = 0;
15155       if (ex9_insn->m_list != NULL || ex9_insn->sec != NULL)
15156         {
15157           if (ex9_insn->m_list)
15158             rel_backup = ex9_insn->m_list->rel_backup;
15159           else
15160             rel_backup = ex9_insn->rel_backup;
15161
15162           nds32_elf_get_insn_with_reg (&rel_backup, insn, &insn_with_reg);
15163           howto =
15164             bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE
15165                                                    (rel_backup.r_info));
15166           shift = howto->rightshift;
15167           if (ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_25_PCREL_RELA
15168               || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S0_ORI_RELA
15169               || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S0_RELA
15170               || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S1_RELA
15171               || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S2_RELA)
15172             {
15173               relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
15174               insn =
15175                 insn_with_reg | ((relocation >> shift) &
15176                                  nds32_elf_irel_mask (&rel_backup));
15177               bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15178             }
15179           else if ((ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA15S3
15180                     && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA15S0)
15181                    || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA15S3_RELA
15182                        && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA15S0_RELA)
15183                    || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA12S2_DP_RELA
15184                        && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA12S2_SP_RELA)
15185                    || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA16S3_RELA
15186                        && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA19S0_RELA))
15187             {
15188               relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
15189               insn =
15190                 insn_with_reg | (((relocation - gp) >> shift) &
15191                                  nds32_elf_irel_mask (&rel_backup));
15192               bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15193             }
15194           else if (ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_HI20_RELA)
15195             {
15196               /* Sethi may be multiple entry for one insn.  */
15197               if (ex9_insn->next && ex9_insn->m_list
15198                   && ex9_insn->m_list == ex9_insn->next->m_list)
15199                 {
15200                   struct elf_link_hash_entry_mul_list *m_list;
15201                   struct elf_nds32_ex9_refix *fix_ptr;
15202                   struct elf_link_hash_entry *h;
15203
15204                   temp_ptr = ex9_insn;
15205                   temp_ptr2 = ex9_insn;
15206                   m_list = ex9_insn->m_list;
15207                   while (m_list)
15208                     {
15209                       h = m_list->h_list->h;
15210                       relocation = h->root.u.def.value +
15211                         h->root.u.def.section->output_section->vma +
15212                         h->root.u.def.section->output_offset;
15213                       relocation += m_list->irel->r_addend;
15214
15215                       if (relocation < min_relocation)
15216                         min_relocation = relocation;
15217                       m_list = m_list->next;
15218                     }
15219                   relocation = min_relocation;
15220
15221                   /* Put insntruction into ex9 table.  */
15222                   insn = insn_with_reg
15223                     | ((relocation >> shift) & nds32_elf_irel_mask (&rel_backup));
15224                   bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15225                   relocation = relocation + 0x1000;     /* hi20 */
15226
15227                   while (ex9_insn->next && ex9_insn->m_list
15228                          && ex9_insn->m_list == ex9_insn->next->m_list)
15229                     {
15230                       /* Multiple sethi.  */
15231                       ex9_insn = ex9_insn->next;
15232                       size += 4;
15233                       insn =
15234                         insn_with_reg | ((relocation >> shift) &
15235                                          nds32_elf_irel_mask (&rel_backup));
15236                       bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15237                       relocation = relocation + 0x1000; /* hi20 */
15238                     }
15239
15240                   fix_ptr = ex9_refix_head;
15241                   while (fix_ptr)
15242                     {
15243                       /* Fix ex9 insn.  */
15244                       /* temp_ptr2 points to the head of multiple sethi.  */
15245                       temp_ptr = temp_ptr2;
15246                       while (fix_ptr->order != temp_ptr->order && fix_ptr->next)
15247                         {
15248                           fix_ptr = fix_ptr->next;
15249                         }
15250                       if (fix_ptr->order != temp_ptr->order)
15251                         break;
15252
15253                       /* Set source insn.  */
15254                       relocation =
15255                         fix_ptr->h->root.u.def.value +
15256                         fix_ptr->h->root.u.def.section->output_section->vma +
15257                         fix_ptr->h->root.u.def.section->output_offset;
15258                       relocation += fix_ptr->irel->r_addend;
15259                       /* sethi imm is imm20s.  */
15260                       source_insn = insn_with_reg | ((relocation >> shift) & 0xfffff);
15261
15262                       while (temp_ptr)
15263                         {
15264                           /* Match entry and source code.  */
15265                           insn = bfd_getb32 (contents + (temp_ptr->order) * 4 + offset);
15266                           if (insn == source_insn)
15267                             {
15268                               /* Fix the ex9 insn.  */
15269                               if (temp_ptr->order != fix_ptr->order)
15270                                 {
15271                                   if (!nds32_get_section_contents
15272                                          (fix_ptr->sec->owner, fix_ptr->sec,
15273                                           &source_contents, TRUE))
15274                                     _bfd_error_handler
15275                                       (_("Linker: error cannot fixed ex9 relocation \n"));
15276                                   if (temp_ptr->order < 32)
15277                                     insn_ex9 = INSN_EX9_IT_2;
15278                                   else
15279                                     insn_ex9 = INSN_EX9_IT_1;
15280                                   insn_ex9 = insn_ex9 | temp_ptr->order;
15281                                   bfd_putb16 (insn_ex9, source_contents + fix_ptr->irel->r_offset);
15282                                 }
15283                                 break;
15284                             }
15285                           else
15286                             {
15287                               if (!temp_ptr->next || temp_ptr->m_list != temp_ptr->next->m_list)
15288                                 _bfd_error_handler
15289                                   (_("Linker: error cannot fixed ex9 relocation \n"));
15290                               else
15291                                 temp_ptr = temp_ptr->next;
15292                             }
15293                         }
15294                       fix_ptr = fix_ptr->next;
15295                     }
15296                 }
15297               else
15298                 {
15299                   relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
15300                   insn = insn_with_reg
15301                          | ((relocation >> shift) & nds32_elf_irel_mask (&rel_backup));
15302                   bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15303                 }
15304             }
15305         }
15306       else
15307         {
15308           /* Insn without relocation does not have to be fixed
15309              if need to update export table.  */
15310           if (update_ex9_table == 1)
15311             bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
15312         }
15313       ex9_insn = ex9_insn->next;
15314       size += 4;
15315     }
15316
15317   ex9_export_file = table->ex9_export_file;
15318   if (ex9_export_file != NULL)
15319     nds32_elf_ex9_export (link_info, contents, table_sec->size);
15320   else if (update_ex9_table == 1)
15321     {
15322       table->ex9_export_file = table->ex9_import_file;
15323       rewind (table->ex9_export_file);
15324       nds32_elf_ex9_export (link_info, contents, size);
15325     }
15326 }
15327
15328 /* Generate ex9 hash table.  */
15329
15330 static bfd_boolean
15331 nds32_elf_ex9_build_hash_table (bfd *abfd, asection *sec,
15332                                 struct bfd_link_info *link_info)
15333 {
15334   Elf_Internal_Rela *internal_relocs;
15335   Elf_Internal_Rela *irelend;
15336   Elf_Internal_Rela *irel;
15337   Elf_Internal_Rela *jrel;
15338   Elf_Internal_Rela rel_backup;
15339   Elf_Internal_Shdr *symtab_hdr;
15340   Elf_Internal_Sym *isym = NULL;
15341   asection *isec;
15342   struct elf_link_hash_entry **sym_hashes;
15343   bfd_byte *contents = NULL;
15344   bfd_vma off = 0;
15345   unsigned long r_symndx;
15346   uint32_t insn, insn_with_reg;
15347   struct elf_link_hash_entry *h;
15348   int data_flag, shift, align;
15349   bfd_vma relocation;
15350   /* Suppress ex9 if `.no_relax ex9' or inner loop.  */
15351   reloc_howto_type *howto = NULL;
15352
15353   sym_hashes = elf_sym_hashes (abfd);
15354   /* Load section instructions, relocations, and symbol table.  */
15355   if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
15356     return FALSE;
15357
15358   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
15359                                                TRUE /* keep_memory */);
15360   irelend = internal_relocs + sec->reloc_count;
15361   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
15362   if (!nds32_get_local_syms (abfd, sec, &isym))
15363     return FALSE;
15364
15365   /* Check the object if enable ex9.  */
15366   irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend,
15367                                  R_NDS32_RELAX_ENTRY);
15368
15369   /* Check this section trigger ex9 relaxation.  */
15370   if (irel == NULL
15371       || irel >= irelend
15372       || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
15373       || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
15374           && !(irel->r_addend & R_NDS32_RELAX_ENTRY_EX9_FLAG)))
15375     return TRUE;
15376
15377   irel = internal_relocs;
15378
15379   /* Push each insn into hash table.  */
15380   while (off < sec->size)
15381     {
15382       char code[10];
15383       struct elf_nds32_code_hash_entry *entry;
15384
15385       while (irel != NULL && irel < irelend && irel->r_offset < off)
15386         irel++;
15387
15388       data_flag = nds32_elf_ex9_relocation_check (link_info, &irel, irelend,
15389                                                   NULL, sec, &off, contents);
15390       if (data_flag & DATA_EXIST)
15391         {
15392           /* We save the move offset in the highest byte.  */
15393           off += (data_flag >> 24);
15394           continue;
15395         }
15396
15397       if (*(contents + off) & 0x80)
15398         {
15399           off += 2;
15400         }
15401       else
15402         {
15403           h = NULL;
15404           isec = NULL;
15405           jrel = NULL;
15406           rel_backup.r_info = 0;
15407           rel_backup.r_offset = 0;
15408           rel_backup.r_addend = 0;
15409           /* Load the instruction and its opcode with register for comparing.  */
15410           insn = bfd_getb32 (contents + off);
15411           insn_with_reg = 0;
15412           if (irel != NULL && irel < irelend && irel->r_offset == off)
15413             {
15414               nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
15415               howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
15416               shift = howto->rightshift;
15417               align = (1 << shift) - 1;
15418               if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA
15419                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_HI20_RELA
15420                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_ORI_RELA
15421                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_RELA
15422                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S1_RELA
15423                   || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_RELA
15424                   ||(ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
15425                      && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
15426                   || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
15427                       && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
15428                   || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
15429                       && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA)
15430                   || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
15431                       && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))
15432                 {
15433                   r_symndx = ELF32_R_SYM (irel->r_info);
15434                   jrel = irel;
15435                   rel_backup = *irel;
15436                   if (r_symndx < symtab_hdr->sh_info)
15437                     {
15438                       /* Local symbol.  */
15439                       int shndx = isym[r_symndx].st_shndx;
15440
15441                       bfd_vma st_value = (isym + r_symndx)->st_value;
15442                       isec = elf_elfsections (abfd)[shndx]->bfd_section;
15443                       relocation = (isec->output_section->vma + isec->output_offset
15444                                     + st_value + irel->r_addend);
15445                     }
15446                   else
15447                     {
15448                       /* External symbol.  */
15449                       bfd_boolean warned ATTRIBUTE_UNUSED;
15450                       bfd_boolean ignored ATTRIBUTE_UNUSED;
15451                       bfd_boolean unresolved_reloc ATTRIBUTE_UNUSED;
15452                       asection *sym_sec;
15453
15454                       /* Maybe there is a better way to get h and relocation */
15455                       RELOC_FOR_GLOBAL_SYMBOL (link_info, abfd, sec, irel,
15456                                                r_symndx, symtab_hdr, sym_hashes,
15457                                                h, sym_sec, relocation,
15458                                                unresolved_reloc, warned, ignored);
15459                       relocation += irel->r_addend;
15460                       if ((h->root.type != bfd_link_hash_defined
15461                            && h->root.type != bfd_link_hash_defweak)
15462                           || strcmp (h->root.root.string, "_FP_BASE_") == 0)
15463                         {
15464                           off += 4;
15465                           continue;
15466                         }
15467                     }
15468
15469                   /* Check for gp relative instruction alignment.  */
15470                   if ((ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
15471                        && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
15472                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
15473                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
15474                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
15475                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA)
15476                       || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
15477                           && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))
15478                     {
15479                       bfd_vma gp;
15480                       bfd *output_bfd = sec->output_section->owner;
15481                       bfd_reloc_status_type r;
15482
15483                       /* If the symbol is in the abs section, the out_bfd will be null.
15484                          This happens when the relocation has a symbol@GOTOFF.  */
15485                       r = nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
15486                       if (r != bfd_reloc_ok)
15487                         {
15488                           off += 4;
15489                           continue;
15490                         }
15491
15492                       relocation -= gp;
15493
15494                       /* Make sure alignment is correct.  */
15495                       if (relocation & align)
15496                         {
15497                           /* Incorrect alignment.  */
15498                           _bfd_error_handler
15499                             (_("%s: warning: unaligned small data access. "
15500                                "For entry: {%d, %d, %d}, addr = 0x%x, align = 0x%x."),
15501                              bfd_get_filename (abfd), irel->r_offset,
15502                              irel->r_info, irel->r_addend, relocation, align);
15503                           off += 4;
15504                           continue;
15505                         }
15506                     }
15507
15508                   insn = insn_with_reg
15509                     | ((relocation >> shift) & nds32_elf_irel_mask (irel));
15510                 }
15511               else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
15512                        || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
15513                        || ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
15514                 {
15515                   /* These relocations do not have to relocate contens, so it can
15516                      be regard as instruction without relocation.  */
15517                 }
15518               else
15519                 {
15520                   off += 4;
15521                   continue;
15522                 }
15523             }
15524
15525           snprintf (code, sizeof (code), "%08x", insn);
15526           /* Copy "code".  */
15527           entry = (struct elf_nds32_code_hash_entry*)
15528             bfd_hash_lookup (&ex9_code_table, code, TRUE, TRUE);
15529           if (entry == NULL)
15530             {
15531               _bfd_error_handler
15532                 (_("%P%F: failed creating ex9.it %s hash table: %E\n"), code);
15533               return FALSE;
15534             }
15535           if (h)
15536             {
15537               if (h->root.type == bfd_link_hash_undefined)
15538                 return TRUE;
15539               /* Global symbol.  */
15540               /* In order to do sethi with different symbol but same value.  */
15541               if (entry->m_list == NULL)
15542                 {
15543                   struct elf_link_hash_entry_mul_list *m_list_new;
15544                   struct elf_link_hash_entry_list *h_list_new;
15545
15546                   m_list_new = (struct elf_link_hash_entry_mul_list *)
15547                     bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list));
15548                   h_list_new = (struct elf_link_hash_entry_list *)
15549                     bfd_malloc (sizeof (struct elf_link_hash_entry_list));
15550                   entry->m_list = m_list_new;
15551                   m_list_new->h_list = h_list_new;
15552                   m_list_new->rel_backup = rel_backup;
15553                   m_list_new->times = 1;
15554                   m_list_new->irel = jrel;
15555                   m_list_new->next = NULL;
15556                   h_list_new->h = h;
15557                   h_list_new->next = NULL;
15558                 }
15559               else
15560                 {
15561                   struct elf_link_hash_entry_mul_list *m_list = entry->m_list;
15562                   struct elf_link_hash_entry_list *h_list;
15563
15564                   while (m_list)
15565                     {
15566                       /* Build the different symbols that point to the same address.  */
15567                       h_list = m_list->h_list;
15568                       if (h_list->h->root.u.def.value == h->root.u.def.value
15569                           && h_list->h->root.u.def.section->output_section->vma
15570                              == h->root.u.def.section->output_section->vma
15571                           && h_list->h->root.u.def.section->output_offset
15572                              == h->root.u.def.section->output_offset
15573                           && m_list->rel_backup.r_addend == rel_backup.r_addend)
15574                         {
15575                           m_list->times++;
15576                           m_list->irel = jrel;
15577                           while (h_list->h != h && h_list->next)
15578                             h_list = h_list->next;
15579                           if (h_list->h != h)
15580                             {
15581                               struct elf_link_hash_entry_list *h_list_new;
15582
15583                               h_list_new = (struct elf_link_hash_entry_list *)
15584                                 bfd_malloc (sizeof (struct elf_link_hash_entry_list));
15585                               h_list->next = h_list_new;
15586                               h_list_new->h = h;
15587                               h_list_new->next = NULL;
15588                             }
15589                           break;
15590                         }
15591                       /* The sethi case may have different address but the
15592                          hi20 is the same.  */
15593                       else if (ELF32_R_TYPE (jrel->r_info) == R_NDS32_HI20_RELA
15594                                && m_list->next == NULL)
15595                         {
15596                           struct elf_link_hash_entry_mul_list *m_list_new;
15597                           struct elf_link_hash_entry_list *h_list_new;
15598
15599                           m_list_new = (struct elf_link_hash_entry_mul_list *)
15600                             bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list));
15601                           h_list_new = (struct elf_link_hash_entry_list *)
15602                             bfd_malloc (sizeof (struct elf_link_hash_entry_list));
15603                           m_list->next = m_list_new;
15604                           m_list_new->h_list = h_list_new;
15605                           m_list_new->rel_backup = rel_backup;
15606                           m_list_new->times = 1;
15607                           m_list_new->irel = jrel;
15608                           m_list_new->next = NULL;
15609                           h_list_new->h = h;
15610                           h_list_new->next = NULL;
15611                           break;
15612                         }
15613                       m_list = m_list->next;
15614                     }
15615                   if (!m_list)
15616                     {
15617                       off += 4;
15618                       continue;
15619                     }
15620                 }
15621             }
15622           else
15623             {
15624               /* Local symbol and insn without relocation*/
15625               entry->times++;
15626               entry->rel_backup = rel_backup;
15627             }
15628
15629           /* Use in sethi insn with constant and global symbol in same format.  */
15630           if (!jrel)
15631             entry->const_insn = 1;
15632           else
15633             entry->irel = jrel;
15634           entry->sec = isec;
15635           off += 4;
15636         }
15637     }
15638   return TRUE;
15639 }
15640
15641 /* Set the _ITB_BASE, and point it to ex9 table.  */
15642
15643 bfd_boolean
15644 nds32_elf_ex9_itb_base (struct bfd_link_info *link_info)
15645 {
15646   bfd *abfd;
15647   asection *sec;
15648   bfd *output_bfd = NULL;
15649   struct bfd_link_hash_entry *bh = NULL;
15650
15651   if (is_ITB_BASE_set == 1)
15652     return TRUE;
15653
15654   is_ITB_BASE_set = 1;
15655
15656   bh = bfd_link_hash_lookup (link_info->hash, "_ITB_BASE_", FALSE, FALSE, TRUE);
15657
15658   if (bh && (bh->type == bfd_link_hash_defined
15659              || bh->type == bfd_link_hash_defweak))
15660     return TRUE;
15661
15662   for (abfd = link_info->input_bfds; abfd != NULL;
15663        abfd = abfd->link.next)
15664     {
15665       sec = bfd_get_section_by_name (abfd, ".ex9.itable");
15666       if (sec != NULL)
15667         {
15668           output_bfd = sec->output_section->owner;
15669           break;
15670         }
15671     }
15672   if (output_bfd == NULL)
15673     {
15674       output_bfd = link_info->output_bfd;
15675       if (output_bfd->sections == NULL)
15676         return TRUE;
15677       else
15678         sec = bfd_abs_section_ptr;
15679     }
15680   bh = bfd_link_hash_lookup (link_info->hash, "_ITB_BASE_",
15681                              FALSE, FALSE, TRUE);
15682   return (_bfd_generic_link_add_one_symbol
15683           (link_info, output_bfd, "_ITB_BASE_",
15684            BSF_GLOBAL | BSF_WEAK, sec, 0,
15685            (const char *) NULL, FALSE, get_elf_backend_data
15686            (output_bfd)->collect, &bh));
15687 } /* End EX9.IT  */
15688 \f
15689
15690 #define ELF_ARCH                                bfd_arch_nds32
15691 #define ELF_MACHINE_CODE                        EM_NDS32
15692 #define ELF_MAXPAGESIZE                         0x1000
15693 #define ELF_TARGET_ID                           NDS32_ELF_DATA
15694
15695 #define TARGET_BIG_SYM                          nds32_elf32_be_vec
15696 #define TARGET_BIG_NAME                         "elf32-nds32be"
15697 #define TARGET_LITTLE_SYM                       nds32_elf32_le_vec
15698 #define TARGET_LITTLE_NAME                      "elf32-nds32le"
15699
15700 #define elf_info_to_howto                       nds32_info_to_howto
15701 #define elf_info_to_howto_rel                   nds32_info_to_howto_rel
15702
15703 #define bfd_elf32_bfd_link_hash_table_create    nds32_elf_link_hash_table_create
15704 #define bfd_elf32_bfd_merge_private_bfd_data    nds32_elf_merge_private_bfd_data
15705 #define bfd_elf32_bfd_print_private_bfd_data    nds32_elf_print_private_bfd_data
15706 #define bfd_elf32_bfd_relax_section             nds32_elf_relax_section
15707 #define bfd_elf32_bfd_set_private_flags         nds32_elf_set_private_flags
15708
15709 #define bfd_elf32_mkobject                      nds32_elf_mkobject
15710 #define elf_backend_action_discarded            nds32_elf_action_discarded
15711 #define elf_backend_add_symbol_hook             nds32_elf_add_symbol_hook
15712 #define elf_backend_check_relocs                nds32_elf_check_relocs
15713 #define elf_backend_adjust_dynamic_symbol       nds32_elf_adjust_dynamic_symbol
15714 #define elf_backend_create_dynamic_sections     nds32_elf_create_dynamic_sections
15715 #define elf_backend_finish_dynamic_sections     nds32_elf_finish_dynamic_sections
15716 #define elf_backend_finish_dynamic_symbol       nds32_elf_finish_dynamic_symbol
15717 #define elf_backend_size_dynamic_sections       nds32_elf_size_dynamic_sections
15718 #define elf_backend_relocate_section            nds32_elf_relocate_section
15719 #define elf_backend_gc_mark_hook                nds32_elf_gc_mark_hook
15720 #define elf_backend_gc_sweep_hook               nds32_elf_gc_sweep_hook
15721 #define elf_backend_grok_prstatus               nds32_elf_grok_prstatus
15722 #define elf_backend_grok_psinfo                 nds32_elf_grok_psinfo
15723 #define elf_backend_reloc_type_class            nds32_elf_reloc_type_class
15724 #define elf_backend_copy_indirect_symbol        nds32_elf_copy_indirect_symbol
15725 #define elf_backend_link_output_symbol_hook     nds32_elf_output_symbol_hook
15726 #define elf_backend_output_arch_syms            nds32_elf_output_arch_syms
15727 #define elf_backend_object_p                    nds32_elf_object_p
15728 #define elf_backend_final_write_processing      nds32_elf_final_write_processing
15729 #define elf_backend_special_sections            nds32_elf_special_sections
15730 #define bfd_elf32_bfd_get_relocated_section_contents \
15731                                 nds32_elf_get_relocated_section_contents
15732
15733 #define elf_backend_can_gc_sections             1
15734 #define elf_backend_can_refcount                1
15735 #define elf_backend_want_got_plt                1
15736 #define elf_backend_plt_readonly                1
15737 #define elf_backend_want_plt_sym                0
15738 #define elf_backend_got_header_size             12
15739 #define elf_backend_may_use_rel_p               1
15740 #define elf_backend_default_use_rela_p          1
15741 #define elf_backend_may_use_rela_p              1
15742
15743 #include "elf32-target.h"
15744
15745 #undef ELF_MAXPAGESIZE
15746 #define ELF_MAXPAGESIZE                         0x2000
15747
15748 #undef TARGET_BIG_SYM
15749 #define TARGET_BIG_SYM                          nds32_elf32_linux_be_vec
15750 #undef TARGET_BIG_NAME
15751 #define TARGET_BIG_NAME                         "elf32-nds32be-linux"
15752 #undef TARGET_LITTLE_SYM
15753 #define TARGET_LITTLE_SYM                       nds32_elf32_linux_le_vec
15754 #undef TARGET_LITTLE_NAME
15755 #define TARGET_LITTLE_NAME                      "elf32-nds32le-linux"
15756 #undef elf32_bed
15757 #define elf32_bed                               elf32_nds32_lin_bed
15758
15759 #include "elf32-target.h"