bfd target vector rationalisation
[external/binutils.git] / bfd / elf32-ip2k.c
1 /* Ubicom IP2xxx specific support for 32-bit ELF
2    Copyright (C) 2000-2014 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.  */
29 struct misc
30 {
31   Elf_Internal_Shdr *  symtab_hdr;
32   Elf_Internal_Rela *  irelbase;
33   bfd_byte *           contents;
34   Elf_Internal_Sym *   isymbuf;
35 };
36
37 struct ip2k_opcode
38 {
39   unsigned short opcode;
40   unsigned short mask;
41 };
42
43 static bfd_boolean ip2k_relaxed = FALSE;
44
45 static 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
54 static 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
63 static 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
72 static 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
81 static 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
90 static 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
100 static 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
109 static 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.  */
126 static 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,2,32, 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
177 static reloc_howto_type *
178 ip2k_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
225 static reloc_howto_type *
226 ip2k_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
240 static void
241 ip2k_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
250 static bfd_boolean
251 ip2k_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
273 static bfd_vma
274 symbol_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
342 static int
343 ip2k_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
422 static int
423 ip2k_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
479 static bfd_vma
480 ip2k_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
533 static bfd_boolean
534 ip2k_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
568 static void
569 adjust_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
784 static bfd_boolean
785 ip2k_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
803 static bfd_boolean
804 ip2k_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
828 static bfd_boolean
829 ip2k_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
899 static bfd_boolean
900 ip2k_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
985 static bfd_boolean
986 ip2k_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
1062 static bfd_boolean
1063 ip2k_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 (link_info->relocatable
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
1234 static void
1235 ip2k_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   cache_ptr->howto = & ip2k_elf_howto_table [r_type];
1243 }
1244
1245 /* Perform a single relocation.
1246    By default we use the standard BFD routines.  */
1247
1248 static bfd_reloc_status_type
1249 ip2k_final_link_relocate (reloc_howto_type *  howto,
1250                           bfd *               input_bfd,
1251                           asection *          input_section,
1252                           bfd_byte *          contents,
1253                           Elf_Internal_Rela * rel,
1254                           bfd_vma             relocation)
1255 {
1256   static bfd_vma page_addr = 0;
1257
1258   bfd_reloc_status_type r = bfd_reloc_ok;
1259   switch (howto->type)
1260     {
1261       /* Handle data space relocations.  */
1262     case R_IP2K_FR9:
1263     case R_IP2K_BANK:
1264       if ((relocation & IP2K_DATA_MASK) == IP2K_DATA_VALUE)
1265         relocation &= ~IP2K_DATA_MASK;
1266       else
1267         r = bfd_reloc_notsupported;
1268       break;
1269
1270     case R_IP2K_LO8DATA:
1271     case R_IP2K_HI8DATA:
1272     case R_IP2K_EX8DATA:
1273       break;
1274
1275       /* Handle insn space relocations.  */
1276     case R_IP2K_PAGE3:
1277       page_addr = BASEADDR (input_section) + rel->r_offset;
1278       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1279         relocation &= ~IP2K_INSN_MASK;
1280       else
1281         r = bfd_reloc_notsupported;
1282       break;
1283
1284     case R_IP2K_ADDR16CJP:
1285       if (BASEADDR (input_section) + rel->r_offset != page_addr + 2)
1286         {
1287           /* No preceding page instruction, verify that it isn't needed.  */
1288           if (PAGENO (relocation + rel->r_addend) !=
1289               ip2k_nominal_page_bits (input_bfd, input_section,
1290                                       rel->r_offset, contents))
1291             _bfd_error_handler (_("ip2k linker: missing page instruction at 0x%08lx (dest = 0x%08lx)."),
1292                                 BASEADDR (input_section) + rel->r_offset,
1293                                 relocation + rel->r_addend);
1294         }
1295       else if (ip2k_relaxed)
1296         {
1297           /* Preceding page instruction. Verify that the page instruction is
1298              really needed. One reason for the relaxation to miss a page is if
1299              the section is not marked as executable.  */
1300           if (!ip2k_is_switch_table_128 (input_bfd, input_section,
1301                                          rel->r_offset - 2, contents)
1302               && !ip2k_is_switch_table_256 (input_bfd, input_section,
1303                                             rel->r_offset - 2, contents)
1304               && (PAGENO (relocation + rel->r_addend) ==
1305                   ip2k_nominal_page_bits (input_bfd, input_section,
1306                                           rel->r_offset - 2, contents)))
1307             _bfd_error_handler (_("ip2k linker: redundant page instruction at 0x%08lx (dest = 0x%08lx)."),
1308                                 page_addr,
1309                                 relocation + rel->r_addend);
1310         }
1311       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1312         relocation &= ~IP2K_INSN_MASK;
1313       else
1314         r = bfd_reloc_notsupported;
1315       break;
1316
1317     case R_IP2K_LO8INSN:
1318     case R_IP2K_HI8INSN:
1319     case R_IP2K_PC_SKIP:
1320       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1321         relocation &= ~IP2K_INSN_MASK;
1322       else
1323         r = bfd_reloc_notsupported;
1324       break;
1325
1326     case R_IP2K_16:
1327       /* If this is a relocation involving a TEXT
1328          symbol, reduce it to a word address.  */
1329       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1330         howto = &ip2k_elf_howto_table[ (int) R_IP2K_TEXT];
1331       break;
1332
1333       /* Pass others through.  */
1334     default:
1335       break;
1336     }
1337
1338   /* Only install relocation if above tests did not disqualify it.  */
1339   if (r == bfd_reloc_ok)
1340     r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1341                                   contents, rel->r_offset,
1342                                   relocation, rel->r_addend);
1343
1344   return r;
1345 }
1346
1347 /* Relocate a IP2K ELF section.
1348
1349    The RELOCATE_SECTION function is called by the new ELF backend linker
1350    to handle the relocations for a section.
1351
1352    The relocs are always passed as Rela structures; if the section
1353    actually uses Rel structures, the r_addend field will always be
1354    zero.
1355
1356    This function is responsible for adjusting the section contents as
1357    necessary, and (if using Rela relocs and generating a relocatable
1358    output file) adjusting the reloc addend as necessary.
1359
1360    This function does not have to worry about setting the reloc
1361    address or the reloc symbol index.
1362
1363    LOCAL_SYMS is a pointer to the swapped in local symbols.
1364
1365    LOCAL_SECTIONS is an array giving the section in the input file
1366    corresponding to the st_shndx field of each local symbol.
1367
1368    The global hash table entry for the global symbols can be found
1369    via elf_sym_hashes (input_bfd).
1370
1371    When generating relocatable output, this function must handle
1372    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
1373    going to be the section symbol corresponding to the output
1374    section, which means that the addend must be adjusted
1375    accordingly.  */
1376
1377 static bfd_boolean
1378 ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1379                            struct bfd_link_info *info,
1380                            bfd *input_bfd,
1381                            asection *input_section,
1382                            bfd_byte *contents,
1383                            Elf_Internal_Rela *relocs,
1384                            Elf_Internal_Sym *local_syms,
1385                            asection **local_sections)
1386 {
1387   Elf_Internal_Shdr *symtab_hdr;
1388   struct elf_link_hash_entry **sym_hashes;
1389   Elf_Internal_Rela *rel;
1390   Elf_Internal_Rela *relend;
1391
1392   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1393   sym_hashes = elf_sym_hashes (input_bfd);
1394   relend     = relocs + input_section->reloc_count;
1395
1396   for (rel = relocs; rel < relend; rel ++)
1397     {
1398       reloc_howto_type *           howto;
1399       unsigned long                r_symndx;
1400       Elf_Internal_Sym *           sym;
1401       asection *                   sec;
1402       struct elf_link_hash_entry * h;
1403       bfd_vma                      relocation;
1404       bfd_reloc_status_type        r;
1405       const char *                 name = NULL;
1406       int                          r_type;
1407
1408       r_type = ELF32_R_TYPE (rel->r_info);
1409       r_symndx = ELF32_R_SYM (rel->r_info);
1410       howto  = ip2k_elf_howto_table + r_type;
1411       h      = NULL;
1412       sym    = NULL;
1413       sec    = NULL;
1414
1415       if (r_symndx < symtab_hdr->sh_info)
1416         {
1417           sym = local_syms + r_symndx;
1418           sec = local_sections [r_symndx];
1419           relocation = BASEADDR (sec) + sym->st_value;
1420
1421           name = bfd_elf_string_from_elf_section
1422             (input_bfd, symtab_hdr->sh_link, sym->st_name);
1423           name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
1424         }
1425       else
1426         {
1427           bfd_boolean warned, ignored;
1428           bfd_boolean unresolved_reloc;
1429
1430           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1431                                    r_symndx, symtab_hdr, sym_hashes,
1432                                    h, sec, relocation,
1433                                    unresolved_reloc, warned, ignored);
1434
1435           name = h->root.root.string;
1436         }
1437
1438       if (sec != NULL && discarded_section (sec))
1439         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1440                                          rel, 1, relend, howto, 0, contents);
1441
1442       if (info->relocatable)
1443         continue;
1444
1445       /* Finally, the sole IP2K-specific part.  */
1446       r = ip2k_final_link_relocate (howto, input_bfd, input_section,
1447                                      contents, rel, relocation);
1448
1449       if (r != bfd_reloc_ok)
1450         {
1451           const char * msg = NULL;
1452
1453           switch (r)
1454             {
1455             case bfd_reloc_overflow:
1456               r = info->callbacks->reloc_overflow
1457                 (info, (h ? &h->root : NULL), name, howto->name,
1458                  (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1459               break;
1460
1461             case bfd_reloc_undefined:
1462               r = info->callbacks->undefined_symbol
1463                 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1464               break;
1465
1466             case bfd_reloc_outofrange:
1467               msg = _("internal error: out of range error");
1468               break;
1469
1470               /* This is how ip2k_final_link_relocate tells us of a non-kosher
1471                  reference between insn & data address spaces.  */
1472             case bfd_reloc_notsupported:
1473               if (sym != NULL) /* Only if it's not an unresolved symbol.  */
1474                  msg = _("unsupported relocation between data/insn address spaces");
1475               break;
1476
1477             case bfd_reloc_dangerous:
1478               msg = _("internal error: dangerous relocation");
1479               break;
1480
1481             default:
1482               msg = _("internal error: unknown error");
1483               break;
1484             }
1485
1486           if (msg)
1487             r = info->callbacks->warning
1488               (info, msg, name, input_bfd, input_section, rel->r_offset);
1489
1490           if (! r)
1491             return FALSE;
1492         }
1493     }
1494
1495   return TRUE;
1496 }
1497
1498 #define TARGET_BIG_SYM   ip2k_elf32_vec
1499 #define TARGET_BIG_NAME  "elf32-ip2k"
1500
1501 #define ELF_ARCH         bfd_arch_ip2k
1502 #define ELF_MACHINE_CODE EM_IP2K
1503 #define ELF_MACHINE_ALT1 EM_IP2K_OLD
1504 #define ELF_MAXPAGESIZE  1 /* No pages on the IP2K.  */
1505
1506 #define elf_info_to_howto_rel                   NULL
1507 #define elf_info_to_howto                       ip2k_info_to_howto_rela
1508
1509 #define elf_backend_can_gc_sections             1
1510 #define elf_backend_rela_normal                 1
1511 #define elf_backend_relocate_section            ip2k_elf_relocate_section
1512
1513 #define elf_symbol_leading_char                 '_'
1514 #define bfd_elf32_bfd_reloc_type_lookup         ip2k_reloc_type_lookup
1515 #define bfd_elf32_bfd_reloc_name_lookup ip2k_reloc_name_lookup
1516 #define bfd_elf32_bfd_relax_section             ip2k_elf_relax_section
1517
1518 #include "elf32-target.h"