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