1/* Ubicom IP2xxx specific support for 32-bit ELF
2   Copyright (C) 2000-2017 Free Software Foundation, Inc.
3
4   This file is part of BFD, the Binary File Descriptor library.
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 3 of the License, or
9   (at your option) any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software
18   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19   MA 02110-1301, USA.  */
20
21#include "sysdep.h"
22#include "bfd.h"
23#include "libbfd.h"
24#include "elf-bfd.h"
25#include "elf/ip2k.h"
26
27/* Struct used to pass miscellaneous paramaters which
28   helps to avoid overly long parameter lists.  */
29struct misc
30{
31  Elf_Internal_Shdr *  symtab_hdr;
32  Elf_Internal_Rela *  irelbase;
33  bfd_byte *           contents;
34  Elf_Internal_Sym *   isymbuf;
35};
36
37struct ip2k_opcode
38{
39  unsigned short opcode;
40  unsigned short mask;
41};
42
43static bfd_boolean ip2k_relaxed = FALSE;
44
45static const struct ip2k_opcode ip2k_page_opcode[] =
46{
47  {0x0010, 0xFFF8},	/* Page.  */
48  {0x0000, 0x0000},
49};
50
51#define IS_PAGE_OPCODE(code) \
52  ip2k_is_opcode (code, ip2k_page_opcode)
53
54static const struct ip2k_opcode ip2k_jmp_opcode[] =
55{
56  {0xE000, 0xE000},	/* Jmp.  */
57  {0x0000, 0x0000},
58};
59
60#define IS_JMP_OPCODE(code) \
61  ip2k_is_opcode (code, ip2k_jmp_opcode)
62
63static const struct ip2k_opcode ip2k_snc_opcode[] =
64{
65  {0xA00B, 0xFFFF},	/* Snc.  */
66  {0x0000, 0x0000},
67};
68
69#define IS_SNC_OPCODE(code) \
70  ip2k_is_opcode (code, ip2k_snc_opcode)
71
72static const struct ip2k_opcode ip2k_inc_1sp_opcode[] =
73{
74  {0x2B81, 0xFFFF},	/* Inc 1(SP).  */
75  {0x0000, 0x0000},
76};
77
78#define IS_INC_1SP_OPCODE(code) \
79  ip2k_is_opcode (code, ip2k_inc_1sp_opcode)
80
81static const struct ip2k_opcode ip2k_add_2sp_w_opcode[] =
82{
83  {0x1F82, 0xFFFF},	/* Add 2(SP),w.  */
84  {0x0000, 0x0000},
85};
86
87#define IS_ADD_2SP_W_OPCODE(code) \
88  ip2k_is_opcode (code, ip2k_add_2sp_w_opcode)
89
90static const struct ip2k_opcode ip2k_add_w_wreg_opcode[] =
91{
92  {0x1C0A, 0xFFFF},	/* Add w,wreg.  */
93  {0x1E0A, 0xFFFF},	/* Add wreg,w.  */
94  {0x0000, 0x0000},
95};
96
97#define IS_ADD_W_WREG_OPCODE(code) \
98  ip2k_is_opcode (code, ip2k_add_w_wreg_opcode)
99
100static const struct ip2k_opcode ip2k_add_pcl_w_opcode[] =
101{
102  {0x1E09, 0xFFFF},	/* Add pcl,w.  */
103  {0x0000, 0x0000},
104};
105
106#define IS_ADD_PCL_W_OPCODE(code) \
107  ip2k_is_opcode (code, ip2k_add_pcl_w_opcode)
108
109static const struct ip2k_opcode ip2k_skip_opcodes[] =
110{
111  {0xB000, 0xF000},	/* sb */
112  {0xA000, 0xF000},	/* snb */
113  {0x7600, 0xFE00},	/* cse/csne #lit */
114  {0x5800, 0xFC00},	/* incsnz */
115  {0x4C00, 0xFC00},	/* decsnz */
116  {0x4000, 0xFC00},	/* cse/csne */
117  {0x3C00, 0xFC00},	/* incsz */
118  {0x2C00, 0xFC00},	/* decsz */
119  {0x0000, 0x0000},
120};
121
122#define IS_SKIP_OPCODE(code) \
123  ip2k_is_opcode (code, ip2k_skip_opcodes)
124
125/* Relocation tables.  */
126static reloc_howto_type ip2k_elf_howto_table [] =
127{
128#define IP2K_HOWTO(t,rs,s,bs,pr,bp,name,sm,dm) \
129    HOWTO(t,                    /* type */ \
130          rs,                   /* rightshift */ \
131          s,                    /* size (0 = byte, 1 = short, 2 = long) */ \
132          bs,                   /* bitsize */ \
133          pr,                   /* pc_relative */ \
134          bp,                   /* bitpos */ \
135          complain_overflow_dont,/* complain_on_overflow */ \
136          bfd_elf_generic_reloc,/* special_function */ \
137          name,                 /* name */ \
138          FALSE,                /* partial_inplace */ \
139          sm,                   /* src_mask */ \
140          dm,                   /* dst_mask */ \
141          pr)                   /* pcrel_offset */
142
143  /* This reloc does nothing.  */
144  IP2K_HOWTO (R_IP2K_NONE, 0,3,0, FALSE, 0, "R_IP2K_NONE", 0, 0),
145  /* A 16 bit absolute relocation.  */
146  IP2K_HOWTO (R_IP2K_16, 0,1,16, FALSE, 0, "R_IP2K_16", 0, 0xffff),
147  /* A 32 bit absolute relocation.  */
148  IP2K_HOWTO (R_IP2K_32, 0,2,32, FALSE, 0, "R_IP2K_32", 0, 0xffffffff),
149  /* A 8-bit data relocation for the FR9 field.  Ninth bit is computed specially.  */
150  IP2K_HOWTO (R_IP2K_FR9, 0,1,9, FALSE, 0, "R_IP2K_FR9", 0, 0x00ff),
151  /* A 4-bit data relocation.  */
152  IP2K_HOWTO (R_IP2K_BANK, 8,1,4, FALSE, 0, "R_IP2K_BANK", 0, 0x000f),
153  /* A 13-bit insn relocation - word address => right-shift 1 bit extra.  */
154  IP2K_HOWTO (R_IP2K_ADDR16CJP, 1,1,13, FALSE, 0, "R_IP2K_ADDR16CJP", 0, 0x1fff),
155  /* A 3-bit insn relocation - word address => right-shift 1 bit extra.  */
156  IP2K_HOWTO (R_IP2K_PAGE3, 14,1,3, FALSE, 0, "R_IP2K_PAGE3", 0, 0x0007),
157  /* Two 8-bit data relocations.  */
158  IP2K_HOWTO (R_IP2K_LO8DATA, 0,1,8, FALSE, 0, "R_IP2K_LO8DATA", 0, 0x00ff),
159  IP2K_HOWTO (R_IP2K_HI8DATA, 8,1,8, FALSE, 0, "R_IP2K_HI8DATA", 0, 0x00ff),
160  /* Two 8-bit insn relocations.  word address => right-shift 1 bit extra.  */
161  IP2K_HOWTO (R_IP2K_LO8INSN, 1,1,8, FALSE, 0, "R_IP2K_LO8INSN", 0, 0x00ff),
162  IP2K_HOWTO (R_IP2K_HI8INSN, 9,1,8, FALSE, 0, "R_IP2K_HI8INSN", 0, 0x00ff),
163
164  /* Special 1 bit relocation for SKIP instructions.  */
165  IP2K_HOWTO (R_IP2K_PC_SKIP, 1,1,1, FALSE, 12, "R_IP2K_PC_SKIP", 0xfffe, 0x1000),
166  /* 16 bit word address.  */
167  IP2K_HOWTO (R_IP2K_TEXT, 1,1,16, FALSE, 0, "R_IP2K_TEXT", 0, 0xffff),
168  /* A 7-bit offset relocation for the FR9 field.  Eigth and ninth bit comes from insn.  */
169  IP2K_HOWTO (R_IP2K_FR_OFFSET, 0,1,9, FALSE, 0, "R_IP2K_FR_OFFSET", 0x180, 0x007f),
170  /* Bits 23:16 of an address.  */
171  IP2K_HOWTO (R_IP2K_EX8DATA, 16,1,8, FALSE, 0, "R_IP2K_EX8DATA", 0, 0x00ff),
172};
173
174
175/* Map BFD reloc types to IP2K ELF reloc types.  */
176
177static reloc_howto_type *
178ip2k_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
179			bfd_reloc_code_real_type code)
180{
181  /* Note that the ip2k_elf_howto_table is indxed by the R_
182     constants.  Thus, the order that the howto records appear in the
183     table *must* match the order of the relocation types defined in
184     include/elf/ip2k.h.  */
185
186  switch (code)
187    {
188    case BFD_RELOC_NONE:
189      return &ip2k_elf_howto_table[ (int) R_IP2K_NONE];
190    case BFD_RELOC_16:
191      return &ip2k_elf_howto_table[ (int) R_IP2K_16];
192    case BFD_RELOC_32:
193      return &ip2k_elf_howto_table[ (int) R_IP2K_32];
194    case BFD_RELOC_IP2K_FR9:
195      return &ip2k_elf_howto_table[ (int) R_IP2K_FR9];
196    case BFD_RELOC_IP2K_BANK:
197      return &ip2k_elf_howto_table[ (int) R_IP2K_BANK];
198    case BFD_RELOC_IP2K_ADDR16CJP:
199      return &ip2k_elf_howto_table[ (int) R_IP2K_ADDR16CJP];
200    case BFD_RELOC_IP2K_PAGE3:
201      return &ip2k_elf_howto_table[ (int) R_IP2K_PAGE3];
202    case BFD_RELOC_IP2K_LO8DATA:
203      return &ip2k_elf_howto_table[ (int) R_IP2K_LO8DATA];
204    case BFD_RELOC_IP2K_HI8DATA:
205      return &ip2k_elf_howto_table[ (int) R_IP2K_HI8DATA];
206    case BFD_RELOC_IP2K_LO8INSN:
207      return &ip2k_elf_howto_table[ (int) R_IP2K_LO8INSN];
208    case BFD_RELOC_IP2K_HI8INSN:
209      return &ip2k_elf_howto_table[ (int) R_IP2K_HI8INSN];
210    case BFD_RELOC_IP2K_PC_SKIP:
211      return &ip2k_elf_howto_table[ (int) R_IP2K_PC_SKIP];
212    case BFD_RELOC_IP2K_TEXT:
213      return &ip2k_elf_howto_table[ (int) R_IP2K_TEXT];
214    case BFD_RELOC_IP2K_FR_OFFSET:
215      return &ip2k_elf_howto_table[ (int) R_IP2K_FR_OFFSET];
216    case BFD_RELOC_IP2K_EX8DATA:
217      return &ip2k_elf_howto_table[ (int) R_IP2K_EX8DATA];
218    default:
219      /* Pacify gcc -Wall.  */
220      return NULL;
221    }
222  return NULL;
223}
224
225static reloc_howto_type *
226ip2k_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
227{
228  unsigned int i;
229
230  for (i = 0;
231       i < sizeof (ip2k_elf_howto_table) / sizeof (ip2k_elf_howto_table[0]);
232       i++)
233    if (ip2k_elf_howto_table[i].name != NULL
234	&& strcasecmp (ip2k_elf_howto_table[i].name, r_name) == 0)
235      return &ip2k_elf_howto_table[i];
236
237  return NULL;
238}
239
240static void
241ip2k_get_mem (bfd *abfd ATTRIBUTE_UNUSED,
242	      bfd_byte *addr,
243	      int length,
244	      bfd_byte *ptr)
245{
246  while (length --)
247    * ptr ++ = bfd_get_8 (abfd, addr ++);
248}
249
250static bfd_boolean
251ip2k_is_opcode (bfd_byte *code, const struct ip2k_opcode *opcodes)
252{
253  unsigned short insn = (code[0] << 8) | code[1];
254
255  while (opcodes->mask != 0)
256    {
257      if ((insn & opcodes->mask) == opcodes->opcode)
258	return TRUE;
259
260      opcodes ++;
261    }
262
263  return FALSE;
264}
265
266#define PAGENO(ABSADDR) ((ABSADDR) & 0xFFFFC000)
267#define BASEADDR(SEC)	((SEC)->output_section->vma + (SEC)->output_offset)
268
269#define UNDEFINED_SYMBOL (~(bfd_vma)0)
270
271/* Return the value of the symbol associated with the relocation IREL.  */
272
273static bfd_vma
274symbol_value (bfd *abfd,
275	      Elf_Internal_Shdr *symtab_hdr,
276	      Elf_Internal_Sym *isymbuf,
277	      Elf_Internal_Rela *irel)
278{
279  if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
280    {
281      Elf_Internal_Sym *isym;
282      asection *sym_sec;
283
284      isym = isymbuf + ELF32_R_SYM (irel->r_info);
285      if (isym->st_shndx == SHN_UNDEF)
286	sym_sec = bfd_und_section_ptr;
287      else if (isym->st_shndx == SHN_ABS)
288	sym_sec = bfd_abs_section_ptr;
289      else if (isym->st_shndx == SHN_COMMON)
290	sym_sec = bfd_com_section_ptr;
291      else
292	sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
293
294      return isym->st_value + BASEADDR (sym_sec);
295    }
296  else
297    {
298      unsigned long indx;
299      struct elf_link_hash_entry *h;
300
301      indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
302      h = elf_sym_hashes (abfd)[indx];
303      BFD_ASSERT (h != NULL);
304
305      if (h->root.type != bfd_link_hash_defined
306	  && h->root.type != bfd_link_hash_defweak)
307	return UNDEFINED_SYMBOL;
308
309      return (h->root.u.def.value + BASEADDR (h->root.u.def.section));
310    }
311}
312
313/* Determine if the instruction sequence matches that for
314   the prologue of a switch dispatch table with fewer than
315   128 entries.
316
317          sc
318          page    $nnn0
319          jmp     $nnn0
320          add     w,wreg
321          add     pcl,w
322  addr=>
323          page    $nnn1
324          jmp     $nnn1
325 	   page    $nnn2
326 	   jmp     $nnn2
327 	   ...
328 	   page    $nnnN
329 	   jmp     $nnnN
330
331  After relaxation.
332  	   sc
333 	   page    $nnn0
334  	   jmp     $nnn0
335 	   add     pcl,w
336  addr=>
337  	   jmp     $nnn1
338 	   jmp     $nnn2
339 	   ...
340          jmp     $nnnN  */
341
342static int
343ip2k_is_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
344			  asection *sec,
345			  bfd_vma addr,
346			  bfd_byte *contents)
347{
348  bfd_byte code[4];
349  int table_index = 0;
350
351  /* Check current page-jmp.  */
352  if (addr + 4 > sec->size)
353    return -1;
354
355  ip2k_get_mem (abfd, contents + addr, 4, code);
356
357  if ((! IS_PAGE_OPCODE (code + 0))
358      || (! IS_JMP_OPCODE (code + 2)))
359    return -1;
360
361  /* Search back.  */
362  while (1)
363    {
364      if (addr < 4)
365	return -1;
366
367      /* Check previous 2 instructions.  */
368      ip2k_get_mem (abfd, contents + addr - 4, 4, code);
369      if ((IS_ADD_W_WREG_OPCODE (code + 0))
370	  && (IS_ADD_PCL_W_OPCODE (code + 2)))
371	return table_index;
372
373      if ((! IS_PAGE_OPCODE (code + 0))
374	  || (! IS_JMP_OPCODE (code + 2)))
375	return -1;
376
377      table_index++;
378      addr -= 4;
379    }
380}
381
382/* Determine if the instruction sequence matches that for
383   the prologue switch dispatch table with fewer than
384   256 entries but more than 127.
385
386   Before relaxation.
387          push    %lo8insn(label) ; Push address of table
388          push    %hi8insn(label)
389          add     w,wreg          ; index*2 => offset
390          snc                     ; CARRY SET?
391          inc     1(sp)           ; Propagate MSB into table address
392          add     2(sp),w         ; Add low bits of offset to table address
393          snc                     ; and handle any carry-out
394          inc     1(sp)
395   addr=>
396          page    __indjmp        ; Do an indirect jump to that location
397          jmp     __indjmp
398   label:                         ; case dispatch table starts here
399 	   page    $nnn1
400 	   jmp	   $nnn1
401 	   page	   $nnn2
402 	   jmp     $nnn2
403 	   ...
404 	   page    $nnnN
405 	   jmp	   $nnnN
406
407  After relaxation.
408          push    %lo8insn(label) ; Push address of table
409          push    %hi8insn(label)
410          add     2(sp),w         ; Add low bits of offset to table address
411          snc                     ; and handle any carry-out
412          inc     1(sp)
413  addr=>
414          page    __indjmp        ; Do an indirect jump to that location
415          jmp     __indjmp
416   label:                         ; case dispatch table starts here
417          jmp     $nnn1
418          jmp     $nnn2
419          ...
420          jmp     $nnnN  */
421
422static int
423ip2k_is_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
424			  asection *sec,
425			  bfd_vma addr,
426			  bfd_byte *contents)
427{
428  bfd_byte code[16];
429  int table_index = 0;
430
431  /* Check current page-jmp.  */
432  if (addr + 4 > sec->size)
433    return -1;
434
435  ip2k_get_mem (abfd, contents + addr, 4, code);
436  if ((! IS_PAGE_OPCODE (code + 0))
437      || (! IS_JMP_OPCODE (code + 2)))
438    return -1;
439
440  /* Search back.  */
441  while (1)
442    {
443      if (addr < 16)
444	return -1;
445
446      /* Check previous 8 instructions.  */
447      ip2k_get_mem (abfd, contents + addr - 16, 16, code);
448      if ((IS_ADD_W_WREG_OPCODE (code + 0))
449	  && (IS_SNC_OPCODE (code + 2))
450	  && (IS_INC_1SP_OPCODE (code + 4))
451	  && (IS_ADD_2SP_W_OPCODE (code + 6))
452	  && (IS_SNC_OPCODE (code + 8))
453	  && (IS_INC_1SP_OPCODE (code + 10))
454	  && (IS_PAGE_OPCODE (code + 12))
455	  && (IS_JMP_OPCODE (code + 14)))
456	return table_index;
457
458      if ((IS_ADD_W_WREG_OPCODE (code + 2))
459	  && (IS_SNC_OPCODE (code + 4))
460	  && (IS_INC_1SP_OPCODE (code + 6))
461	  && (IS_ADD_2SP_W_OPCODE (code + 8))
462	  && (IS_SNC_OPCODE (code + 10))
463	  && (IS_INC_1SP_OPCODE (code + 12))
464	  && (IS_JMP_OPCODE (code + 14)))
465	return table_index;
466
467      if ((! IS_PAGE_OPCODE (code + 0))
468	  || (! IS_JMP_OPCODE (code + 2)))
469	return -1;
470
471      table_index++;
472      addr -= 4;
473    }
474}
475
476/* Returns the expected page state for the given instruction not including
477   the effect of page instructions.  */
478
479static bfd_vma
480ip2k_nominal_page_bits (bfd *abfd ATTRIBUTE_UNUSED,
481			asection *sec,
482			bfd_vma addr,
483			bfd_byte *contents)
484{
485  bfd_vma page = PAGENO (BASEADDR (sec) + addr);
486
487  /* Check if section flows into this page. If not then the page
488     bits are assumed to match the PC. This will be true unless
489     the user has a page instruction without a call/jump, in which
490     case they are on their own.  */
491  if (PAGENO (BASEADDR (sec)) == page)
492    return page;
493
494  /* Section flows across page boundary. The page bits should match
495     the PC unless there is a possible flow from the previous page,
496     in which case it is not possible to determine the value of the
497     page bits.  */
498  while (PAGENO (BASEADDR (sec) + addr - 2) == page)
499    {
500      bfd_byte code[2];
501
502      addr -= 2;
503      ip2k_get_mem (abfd, contents + addr, 2, code);
504      if (!IS_PAGE_OPCODE (code))
505	continue;
506
507      /* Found a page instruction, check if jump table.  */
508      if (ip2k_is_switch_table_128 (abfd, sec, addr, contents) != -1)
509	/* Jump table => page is conditional.  */
510	continue;
511
512      if (ip2k_is_switch_table_256 (abfd, sec, addr, contents) != -1)
513	/* Jump table => page is conditional.  */
514	continue;
515
516      /* Found a page instruction, check if conditional.  */
517      if (addr >= 2)
518        {
519	  ip2k_get_mem (abfd, contents + addr - 2, 2, code);
520          if (IS_SKIP_OPCODE (code))
521	    /* Page is conditional.  */
522	    continue;
523        }
524
525      /* Unconditional page instruction => page bits should be correct.  */
526      return page;
527    }
528
529  /* Flow from previous page => page bits are impossible to determine.  */
530  return 0;
531}
532
533static bfd_boolean
534ip2k_test_page_insn (bfd *abfd ATTRIBUTE_UNUSED,
535		     asection *sec,
536		     Elf_Internal_Rela *irel,
537		     struct misc *misc)
538{
539  bfd_vma symval;
540
541  /* Get the value of the symbol referred to by the reloc.  */
542  symval = symbol_value (abfd, misc->symtab_hdr, misc->isymbuf, irel);
543  if (symval == UNDEFINED_SYMBOL)
544    /* This appears to be a reference to an undefined
545       symbol.  Just ignore it--it will be caught by the
546       regular reloc processing.  */
547    return FALSE;
548
549  /* Test if we can delete this page instruction.  */
550  if (PAGENO (symval + irel->r_addend) !=
551      ip2k_nominal_page_bits (abfd, sec, irel->r_offset, misc->contents))
552    return FALSE;
553
554  return TRUE;
555}
556
557/* Parts of a Stabs entry.  */
558
559#define STRDXOFF   0
560#define TYPEOFF    4
561#define OTHEROFF   5
562#define DESCOFF    6
563#define VALOFF     8
564#define STABSIZE   12
565
566/* Adjust all the relocations entries after adding or inserting instructions.  */
567
568static void
569adjust_all_relocations (bfd *abfd,
570			asection *sec,
571			bfd_vma addr,
572			bfd_vma endaddr,
573			int count,
574			int noadj)
575{
576  Elf_Internal_Shdr *symtab_hdr;
577  Elf_Internal_Sym *isymbuf, *isym, *isymend;
578  unsigned int shndx;
579  Elf_Internal_Rela *irel, *irelend, *irelbase;
580  struct elf_link_hash_entry **sym_hashes;
581  struct elf_link_hash_entry **end_hashes;
582  unsigned int symcount;
583  asection *stab;
584
585  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
586  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
587
588  shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
589
590  irelbase = elf_section_data (sec)->relocs;
591  irelend = irelbase + sec->reloc_count;
592
593  for (irel = irelbase; irel < irelend; irel++)
594    {
595      if (ELF32_R_TYPE (irel->r_info) != R_IP2K_NONE)
596        {
597          /* Get the value of the symbol referred to by the reloc.  */
598          if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
599            {
600              asection *sym_sec;
601
602              /* A local symbol.  */
603	      isym = isymbuf + ELF32_R_SYM (irel->r_info);
604              sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
605
606              if (isym->st_shndx == shndx)
607                {
608                  bfd_vma baseaddr = BASEADDR (sec);
609                  bfd_vma symval = BASEADDR (sym_sec) + isym->st_value
610                                   + irel->r_addend;
611
612                  if ((baseaddr + addr + noadj) <= symval
613                      && symval < (baseaddr + endaddr))
614                    irel->r_addend += count;
615                }
616            }
617        }
618
619      /* Do this only for PC space relocations.  */
620      if (addr <= irel->r_offset && irel->r_offset < endaddr)
621        irel->r_offset += count;
622    }
623
624  /* Now fix the stab relocations.  */
625  stab = bfd_get_section_by_name (abfd, ".stab");
626  if (stab)
627    {
628      bfd_byte *stabcontents, *stabend, *stabp;
629      bfd_size_type stab_size = stab->rawsize ? stab->rawsize : stab->size;
630
631      irelbase = elf_section_data (stab)->relocs;
632      irelend = irelbase + stab->reloc_count;
633
634      /* Pull out the contents of the stab section.  */
635      if (elf_section_data (stab)->this_hdr.contents != NULL)
636	stabcontents = elf_section_data (stab)->this_hdr.contents;
637      else
638	{
639	  if (!bfd_malloc_and_get_section (abfd, stab, &stabcontents))
640	    {
641	      if (stabcontents != NULL)
642		free (stabcontents);
643	      return;
644	    }
645
646	  /* We need to remember this.  */
647	  elf_section_data (stab)->this_hdr.contents = stabcontents;
648	}
649
650      stabend = stabcontents + stab_size;
651
652      for (irel = irelbase; irel < irelend; irel++)
653	{
654	  if (ELF32_R_TYPE (irel->r_info) != R_IP2K_NONE)
655	    {
656	      /* Get the value of the symbol referred to by the reloc.  */
657	      if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
658		{
659		  asection *sym_sec;
660
661		  /* A local symbol.  */
662		  isym = isymbuf + ELF32_R_SYM (irel->r_info);
663		  sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
664
665		  if (sym_sec == sec)
666		    {
667		      const char *name;
668		      unsigned char type;
669		      bfd_vma value;
670		      bfd_vma baseaddr = BASEADDR (sec);
671		      bfd_vma symval = BASEADDR (sym_sec) + isym->st_value
672			+ irel->r_addend;
673
674		      if ((baseaddr + addr) <= symval
675			  && symval <= (baseaddr + endaddr))
676			irel->r_addend += count;
677
678		      /* Go hunt up a function and fix its line info if needed.  */
679		      stabp = stabcontents + irel->r_offset - 8;
680
681		      /* Go pullout the stab entry.  */
682		      type  = bfd_h_get_8 (abfd, stabp + TYPEOFF);
683		      value = bfd_h_get_32 (abfd, stabp + VALOFF);
684
685		      name = bfd_get_stab_name (type);
686
687		      if (strcmp (name, "FUN") == 0)
688			{
689			  int function_adjusted = 0;
690
691			  if (symval > (baseaddr + addr))
692			    /* Not in this function.  */
693			    continue;
694
695			  /* Hey we got a function hit.  */
696			  stabp += STABSIZE;
697			  for (;stabp < stabend; stabp += STABSIZE)
698			    {
699			      /* Go pullout the stab entry.  */
700			      type  = bfd_h_get_8 (abfd, stabp + TYPEOFF);
701			      value = bfd_h_get_32 (abfd, stabp + VALOFF);
702
703			      name = bfd_get_stab_name (type);
704
705			      if (strcmp (name, "FUN") == 0)
706				{
707				  /* Hit another function entry.  */
708				  if (function_adjusted)
709				    {
710				      /* Adjust the value.  */
711				      value += count;
712
713				      /* We need to put it back.  */
714				      bfd_h_put_32 (abfd, value,stabp + VALOFF);
715				    }
716
717				  /* And then bale out.  */
718				  break;
719				}
720
721			      if (strcmp (name, "SLINE") == 0)
722				{
723				  /* Got a line entry.  */
724				  if ((baseaddr + addr) <= (symval + value))
725				    {
726				      /* Adjust the line entry.  */
727				      value += count;
728
729				      /* We need to put it back.  */
730				      bfd_h_put_32 (abfd, value,stabp + VALOFF);
731				      function_adjusted = 1;
732				    }
733				}
734			    }
735			}
736		    }
737		}
738	    }
739	}
740    }
741
742  /* When adding an instruction back it is sometimes necessary to move any
743     global or local symbol that was referencing the first instruction of
744     the moved block to refer to the first instruction of the inserted block.
745
746     For example adding a PAGE instruction before a CALL or JMP requires
747     that any label on the CALL or JMP is moved to the PAGE insn.  */
748  addr += noadj;
749
750  /* Adjust the local symbols defined in this section.  */
751  isymend = isymbuf + symtab_hdr->sh_info;
752  for (isym = isymbuf; isym < isymend; isym++)
753    {
754      if (isym->st_shndx == shndx
755	  && addr <= isym->st_value
756	  && isym->st_value < endaddr)
757	isym->st_value += count;
758    }
759
760  /* Now adjust the global symbols defined in this section.  */
761  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
762	      - symtab_hdr->sh_info);
763  sym_hashes = elf_sym_hashes (abfd);
764  end_hashes = sym_hashes + symcount;
765  for (; sym_hashes < end_hashes; sym_hashes++)
766    {
767      struct elf_link_hash_entry *sym_hash = *sym_hashes;
768
769      if ((sym_hash->root.type == bfd_link_hash_defined
770	   || sym_hash->root.type == bfd_link_hash_defweak)
771	  && sym_hash->root.u.def.section == sec)
772	{
773          if (addr <= sym_hash->root.u.def.value
774              && sym_hash->root.u.def.value < endaddr)
775	    sym_hash->root.u.def.value += count;
776	}
777    }
778
779  return;
780}
781
782/* Delete some bytes from a section while relaxing.  */
783
784static bfd_boolean
785ip2k_elf_relax_delete_bytes (bfd *abfd,
786			     asection *sec,
787			     bfd_vma addr,
788			     int count)
789{
790  bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
791  bfd_vma endaddr = sec->size;
792
793  /* Actually delete the bytes.  */
794  memmove (contents + addr, contents + addr + count,
795	   endaddr - addr - count);
796
797  sec->size -= count;
798
799  adjust_all_relocations (abfd, sec, addr + count, endaddr, -count, 0);
800  return TRUE;
801}
802
803static bfd_boolean
804ip2k_delete_page_insn (bfd *abfd ATTRIBUTE_UNUSED,
805		       asection *sec,
806		       Elf_Internal_Rela *irel,
807		       bfd_boolean *again,
808		       struct misc *misc)
809{
810  /* Note that we've changed the relocs, section contents, etc.  */
811  elf_section_data (sec)->relocs = misc->irelbase;
812  elf_section_data (sec)->this_hdr.contents = misc->contents;
813  misc->symtab_hdr->contents = (bfd_byte *) misc->isymbuf;
814
815  /* Fix the relocation's type.  */
816  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_IP2K_NONE);
817
818  /* Delete the PAGE insn.  */
819  if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset, 2))
820    return FALSE;
821
822  /* Modified => will need to iterate relaxation again.  */
823  *again = TRUE;
824
825  return TRUE;
826}
827
828static bfd_boolean
829ip2k_relax_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
830			     asection *sec,
831			     Elf_Internal_Rela *irel,
832			     bfd_boolean *again,
833			     struct misc *misc)
834{
835  Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
836  Elf_Internal_Rela *ireltest = irel;
837  bfd_byte code[4];
838  bfd_vma addr;
839
840  /* Test all page instructions.  */
841  addr = irel->r_offset;
842  while (1)
843    {
844      if (addr + 4 > sec->size)
845	break;
846
847      ip2k_get_mem (abfd, misc->contents + addr, 4, code);
848      if ((! IS_PAGE_OPCODE (code + 0))
849	  || (! IS_JMP_OPCODE (code + 2)))
850	break;
851
852      /* Validate relocation entry (every entry should have a matching
853          relocation entry).  */
854      if (ireltest >= irelend)
855        {
856	  _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
857          return FALSE;
858        }
859
860      if (ireltest->r_offset != addr)
861        {
862	  _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
863          return FALSE;
864        }
865
866      if (! ip2k_test_page_insn (abfd, sec, ireltest, misc))
867	/* Un-removable page insn => nothing can be done.  */
868	return TRUE;
869
870      addr += 4;
871      ireltest += 2;
872    }
873
874  /* Relaxable. Adjust table header.  */
875  ip2k_get_mem (abfd, misc->contents + irel->r_offset - 4, 4, code);
876  if ((! IS_ADD_W_WREG_OPCODE (code + 0))
877      || (! IS_ADD_PCL_W_OPCODE (code + 2)))
878    {
879      _bfd_error_handler (_("ip2k relaxer: switch table header corrupt."));
880      return FALSE;
881    }
882
883  if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset - 4, 2))
884    return FALSE;
885
886  *again = TRUE;
887
888  /* Delete all page instructions in table.  */
889  while (irel < ireltest)
890    {
891      if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc))
892	return FALSE;
893      irel += 2;
894    }
895
896  return TRUE;
897}
898
899static bfd_boolean
900ip2k_relax_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
901			     asection *sec,
902			     Elf_Internal_Rela *irel,
903			     bfd_boolean *again,
904			     struct misc *misc)
905{
906  Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
907  Elf_Internal_Rela *ireltest = irel;
908  bfd_byte code[12];
909  bfd_vma addr;
910
911  /* Test all page instructions.  */
912  addr = irel->r_offset;
913
914  while (1)
915    {
916      if (addr + 4 > sec->size)
917	break;
918
919      ip2k_get_mem (abfd, misc->contents + addr, 4, code);
920
921      if ((! IS_PAGE_OPCODE (code + 0))
922	  || (! IS_JMP_OPCODE (code + 2)))
923	break;
924
925      /* Validate relocation entry (every entry should have a matching
926          relocation entry).  */
927      if (ireltest >= irelend)
928        {
929          _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
930          return FALSE;
931        }
932
933      if (ireltest->r_offset != addr)
934        {
935          _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
936          return FALSE;
937        }
938
939      if (!ip2k_test_page_insn (abfd, sec, ireltest, misc))
940	/* Un-removable page insn => nothing can be done.  */
941	return TRUE;
942
943      addr += 4;
944      ireltest += 2;
945    }
946
947  /* Relaxable. Adjust table header.  */
948  ip2k_get_mem (abfd, misc->contents + irel->r_offset - 4, 2, code);
949  if (IS_PAGE_OPCODE (code))
950    addr = irel->r_offset - 16;
951  else
952    addr = irel->r_offset - 14;
953
954  ip2k_get_mem (abfd, misc->contents + addr, 12, code);
955  if ((!IS_ADD_W_WREG_OPCODE (code + 0))
956      || (!IS_SNC_OPCODE (code + 2))
957      || (!IS_INC_1SP_OPCODE (code + 4))
958      || (!IS_ADD_2SP_W_OPCODE (code + 6))
959      || (!IS_SNC_OPCODE (code + 8))
960      || (!IS_INC_1SP_OPCODE (code + 10)))
961    {
962      _bfd_error_handler (_("ip2k relaxer: switch table header corrupt."));
963      return FALSE;
964    }
965
966  /* Delete first 3 opcodes.  */
967  if (!ip2k_elf_relax_delete_bytes (abfd, sec, addr + 0, 6))
968    return FALSE;
969
970  *again = TRUE;
971
972  /* Delete all page instructions in table.  */
973  while (irel < ireltest)
974    {
975      if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc))
976	return FALSE;
977      irel += 2;
978    }
979
980  return TRUE;
981}
982
983/* This function handles relaxation of a section in a specific page.  */
984
985static bfd_boolean
986ip2k_elf_relax_section_page (bfd *abfd,
987			     asection *sec,
988			     bfd_boolean *again,
989			     struct misc *misc,
990			     unsigned long page_start,
991			     unsigned long page_end)
992{
993  Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
994  Elf_Internal_Rela *irel;
995  int switch_table_128;
996  int switch_table_256;
997
998  /* Walk thru the section looking for relaxation opportunities.  */
999  for (irel = misc->irelbase; irel < irelend; irel++)
1000    {
1001      if (ELF32_R_TYPE (irel->r_info) != (int) R_IP2K_PAGE3)
1002	/* Ignore non page instructions.  */
1003	continue;
1004
1005      if (BASEADDR (sec) + irel->r_offset < page_start)
1006	/* Ignore page instructions on earlier page - they have
1007	   already been processed. Remember that there is code flow
1008	   that crosses a page boundary.  */
1009	continue;
1010
1011      if (BASEADDR (sec) + irel->r_offset > page_end)
1012	/* Flow beyond end of page => nothing more to do for this page.  */
1013	return TRUE;
1014
1015      /* Detect switch tables.  */
1016      switch_table_128 = ip2k_is_switch_table_128 (abfd, sec, irel->r_offset, misc->contents);
1017      switch_table_256 = ip2k_is_switch_table_256 (abfd, sec, irel->r_offset, misc->contents);
1018
1019      if ((switch_table_128 > 0) || (switch_table_256 > 0))
1020	/* If the index is greater than 0 then it has already been processed.  */
1021	continue;
1022
1023      if (switch_table_128 == 0)
1024	{
1025	  if (!ip2k_relax_switch_table_128 (abfd, sec, irel, again, misc))
1026	    return FALSE;
1027
1028	  continue;
1029	}
1030
1031      if (switch_table_256 == 0)
1032	{
1033	  if (!ip2k_relax_switch_table_256 (abfd, sec, irel, again, misc))
1034	    return FALSE;
1035
1036	  continue;
1037	}
1038
1039      /* Simple relax.  */
1040      if (ip2k_test_page_insn (abfd, sec, irel, misc))
1041	{
1042	  if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc))
1043	    return FALSE;
1044
1045	  continue;
1046	}
1047    }
1048
1049  return TRUE;
1050}
1051
1052/* This function handles relaxing for the ip2k.
1053
1054   Principle: Start with the first page and remove page instructions that
1055   are not require on this first page. By removing page instructions more
1056   code will fit into this page - repeat until nothing more can be achieved
1057   for this page. Move on to the next page.
1058
1059   Processing the pages one at a time from the lowest page allows a removal
1060   only policy to be used - pages can be removed but are never reinserted.  */
1061
1062static bfd_boolean
1063ip2k_elf_relax_section (bfd *abfd,
1064			asection *sec,
1065			struct bfd_link_info *link_info,
1066			bfd_boolean *again)
1067{
1068  Elf_Internal_Shdr *symtab_hdr;
1069  Elf_Internal_Rela *internal_relocs;
1070  bfd_byte *contents = NULL;
1071  Elf_Internal_Sym *isymbuf = NULL;
1072  static asection * first_section = NULL;
1073  static unsigned long search_addr;
1074  static unsigned long page_start = 0;
1075  static unsigned long page_end = 0;
1076  static unsigned int pass = 0;
1077  static bfd_boolean new_pass = FALSE;
1078  static bfd_boolean changed = FALSE;
1079  struct misc misc;
1080
1081  /* Assume nothing changes.  */
1082  *again = FALSE;
1083
1084  if (first_section == NULL)
1085    {
1086      ip2k_relaxed = TRUE;
1087      first_section = sec;
1088    }
1089
1090  if (first_section == sec)
1091    {
1092      pass++;
1093      new_pass = TRUE;
1094    }
1095
1096  /* We don't have to do anything for a relocatable link,
1097     if this section does not have relocs, or if this is
1098     not a code section.  */
1099  if (bfd_link_relocatable (link_info)
1100      || (sec->flags & SEC_RELOC) == 0
1101      || sec->reloc_count == 0
1102      || (sec->flags & SEC_CODE) == 0)
1103    return TRUE;
1104
1105  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1106
1107  internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
1108					       link_info->keep_memory);
1109  if (internal_relocs == NULL)
1110    goto error_return;
1111
1112  /* Get section contents cached copy if it exists.  */
1113  if (contents == NULL)
1114    {
1115      /* Get cached copy if it exists.  */
1116      if (elf_section_data (sec)->this_hdr.contents != NULL)
1117	contents = elf_section_data (sec)->this_hdr.contents;
1118      else
1119	{
1120	  /* Go get them off disk.  */
1121	  if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1122	    goto error_return;
1123	}
1124    }
1125
1126  /* Read this BFD's symbols cached copy if it exists.  */
1127  if (isymbuf == NULL && symtab_hdr->sh_info != 0)
1128    {
1129      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1130      if (isymbuf == NULL)
1131	isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1132					symtab_hdr->sh_info, 0,
1133					NULL, NULL, NULL);
1134      if (isymbuf == NULL)
1135	goto error_return;
1136    }
1137
1138  misc.symtab_hdr = symtab_hdr;
1139  misc.isymbuf = isymbuf;
1140  misc.irelbase = internal_relocs;
1141  misc.contents = contents;
1142
1143  /* This is where all the relaxation actually get done.  */
1144  if ((pass == 1) || (new_pass && !changed))
1145    {
1146      /* On the first pass we simply search for the lowest page that
1147         we havn't relaxed yet. Note that the pass count is reset
1148         each time a page is complete in order to move on to the next page.
1149         If we can't find any more pages then we are finished.  */
1150      if (new_pass)
1151	{
1152	  pass = 1;
1153	  new_pass = FALSE;
1154	  changed = TRUE; /* Pre-initialize to break out of pass 1.  */
1155	  search_addr = 0xFFFFFFFF;
1156	}
1157
1158      if ((BASEADDR (sec) + sec->size < search_addr)
1159	  && (BASEADDR (sec) + sec->size > page_end))
1160	{
1161	  if (BASEADDR (sec) <= page_end)
1162	    search_addr = page_end + 1;
1163	  else
1164	    search_addr = BASEADDR (sec);
1165
1166	  /* Found a page => more work to do.  */
1167	  *again = TRUE;
1168	}
1169    }
1170  else
1171    {
1172      if (new_pass)
1173	{
1174	  new_pass = FALSE;
1175	  changed = FALSE;
1176	  page_start = PAGENO (search_addr);
1177	  page_end = page_start | 0x00003FFF;
1178	}
1179
1180      /* Only process sections in range.  */
1181      if ((BASEADDR (sec) + sec->size >= page_start)
1182	  && (BASEADDR (sec) <= page_end))
1183	{
1184          if (!ip2k_elf_relax_section_page (abfd, sec, &changed, &misc, page_start, page_end))
1185	    return FALSE;
1186	}
1187      *again = TRUE;
1188    }
1189
1190  /* Perform some house keeping after relaxing the section.  */
1191
1192  if (isymbuf != NULL
1193      && symtab_hdr->contents != (unsigned char *) isymbuf)
1194    {
1195      if (! link_info->keep_memory)
1196	free (isymbuf);
1197      else
1198	symtab_hdr->contents = (unsigned char *) isymbuf;
1199    }
1200
1201  if (contents != NULL
1202      && elf_section_data (sec)->this_hdr.contents != contents)
1203    {
1204      if (! link_info->keep_memory)
1205	free (contents);
1206      else
1207	{
1208	  /* Cache the section contents for elf_link_input_bfd.  */
1209	  elf_section_data (sec)->this_hdr.contents = contents;
1210	}
1211    }
1212
1213  if (internal_relocs != NULL
1214      && elf_section_data (sec)->relocs != internal_relocs)
1215    free (internal_relocs);
1216
1217  return TRUE;
1218
1219 error_return:
1220  if (isymbuf != NULL
1221      && symtab_hdr->contents != (unsigned char *) isymbuf)
1222    free (isymbuf);
1223  if (contents != NULL
1224      && elf_section_data (sec)->this_hdr.contents != contents)
1225    free (contents);
1226  if (internal_relocs != NULL
1227      && elf_section_data (sec)->relocs != internal_relocs)
1228    free (internal_relocs);
1229  return FALSE;
1230}
1231
1232/* Set the howto pointer for a IP2K ELF reloc.  */
1233
1234static void
1235ip2k_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
1236			 arelent * cache_ptr,
1237			 Elf_Internal_Rela * dst)
1238{
1239  unsigned int r_type;
1240
1241  r_type = ELF32_R_TYPE (dst->r_info);
1242  if (r_type >= (unsigned int) R_IP2K_max)
1243    {
1244      /* xgettext:c-format */
1245      _bfd_error_handler (_("%B: invalid IP2K reloc number: %d"), abfd, r_type);
1246      r_type = 0;
1247    }
1248  cache_ptr->howto = & ip2k_elf_howto_table [r_type];
1249}
1250
1251/* Perform a single relocation.
1252   By default we use the standard BFD routines.  */
1253
1254static bfd_reloc_status_type
1255ip2k_final_link_relocate (reloc_howto_type *  howto,
1256			  bfd *               input_bfd,
1257			  asection *          input_section,
1258			  bfd_byte *          contents,
1259			  Elf_Internal_Rela * rel,
1260			  bfd_vma             relocation)
1261{
1262  static bfd_vma page_addr = 0;
1263
1264  bfd_reloc_status_type r = bfd_reloc_ok;
1265  switch (howto->type)
1266    {
1267      /* Handle data space relocations.  */
1268    case R_IP2K_FR9:
1269    case R_IP2K_BANK:
1270      if ((relocation & IP2K_DATA_MASK) == IP2K_DATA_VALUE)
1271	relocation &= ~IP2K_DATA_MASK;
1272      else
1273	r = bfd_reloc_notsupported;
1274      break;
1275
1276    case R_IP2K_LO8DATA:
1277    case R_IP2K_HI8DATA:
1278    case R_IP2K_EX8DATA:
1279      break;
1280
1281      /* Handle insn space relocations.  */
1282    case R_IP2K_PAGE3:
1283      page_addr = BASEADDR (input_section) + rel->r_offset;
1284      if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1285	relocation &= ~IP2K_INSN_MASK;
1286      else
1287	r = bfd_reloc_notsupported;
1288      break;
1289
1290    case R_IP2K_ADDR16CJP:
1291      if (BASEADDR (input_section) + rel->r_offset != page_addr + 2)
1292	{
1293	  /* No preceding page instruction, verify that it isn't needed.  */
1294	  if (PAGENO (relocation + rel->r_addend) !=
1295	      ip2k_nominal_page_bits (input_bfd, input_section,
1296	      			      rel->r_offset, contents))
1297	    /* xgettext:c-format */
1298	    _bfd_error_handler (_("ip2k linker: missing page instruction at 0x%08lx (dest = 0x%08lx)."),
1299				BASEADDR (input_section) + rel->r_offset,
1300				relocation + rel->r_addend);
1301        }
1302      else if (ip2k_relaxed)
1303        {
1304          /* Preceding page instruction. Verify that the page instruction is
1305             really needed. One reason for the relaxation to miss a page is if
1306             the section is not marked as executable.  */
1307	  if (!ip2k_is_switch_table_128 (input_bfd, input_section,
1308					 rel->r_offset - 2, contents)
1309	      && !ip2k_is_switch_table_256 (input_bfd, input_section,
1310					    rel->r_offset - 2, contents)
1311	      && (PAGENO (relocation + rel->r_addend) ==
1312		  ip2k_nominal_page_bits (input_bfd, input_section,
1313					  rel->r_offset - 2, contents)))
1314	    /* xgettext:c-format */
1315	    _bfd_error_handler (_("ip2k linker: redundant page instruction at 0x%08lx (dest = 0x%08lx)."),
1316				page_addr,
1317				relocation + rel->r_addend);
1318        }
1319      if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1320	relocation &= ~IP2K_INSN_MASK;
1321      else
1322	r = bfd_reloc_notsupported;
1323      break;
1324
1325    case R_IP2K_LO8INSN:
1326    case R_IP2K_HI8INSN:
1327    case R_IP2K_PC_SKIP:
1328      if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1329	relocation &= ~IP2K_INSN_MASK;
1330      else
1331	r = bfd_reloc_notsupported;
1332      break;
1333
1334    case R_IP2K_16:
1335      /* If this is a relocation involving a TEXT
1336	 symbol, reduce it to a word address.  */
1337      if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1338	howto = &ip2k_elf_howto_table[ (int) R_IP2K_TEXT];
1339      break;
1340
1341      /* Pass others through.  */
1342    default:
1343      break;
1344    }
1345
1346  /* Only install relocation if above tests did not disqualify it.  */
1347  if (r == bfd_reloc_ok)
1348    r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1349				  contents, rel->r_offset,
1350				  relocation, rel->r_addend);
1351
1352  return r;
1353}
1354
1355/* Relocate a IP2K ELF section.
1356
1357   The RELOCATE_SECTION function is called by the new ELF backend linker
1358   to handle the relocations for a section.
1359
1360   The relocs are always passed as Rela structures; if the section
1361   actually uses Rel structures, the r_addend field will always be
1362   zero.
1363
1364   This function is responsible for adjusting the section contents as
1365   necessary, and (if using Rela relocs and generating a relocatable
1366   output file) adjusting the reloc addend as necessary.
1367
1368   This function does not have to worry about setting the reloc
1369   address or the reloc symbol index.
1370
1371   LOCAL_SYMS is a pointer to the swapped in local symbols.
1372
1373   LOCAL_SECTIONS is an array giving the section in the input file
1374   corresponding to the st_shndx field of each local symbol.
1375
1376   The global hash table entry for the global symbols can be found
1377   via elf_sym_hashes (input_bfd).
1378
1379   When generating relocatable output, this function must handle
1380   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
1381   going to be the section symbol corresponding to the output
1382   section, which means that the addend must be adjusted
1383   accordingly.  */
1384
1385static bfd_boolean
1386ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1387			   struct bfd_link_info *info,
1388			   bfd *input_bfd,
1389			   asection *input_section,
1390			   bfd_byte *contents,
1391			   Elf_Internal_Rela *relocs,
1392			   Elf_Internal_Sym *local_syms,
1393			   asection **local_sections)
1394{
1395  Elf_Internal_Shdr *symtab_hdr;
1396  struct elf_link_hash_entry **sym_hashes;
1397  Elf_Internal_Rela *rel;
1398  Elf_Internal_Rela *relend;
1399
1400  symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1401  sym_hashes = elf_sym_hashes (input_bfd);
1402  relend     = relocs + input_section->reloc_count;
1403
1404  for (rel = relocs; rel < relend; rel ++)
1405    {
1406      reloc_howto_type *           howto;
1407      unsigned long                r_symndx;
1408      Elf_Internal_Sym *           sym;
1409      asection *                   sec;
1410      struct elf_link_hash_entry * h;
1411      bfd_vma                      relocation;
1412      bfd_reloc_status_type        r;
1413      const char *                 name = NULL;
1414      int                          r_type;
1415
1416      r_type = ELF32_R_TYPE (rel->r_info);
1417      r_symndx = ELF32_R_SYM (rel->r_info);
1418      howto  = ip2k_elf_howto_table + r_type;
1419      h      = NULL;
1420      sym    = NULL;
1421      sec    = NULL;
1422
1423      if (r_symndx < symtab_hdr->sh_info)
1424	{
1425	  sym = local_syms + r_symndx;
1426	  sec = local_sections [r_symndx];
1427	  relocation = BASEADDR (sec) + sym->st_value;
1428
1429	  name = bfd_elf_string_from_elf_section
1430	    (input_bfd, symtab_hdr->sh_link, sym->st_name);
1431	  name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
1432	}
1433      else
1434	{
1435	  bfd_boolean warned, ignored;
1436	  bfd_boolean unresolved_reloc;
1437
1438	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1439				   r_symndx, symtab_hdr, sym_hashes,
1440				   h, sec, relocation,
1441				   unresolved_reloc, warned, ignored);
1442
1443	  name = h->root.root.string;
1444	}
1445
1446      if (sec != NULL && discarded_section (sec))
1447	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1448					 rel, 1, relend, howto, 0, contents);
1449
1450      if (bfd_link_relocatable (info))
1451	continue;
1452
1453      /* Finally, the sole IP2K-specific part.  */
1454      r = ip2k_final_link_relocate (howto, input_bfd, input_section,
1455				     contents, rel, relocation);
1456
1457      if (r != bfd_reloc_ok)
1458	{
1459	  const char * msg = NULL;
1460
1461	  switch (r)
1462	    {
1463	    case bfd_reloc_overflow:
1464	      (*info->callbacks->reloc_overflow)
1465		(info, (h ? &h->root : NULL), name, howto->name,
1466		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1467	      break;
1468
1469	    case bfd_reloc_undefined:
1470	      (*info->callbacks->undefined_symbol)
1471		(info, name, input_bfd, input_section, rel->r_offset, TRUE);
1472	      break;
1473
1474	    case bfd_reloc_outofrange:
1475	      msg = _("internal error: out of range error");
1476	      break;
1477
1478	      /* This is how ip2k_final_link_relocate tells us of a non-kosher
1479                 reference between insn & data address spaces.  */
1480	    case bfd_reloc_notsupported:
1481              if (sym != NULL) /* Only if it's not an unresolved symbol.  */
1482	         msg = _("unsupported relocation between data/insn address spaces");
1483	      break;
1484
1485	    case bfd_reloc_dangerous:
1486	      msg = _("internal error: dangerous relocation");
1487	      break;
1488
1489	    default:
1490	      msg = _("internal error: unknown error");
1491	      break;
1492	    }
1493
1494	  if (msg)
1495	    (*info->callbacks->warning) (info, msg, name, input_bfd,
1496					 input_section, rel->r_offset);
1497	}
1498    }
1499
1500  return TRUE;
1501}
1502
1503#define TARGET_BIG_SYM	 ip2k_elf32_vec
1504#define TARGET_BIG_NAME  "elf32-ip2k"
1505
1506#define ELF_ARCH	 bfd_arch_ip2k
1507#define ELF_MACHINE_CODE EM_IP2K
1508#define ELF_MACHINE_ALT1 EM_IP2K_OLD
1509#define ELF_MAXPAGESIZE  1 /* No pages on the IP2K.  */
1510
1511#define elf_info_to_howto_rel			NULL
1512#define elf_info_to_howto			ip2k_info_to_howto_rela
1513
1514#define elf_backend_can_gc_sections     	1
1515#define elf_backend_rela_normal			1
1516#define elf_backend_relocate_section		ip2k_elf_relocate_section
1517
1518#define elf_symbol_leading_char			'_'
1519#define bfd_elf32_bfd_reloc_type_lookup		ip2k_reloc_type_lookup
1520#define bfd_elf32_bfd_reloc_name_lookup	ip2k_reloc_name_lookup
1521#define bfd_elf32_bfd_relax_section		ip2k_elf_relax_section
1522
1523#include "elf32-target.h"
1524