bfd/
[external/binutils.git] / bfd / elf32-v850.c
1 /* V850-specific support for 32-bit ELF
2    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3    2006, 2007 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
23 /* XXX FIXME: This code is littered with 32bit int, 16bit short, 8bit char
24    dependencies.  As is the gas & simulator code for the v850.  */
25
26 #include "sysdep.h"
27 #include "bfd.h"
28 #include "bfdlink.h"
29 #include "libbfd.h"
30 #include "elf-bfd.h"
31 #include "elf/v850.h"
32 #include "libiberty.h"
33
34 /* Sign-extend a 24-bit number.  */
35 #define SEXT24(x)       ((((x) & 0xffffff) ^ 0x800000) - 0x800000)
36
37 static reloc_howto_type v850_elf_howto_table[];
38
39 /* Look through the relocs for a section during the first phase, and
40    allocate space in the global offset table or procedure linkage
41    table.  */
42
43 static bfd_boolean
44 v850_elf_check_relocs (bfd *abfd,
45                        struct bfd_link_info *info,
46                        asection *sec,
47                        const Elf_Internal_Rela *relocs)
48 {
49   bfd_boolean ret = TRUE;
50   bfd *dynobj;
51   Elf_Internal_Shdr *symtab_hdr;
52   struct elf_link_hash_entry **sym_hashes;
53   const Elf_Internal_Rela *rel;
54   const Elf_Internal_Rela *rel_end;
55   asection *sreloc;
56   enum v850_reloc_type r_type;
57   int other = 0;
58   const char *common = NULL;
59
60   if (info->relocatable)
61     return TRUE;
62
63 #ifdef DEBUG
64   _bfd_error_handler ("v850_elf_check_relocs called for section %A in %B",
65                       sec, abfd);
66 #endif
67
68   dynobj = elf_hash_table (info)->dynobj;
69   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
70   sym_hashes = elf_sym_hashes (abfd);
71   sreloc = NULL;
72
73   rel_end = relocs + sec->reloc_count;
74   for (rel = relocs; rel < rel_end; rel++)
75     {
76       unsigned long r_symndx;
77       struct elf_link_hash_entry *h;
78
79       r_symndx = ELF32_R_SYM (rel->r_info);
80       if (r_symndx < symtab_hdr->sh_info)
81         h = NULL;
82       else
83         {
84           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
85           while (h->root.type == bfd_link_hash_indirect
86                  || h->root.type == bfd_link_hash_warning)
87             h = (struct elf_link_hash_entry *) h->root.u.i.link;
88         }
89
90       r_type = (enum v850_reloc_type) ELF32_R_TYPE (rel->r_info);
91       switch (r_type)
92         {
93         default:
94         case R_V850_NONE:
95         case R_V850_9_PCREL:
96         case R_V850_22_PCREL:
97         case R_V850_HI16_S:
98         case R_V850_HI16:
99         case R_V850_LO16:
100         case R_V850_LO16_SPLIT_OFFSET:
101         case R_V850_ABS32:
102         case R_V850_REL32:
103         case R_V850_16:
104         case R_V850_8:
105         case R_V850_CALLT_6_7_OFFSET:
106         case R_V850_CALLT_16_16_OFFSET:
107           break;
108
109         /* This relocation describes the C++ object vtable hierarchy.
110            Reconstruct it for later use during GC.  */
111         case R_V850_GNU_VTINHERIT:
112           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
113             return FALSE;
114           break;
115
116         /* This relocation describes which C++ vtable entries
117            are actually used.  Record for later use during GC.  */
118         case R_V850_GNU_VTENTRY:
119           BFD_ASSERT (h != NULL);
120           if (h != NULL
121               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
122             return FALSE;
123           break;
124
125         case R_V850_SDA_16_16_SPLIT_OFFSET:
126         case R_V850_SDA_16_16_OFFSET:
127         case R_V850_SDA_15_16_OFFSET:
128           other = V850_OTHER_SDA;
129           common = ".scommon";
130           goto small_data_common;
131
132         case R_V850_ZDA_16_16_SPLIT_OFFSET:
133         case R_V850_ZDA_16_16_OFFSET:
134         case R_V850_ZDA_15_16_OFFSET:
135           other = V850_OTHER_ZDA;
136           common = ".zcommon";
137           goto small_data_common;
138
139         case R_V850_TDA_4_5_OFFSET:
140         case R_V850_TDA_4_4_OFFSET:
141         case R_V850_TDA_6_8_OFFSET:
142         case R_V850_TDA_7_8_OFFSET:
143         case R_V850_TDA_7_7_OFFSET:
144         case R_V850_TDA_16_16_OFFSET:
145           other = V850_OTHER_TDA;
146           common = ".tcommon";
147           /* fall through */
148
149 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
150
151         small_data_common:
152           if (h)
153             {
154               /* Flag which type of relocation was used.  */
155               h->other |= other;
156               if ((h->other & V850_OTHER_MASK) != (other & V850_OTHER_MASK)
157                   && (h->other & V850_OTHER_ERROR) == 0)
158                 {
159                   const char * msg;
160                   static char  buff[200]; /* XXX */
161
162                   switch (h->other & V850_OTHER_MASK)
163                     {
164                     default:
165                       msg = _("Variable `%s' cannot occupy in multiple small data regions");
166                       break;
167                     case V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA:
168                       msg = _("Variable `%s' can only be in one of the small, zero, and tiny data regions");
169                       break;
170                     case V850_OTHER_SDA | V850_OTHER_ZDA:
171                       msg = _("Variable `%s' cannot be in both small and zero data regions simultaneously");
172                       break;
173                     case V850_OTHER_SDA | V850_OTHER_TDA:
174                       msg = _("Variable `%s' cannot be in both small and tiny data regions simultaneously");
175                       break;
176                     case V850_OTHER_ZDA | V850_OTHER_TDA:
177                       msg = _("Variable `%s' cannot be in both zero and tiny data regions simultaneously");
178                       break;
179                     }
180
181                   sprintf (buff, msg, h->root.root.string);
182                   info->callbacks->warning (info, buff, h->root.root.string,
183                                             abfd, h->root.u.def.section,
184                                             (bfd_vma) 0);
185
186                   bfd_set_error (bfd_error_bad_value);
187                   h->other |= V850_OTHER_ERROR;
188                   ret = FALSE;
189                 }
190             }
191
192           if (h && h->root.type == bfd_link_hash_common
193               && h->root.u.c.p
194               && !strcmp (bfd_get_section_name (abfd, h->root.u.c.p->section), "COMMON"))
195             {
196               asection * section;
197
198               section = h->root.u.c.p->section = bfd_make_section_old_way (abfd, common);
199               section->flags |= SEC_IS_COMMON;
200             }
201
202 #ifdef DEBUG
203           fprintf (stderr, "v850_elf_check_relocs, found %s relocation for %s%s\n",
204                    v850_elf_howto_table[ (int)r_type ].name,
205                    (h && h->root.root.string) ? h->root.root.string : "<unknown>",
206                    (h->root.type == bfd_link_hash_common) ? ", symbol is common" : "");
207 #endif
208           break;
209         }
210     }
211
212   return ret;
213 }
214
215 /* In the old version, when an entry was checked out from the table,
216    it was deleted.  This produced an error if the entry was needed
217    more than once, as the second attempted retry failed.
218
219    In the current version, the entry is not deleted, instead we set
220    the field 'found' to TRUE.  If a second lookup matches the same
221    entry, then we know that the hi16s reloc has already been updated
222    and does not need to be updated a second time.
223
224    TODO - TOFIX: If it is possible that we need to restore 2 different
225    addresses from the same table entry, where the first generates an
226    overflow, whilst the second do not, then this code will fail.  */
227
228 typedef struct hi16s_location
229 {
230   bfd_vma                 addend;
231   bfd_byte *              address;
232   unsigned long           counter;
233   bfd_boolean             found;
234   struct hi16s_location * next;
235 }
236 hi16s_location;
237
238 static hi16s_location * previous_hi16s;
239 static hi16s_location * free_hi16s;
240 static unsigned long    hi16s_counter;
241
242 static void
243 remember_hi16s_reloc (bfd *abfd, bfd_vma addend, bfd_byte *address)
244 {
245   hi16s_location * entry = NULL;
246   bfd_size_type amt = sizeof (* free_hi16s);
247
248   /* Find a free structure.  */
249   if (free_hi16s == NULL)
250     free_hi16s = bfd_zalloc (abfd, amt);
251
252   entry      = free_hi16s;
253   free_hi16s = free_hi16s->next;
254
255   entry->addend  = addend;
256   entry->address = address;
257   entry->counter = hi16s_counter ++;
258   entry->found   = FALSE;
259   entry->next    = previous_hi16s;
260   previous_hi16s = entry;
261
262   /* Cope with wrap around of our counter.  */
263   if (hi16s_counter == 0)
264     {
265       /* XXX: Assume that all counter entries differ only in their low 16 bits.  */
266       for (entry = previous_hi16s; entry != NULL; entry = entry->next)
267         entry->counter &= 0xffff;
268
269       hi16s_counter = 0x10000;
270     }
271 }
272
273 static bfd_byte *
274 find_remembered_hi16s_reloc (bfd_vma addend, bfd_boolean *already_found)
275 {
276   hi16s_location *match = NULL;
277   hi16s_location *entry;
278   hi16s_location *previous = NULL;
279   hi16s_location *prev;
280   bfd_byte *addr;
281
282   /* Search the table.  Record the most recent entry that matches.  */
283   for (entry = previous_hi16s; entry; entry = entry->next)
284     {
285       if (entry->addend == addend
286           && (match == NULL || match->counter < entry->counter))
287         {
288           previous = prev;
289           match    = entry;
290         }
291
292       prev = entry;
293     }
294
295   if (match == NULL)
296     return NULL;
297
298   /* Extract the address.  */
299   addr = match->address;
300
301   /* Remember if this entry has already been used before.  */
302   if (already_found)
303     * already_found = match->found;
304
305   /* Note that this entry has now been used.  */
306   match->found = TRUE;
307
308   return addr;
309 }
310
311 /* Calculate the final operand value for a R_V850_LO16 or
312    R_V850_LO16_SPLIT_OFFSET.  *INSN is the current operand value and
313    ADDEND is the sum of the relocation symbol and offset.  Store the
314    operand value in *INSN and return true on success.
315
316    The assembler has already done some of this: If the value stored in
317    the instruction has its 15th bit set, (counting from zero) then the
318    assembler will have added 1 to the value stored in the associated
319    HI16S reloc.  So for example, these relocations:
320
321        movhi hi( fred ), r0, r1
322        movea lo( fred ), r1, r1
323
324    will store 0 in the value fields for the MOVHI and MOVEA instructions
325    and addend will be the address of fred, but for these instructions:
326
327        movhi hi( fred + 0x123456), r0, r1
328        movea lo( fred + 0x123456), r1, r1
329
330    the value stored in the MOVHI instruction will be 0x12 and the value
331    stored in the MOVEA instruction will be 0x3456.  If however the
332    instructions were:
333
334        movhi hi( fred + 0x10ffff), r0, r1
335        movea lo( fred + 0x10ffff), r1, r1
336
337    then the value stored in the MOVHI instruction would be 0x11 (not
338    0x10) and the value stored in the MOVEA instruction would be 0xffff.
339    Thus (assuming for the moment that the addend is 0), at run time the
340    MOVHI instruction loads 0x110000 into r1, then the MOVEA instruction
341    adds 0xffffffff (sign extension!) producing 0x10ffff.  Similarly if
342    the instructions were:
343
344        movhi hi( fred - 1), r0, r1
345        movea lo( fred - 1), r1, r1
346
347    then 0 is stored in the MOVHI instruction and -1 is stored in the
348    MOVEA instruction.
349
350    Overflow can occur if the addition of the value stored in the
351    instruction plus the addend sets the 15th bit when before it was clear.
352    This is because the 15th bit will be sign extended into the high part,
353    thus reducing its value by one, but since the 15th bit was originally
354    clear, the assembler will not have added 1 to the previous HI16S reloc
355    to compensate for this effect.  For example:
356
357       movhi hi( fred + 0x123456), r0, r1
358       movea lo( fred + 0x123456), r1, r1
359
360    The value stored in HI16S reloc is 0x12, the value stored in the LO16
361    reloc is 0x3456.  If we assume that the address of fred is 0x00007000
362    then the relocations become:
363
364      HI16S: 0x0012 + (0x00007000 >> 16)    = 0x12
365      LO16:  0x3456 + (0x00007000 & 0xffff) = 0xa456
366
367    but when the instructions are executed, the MOVEA instruction's value
368    is signed extended, so the sum becomes:
369
370         0x00120000
371       + 0xffffa456
372       ------------
373         0x0011a456    but 'fred + 0x123456' = 0x0012a456
374
375    Note that if the 15th bit was set in the value stored in the LO16
376    reloc, then we do not have to do anything:
377
378       movhi hi( fred + 0x10ffff), r0, r1
379       movea lo( fred + 0x10ffff), r1, r1
380
381       HI16S:  0x0011 + (0x00007000 >> 16)    = 0x11
382       LO16:   0xffff + (0x00007000 & 0xffff) = 0x6fff
383
384         0x00110000
385       + 0x00006fff
386       ------------
387         0x00116fff  = fred + 0x10ffff = 0x7000 + 0x10ffff
388
389    Overflow can also occur if the computation carries into the 16th bit
390    and it also results in the 15th bit having the same value as the 15th
391    bit of the original value.   What happens is that the HI16S reloc
392    will have already examined the 15th bit of the original value and
393    added 1 to the high part if the bit is set.  This compensates for the
394    sign extension of 15th bit of the result of the computation.  But now
395    there is a carry into the 16th bit, and this has not been allowed for.
396
397    So, for example if fred is at address 0xf000:
398
399      movhi hi( fred + 0xffff), r0, r1    [bit 15 of the offset is set]
400      movea lo( fred + 0xffff), r1, r1
401
402      HI16S: 0x0001 + (0x0000f000 >> 16)    = 0x0001
403      LO16:  0xffff + (0x0000f000 & 0xffff) = 0xefff   (carry into bit 16 is lost)
404
405        0x00010000
406      + 0xffffefff
407      ------------
408        0x0000efff   but 'fred + 0xffff' = 0x0001efff
409
410    Similarly, if the 15th bit remains clear, but overflow occurs into
411    the 16th bit then (assuming the address of fred is 0xf000):
412
413      movhi hi( fred + 0x7000), r0, r1    [bit 15 of the offset is clear]
414      movea lo( fred + 0x7000), r1, r1
415
416      HI16S: 0x0000 + (0x0000f000 >> 16)    = 0x0000
417      LO16:  0x7000 + (0x0000f000 & 0xffff) = 0x6fff  (carry into bit 16 is lost)
418
419        0x00000000
420      + 0x00006fff
421      ------------
422        0x00006fff   but 'fred + 0x7000' = 0x00016fff
423
424    Note - there is no need to change anything if a carry occurs, and the
425    15th bit changes its value from being set to being clear, as the HI16S
426    reloc will have already added in 1 to the high part for us:
427
428      movhi hi( fred + 0xffff), r0, r1     [bit 15 of the offset is set]
429      movea lo( fred + 0xffff), r1, r1
430
431      HI16S: 0x0001 + (0x00007000 >> 16)
432      LO16:  0xffff + (0x00007000 & 0xffff) = 0x6fff  (carry into bit 16 is lost)
433
434        0x00010000
435      + 0x00006fff   (bit 15 not set, so the top half is zero)
436      ------------
437        0x00016fff   which is right (assuming that fred is at 0x7000)
438
439    but if the 15th bit goes from being clear to being set, then we must
440    once again handle overflow:
441
442      movhi hi( fred + 0x7000), r0, r1     [bit 15 of the offset is clear]
443      movea lo( fred + 0x7000), r1, r1
444
445      HI16S: 0x0000 + (0x0000ffff >> 16)
446      LO16:  0x7000 + (0x0000ffff & 0xffff) = 0x6fff  (carry into bit 16)
447
448        0x00000000
449      + 0x00006fff   (bit 15 not set, so the top half is zero)
450      ------------
451        0x00006fff   which is wrong (assuming that fred is at 0xffff).  */
452
453 static bfd_boolean
454 v850_elf_perform_lo16_relocation (bfd *abfd, unsigned long *insn,
455                                   unsigned long addend)
456 {
457 #define BIT15_SET(x) ((x) & 0x8000)
458 #define OVERFLOWS(a,i) ((((a) & 0xffff) + (i)) > 0xffff)
459
460   if ((BIT15_SET (*insn + addend) && ! BIT15_SET (addend))
461       || (OVERFLOWS (addend, *insn)
462           && ((! BIT15_SET (*insn)) || (BIT15_SET (addend)))))
463     {
464       bfd_boolean already_updated;
465       bfd_byte *hi16s_address = find_remembered_hi16s_reloc
466         (addend, & already_updated);
467
468       /* Amend the matching HI16_S relocation.  */
469       if (hi16s_address != NULL)
470         {
471           if (! already_updated)
472             {
473               unsigned long hi_insn = bfd_get_16 (abfd, hi16s_address);
474               hi_insn += 1;
475               bfd_put_16 (abfd, hi_insn, hi16s_address);
476             }
477         }
478       else
479         {
480           fprintf (stderr, _("FAILED to find previous HI16 reloc\n"));
481           return FALSE;
482         }
483     }
484 #undef OVERFLOWS
485 #undef BIT15_SET
486
487   /* Do not complain if value has top bit set, as this has been
488      anticipated.  */
489   *insn = (*insn + addend) & 0xffff;
490   return TRUE;
491 }
492
493 /* FIXME:  The code here probably ought to be removed and the code in reloc.c
494    allowed to do its stuff instead.  At least for most of the relocs, anyway.  */
495
496 static bfd_reloc_status_type
497 v850_elf_perform_relocation (bfd *abfd,
498                              unsigned int r_type,
499                              bfd_vma addend,
500                              bfd_byte *address)
501 {
502   unsigned long insn;
503   unsigned long result;
504   bfd_signed_vma saddend = (bfd_signed_vma) addend;
505
506   switch (r_type)
507     {
508     default:
509       return bfd_reloc_notsupported;
510
511     case R_V850_REL32:
512     case R_V850_ABS32:
513       bfd_put_32 (abfd, addend, address);
514       return bfd_reloc_ok;
515
516     case R_V850_22_PCREL:
517       if (saddend > 0x1fffff || saddend < -0x200000)
518         return bfd_reloc_overflow;
519
520       if ((addend % 2) != 0)
521         return bfd_reloc_dangerous;
522
523       insn  = bfd_get_32 (abfd, address);
524       insn &= ~0xfffe003f;
525       insn |= (((addend & 0xfffe) << 16) | ((addend & 0x3f0000) >> 16));
526       bfd_put_32 (abfd, (bfd_vma) insn, address);
527       return bfd_reloc_ok;
528
529     case R_V850_9_PCREL:
530       if (saddend > 0xff || saddend < -0x100)
531         return bfd_reloc_overflow;
532
533       if ((addend % 2) != 0)
534         return bfd_reloc_dangerous;
535
536       insn  = bfd_get_16 (abfd, address);
537       insn &= ~ 0xf870;
538       insn |= ((addend & 0x1f0) << 7) | ((addend & 0x0e) << 3);
539       break;
540
541     case R_V850_HI16:
542       addend += (bfd_get_16 (abfd, address) << 16);
543       addend = (addend >> 16);
544       insn = addend;
545       break;
546
547     case R_V850_HI16_S:
548       /* Remember where this relocation took place.  */
549       remember_hi16s_reloc (abfd, addend, address);
550
551       addend += (bfd_get_16 (abfd, address) << 16);
552       addend = (addend >> 16) + ((addend & 0x8000) != 0);
553
554       /* This relocation cannot overflow.  */
555       if (addend > 0x7fff)
556         addend = 0;
557
558       insn = addend;
559       break;
560
561     case R_V850_LO16:
562       insn = bfd_get_16 (abfd, address);
563       if (! v850_elf_perform_lo16_relocation (abfd, &insn, addend))
564         return bfd_reloc_overflow;
565       break;
566
567     case R_V850_8:
568       addend += (char) bfd_get_8 (abfd, address);
569
570       saddend = (bfd_signed_vma) addend;
571
572       if (saddend > 0x7f || saddend < -0x80)
573         return bfd_reloc_overflow;
574
575       bfd_put_8 (abfd, addend, address);
576       return bfd_reloc_ok;
577
578     case R_V850_CALLT_16_16_OFFSET:
579       addend += bfd_get_16 (abfd, address);
580
581       saddend = (bfd_signed_vma) addend;
582
583       if (saddend > 0xffff || saddend < 0)
584         return bfd_reloc_overflow;
585
586       insn = addend;
587       break;
588
589     case R_V850_16:
590     case R_V850_SDA_16_16_OFFSET:
591     case R_V850_ZDA_16_16_OFFSET:
592     case R_V850_TDA_16_16_OFFSET:
593       addend += bfd_get_16 (abfd, address);
594
595       saddend = (bfd_signed_vma) addend;
596
597       if (saddend > 0x7fff || saddend < -0x8000)
598         return bfd_reloc_overflow;
599
600       insn = addend;
601       break;
602
603     case R_V850_SDA_15_16_OFFSET:
604     case R_V850_ZDA_15_16_OFFSET:
605       insn = bfd_get_16 (abfd, address);
606       addend += (insn & 0xfffe);
607
608       saddend = (bfd_signed_vma) addend;
609
610       if (saddend > 0x7ffe || saddend < -0x8000)
611         return bfd_reloc_overflow;
612
613       if (addend & 1)
614         return bfd_reloc_dangerous;
615
616       insn = (addend &~ (bfd_vma) 1) | (insn & 1);
617       break;
618
619     case R_V850_TDA_6_8_OFFSET:
620       insn = bfd_get_16 (abfd, address);
621       addend += ((insn & 0x7e) << 1);
622
623       saddend = (bfd_signed_vma) addend;
624
625       if (saddend > 0xfc || saddend < 0)
626         return bfd_reloc_overflow;
627
628       if (addend & 3)
629         return bfd_reloc_dangerous;
630
631       insn &= 0xff81;
632       insn |= (addend >> 1);
633       break;
634
635     case R_V850_TDA_7_8_OFFSET:
636       insn = bfd_get_16 (abfd, address);
637       addend += ((insn & 0x7f) << 1);
638
639       saddend = (bfd_signed_vma) addend;
640
641       if (saddend > 0xfe || saddend < 0)
642         return bfd_reloc_overflow;
643
644       if (addend & 1)
645         return bfd_reloc_dangerous;
646
647       insn &= 0xff80;
648       insn |= (addend >> 1);
649       break;
650
651     case R_V850_TDA_7_7_OFFSET:
652       insn = bfd_get_16 (abfd, address);
653       addend += insn & 0x7f;
654
655       saddend = (bfd_signed_vma) addend;
656
657       if (saddend > 0x7f || saddend < 0)
658         return bfd_reloc_overflow;
659
660       insn &= 0xff80;
661       insn |= addend;
662       break;
663
664     case R_V850_TDA_4_5_OFFSET:
665       insn = bfd_get_16 (abfd, address);
666       addend += ((insn & 0xf) << 1);
667
668       saddend = (bfd_signed_vma) addend;
669
670       if (saddend > 0x1e || saddend < 0)
671         return bfd_reloc_overflow;
672
673       if (addend & 1)
674         return bfd_reloc_dangerous;
675
676       insn &= 0xfff0;
677       insn |= (addend >> 1);
678       break;
679
680     case R_V850_TDA_4_4_OFFSET:
681       insn = bfd_get_16 (abfd, address);
682       addend += insn & 0xf;
683
684       saddend = (bfd_signed_vma) addend;
685
686       if (saddend > 0xf || saddend < 0)
687         return bfd_reloc_overflow;
688
689       insn &= 0xfff0;
690       insn |= addend;
691       break;
692
693     case R_V850_LO16_SPLIT_OFFSET:
694       insn = bfd_get_32 (abfd, address);
695       result = ((insn & 0xfffe0000) >> 16) | ((insn & 0x20) >> 5);
696       if (! v850_elf_perform_lo16_relocation (abfd, &result, addend))
697         return bfd_reloc_overflow;
698       insn = (((result << 16) & 0xfffe0000)
699               | ((result << 5) & 0x20)
700               | (insn & ~0xfffe0020));
701       bfd_put_32 (abfd, insn, address);
702       return bfd_reloc_ok;
703
704     case R_V850_ZDA_16_16_SPLIT_OFFSET:
705     case R_V850_SDA_16_16_SPLIT_OFFSET:
706       insn = bfd_get_32 (abfd, address);
707       addend += ((insn & 0xfffe0000) >> 16) + ((insn & 0x20) >> 5);
708
709       saddend = (bfd_signed_vma) addend;
710
711       if (saddend > 0x7fff || saddend < -0x8000)
712         return bfd_reloc_overflow;
713
714       insn &= 0x0001ffdf;
715       insn |= (addend & 1) << 5;
716       insn |= (addend &~ (bfd_vma) 1) << 16;
717
718       bfd_put_32 (abfd, (bfd_vma) insn, address);
719       return bfd_reloc_ok;
720
721     case R_V850_CALLT_6_7_OFFSET:
722       insn = bfd_get_16 (abfd, address);
723       addend += ((insn & 0x3f) << 1);
724
725       saddend = (bfd_signed_vma) addend;
726
727       if (saddend > 0x7e || saddend < 0)
728         return bfd_reloc_overflow;
729
730       if (addend & 1)
731         return bfd_reloc_dangerous;
732
733       insn &= 0xff80;
734       insn |= (addend >> 1);
735       break;
736
737     case R_V850_GNU_VTINHERIT:
738     case R_V850_GNU_VTENTRY:
739       return bfd_reloc_ok;
740
741     }
742
743   bfd_put_16 (abfd, (bfd_vma) insn, address);
744   return bfd_reloc_ok;
745 }
746 \f
747 /* Insert the addend into the instruction.  */
748
749 static bfd_reloc_status_type
750 v850_elf_reloc (bfd *abfd ATTRIBUTE_UNUSED,
751                 arelent *reloc,
752                 asymbol *symbol,
753                 void * data ATTRIBUTE_UNUSED,
754                 asection *isection,
755                 bfd *obfd,
756                 char **err ATTRIBUTE_UNUSED)
757 {
758   long relocation;
759
760   /* If there is an output BFD,
761      and the symbol is not a section name (which is only defined at final link time),
762      and either we are not putting the addend into the instruction
763       or the addend is zero, so there is nothing to add into the instruction
764      then just fixup the address and return.  */
765   if (obfd != NULL
766       && (symbol->flags & BSF_SECTION_SYM) == 0
767       && (! reloc->howto->partial_inplace
768           || reloc->addend == 0))
769     {
770       reloc->address += isection->output_offset;
771       return bfd_reloc_ok;
772     }
773
774   /* Catch relocs involving undefined symbols.  */
775   if (bfd_is_und_section (symbol->section)
776       && (symbol->flags & BSF_WEAK) == 0
777       && obfd == NULL)
778     return bfd_reloc_undefined;
779
780   /* We handle final linking of some relocs ourselves.  */
781
782   /* Is the address of the relocation really within the section?  */
783   if (reloc->address > bfd_get_section_limit (abfd, isection))
784     return bfd_reloc_outofrange;
785
786   /* Work out which section the relocation is targeted at and the
787      initial relocation command value.  */
788
789   if (reloc->howto->pc_relative)
790     return bfd_reloc_ok;
791
792   /* Get symbol value.  (Common symbols are special.)  */
793   if (bfd_is_com_section (symbol->section))
794     relocation = 0;
795   else
796     relocation = symbol->value;
797
798   /* Convert input-section-relative symbol value to absolute + addend.  */
799   relocation += symbol->section->output_section->vma;
800   relocation += symbol->section->output_offset;
801   relocation += reloc->addend;
802
803   reloc->addend = relocation;
804   return bfd_reloc_ok;
805 }
806
807 /* This function is used for relocs which are only used
808    for relaxing, which the linker should otherwise ignore.  */
809
810 static bfd_reloc_status_type
811 v850_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED,
812                        arelent *reloc_entry,
813                        asymbol *symbol ATTRIBUTE_UNUSED,
814                        void * data ATTRIBUTE_UNUSED,
815                        asection *input_section,
816                        bfd *output_bfd,
817                        char **error_message ATTRIBUTE_UNUSED)
818 {
819   if (output_bfd != NULL)
820     reloc_entry->address += input_section->output_offset;
821
822   return bfd_reloc_ok;
823 }
824 /* Note: It is REQUIRED that the 'type' value of each entry
825    in this array match the index of the entry in the array.  */
826 static reloc_howto_type v850_elf_howto_table[] =
827 {
828   /* This reloc does nothing.  */
829   HOWTO (R_V850_NONE,                   /* Type.  */
830          0,                             /* Rightshift.  */
831          2,                             /* Size (0 = byte, 1 = short, 2 = long).  */
832          32,                            /* Bitsize.  */
833          FALSE,                         /* PC_relative.  */
834          0,                             /* Bitpos.  */
835          complain_overflow_bitfield,    /* Complain_on_overflow.  */
836          bfd_elf_generic_reloc,         /* Special_function.  */
837          "R_V850_NONE",                 /* Name.  */
838          FALSE,                         /* Partial_inplace.  */
839          0,                             /* Src_mask.  */
840          0,                             /* Dst_mask.  */
841          FALSE),                        /* PCrel_offset.  */
842
843   /* A PC relative 9 bit branch.  */
844   HOWTO (R_V850_9_PCREL,                /* Type.  */
845          2,                             /* Rightshift.  */
846          2,                             /* Size (0 = byte, 1 = short, 2 = long).  */
847          26,                            /* Bitsize.  */
848          TRUE,                          /* PC_relative.  */
849          0,                             /* Bitpos.  */
850          complain_overflow_bitfield,    /* Complain_on_overflow.  */
851          v850_elf_reloc,                /* Special_function.  */
852          "R_V850_9_PCREL",              /* Name.  */
853          FALSE,                         /* Partial_inplace.  */
854          0x00ffffff,                    /* Src_mask.  */
855          0x00ffffff,                    /* Dst_mask.  */
856          TRUE),                         /* PCrel_offset.  */
857
858   /* A PC relative 22 bit branch.  */
859   HOWTO (R_V850_22_PCREL,               /* Type.  */
860          2,                             /* Rightshift.  */
861          2,                             /* Size (0 = byte, 1 = short, 2 = long).  */
862          22,                            /* Bitsize.  */
863          TRUE,                          /* PC_relative.  */
864          7,                             /* Bitpos.  */
865          complain_overflow_signed,      /* Complain_on_overflow.  */
866          v850_elf_reloc,                /* Special_function.  */
867          "R_V850_22_PCREL",             /* Name.  */
868          FALSE,                         /* Partial_inplace.  */
869          0x07ffff80,                    /* Src_mask.  */
870          0x07ffff80,                    /* Dst_mask.  */
871          TRUE),                         /* PCrel_offset.  */
872
873   /* High 16 bits of symbol value.  */
874   HOWTO (R_V850_HI16_S,                 /* Type.  */
875          0,                             /* Rightshift.  */
876          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
877          16,                            /* Bitsize.  */
878          FALSE,                         /* PC_relative.  */
879          0,                             /* Bitpos.  */
880          complain_overflow_dont,        /* Complain_on_overflow.  */
881          v850_elf_reloc,                /* Special_function.  */
882          "R_V850_HI16_S",               /* Name.  */
883          FALSE,                         /* Partial_inplace.  */
884          0xffff,                        /* Src_mask.  */
885          0xffff,                        /* Dst_mask.  */
886          FALSE),                        /* PCrel_offset.  */
887
888   /* High 16 bits of symbol value.  */
889   HOWTO (R_V850_HI16,                   /* Type.  */
890          0,                             /* Rightshift.  */
891          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
892          16,                            /* Bitsize.  */
893          FALSE,                         /* PC_relative.  */
894          0,                             /* Bitpos.  */
895          complain_overflow_dont,        /* Complain_on_overflow.  */
896          v850_elf_reloc,                /* Special_function.  */
897          "R_V850_HI16",                 /* Name.  */
898          FALSE,                         /* Partial_inplace.  */
899          0xffff,                        /* Src_mask.  */
900          0xffff,                        /* Dst_mask.  */
901          FALSE),                        /* PCrel_offset.  */
902
903   /* Low 16 bits of symbol value.  */
904   HOWTO (R_V850_LO16,                   /* Type.  */
905          0,                             /* Rightshift.  */
906          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
907          16,                            /* Bitsize.  */
908          FALSE,                         /* PC_relative.  */
909          0,                             /* Bitpos.  */
910          complain_overflow_dont,        /* Complain_on_overflow.  */
911          v850_elf_reloc,                /* Special_function.  */
912          "R_V850_LO16",                 /* Name.  */
913          FALSE,                         /* Partial_inplace.  */
914          0xffff,                        /* Src_mask.  */
915          0xffff,                        /* Dst_mask.  */
916          FALSE),                        /* PCrel_offset.  */
917
918   /* Simple 32bit reloc.  */
919   HOWTO (R_V850_ABS32,                  /* Type.  */
920          0,                             /* Rightshift.  */
921          2,                             /* Size (0 = byte, 1 = short, 2 = long).  */
922          32,                            /* Bitsize.  */
923          FALSE,                         /* PC_relative.  */
924          0,                             /* Bitpos.  */
925          complain_overflow_dont,        /* Complain_on_overflow.  */
926          v850_elf_reloc,                /* Special_function.  */
927          "R_V850_ABS32",                /* Name.  */
928          FALSE,                         /* Partial_inplace.  */
929          0xffffffff,                    /* Src_mask.  */
930          0xffffffff,                    /* Dst_mask.  */
931          FALSE),                        /* PCrel_offset.  */
932
933   /* Simple 16bit reloc.  */
934   HOWTO (R_V850_16,                     /* Type.  */
935          0,                             /* Rightshift.  */
936          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
937          16,                            /* Bitsize.  */
938          FALSE,                         /* PC_relative.  */
939          0,                             /* Bitpos.  */
940          complain_overflow_dont,        /* Complain_on_overflow.  */
941          bfd_elf_generic_reloc,         /* Special_function.  */
942          "R_V850_16",                   /* Name.  */
943          FALSE,                         /* Partial_inplace.  */
944          0xffff,                        /* Src_mask.  */
945          0xffff,                        /* Dst_mask.  */
946          FALSE),                        /* PCrel_offset.  */
947
948   /* Simple 8bit reloc.  */
949   HOWTO (R_V850_8,                      /* Type.  */
950          0,                             /* Rightshift.  */
951          0,                             /* Size (0 = byte, 1 = short, 2 = long).  */
952          8,                             /* Bitsize.  */
953          FALSE,                         /* PC_relative.  */
954          0,                             /* Bitpos.  */
955          complain_overflow_dont,        /* Complain_on_overflow.  */
956          bfd_elf_generic_reloc,         /* Special_function.  */
957          "R_V850_8",                    /* Name.  */
958          FALSE,                         /* Partial_inplace.  */
959          0xff,                          /* Src_mask.  */
960          0xff,                          /* Dst_mask.  */
961          FALSE),                        /* PCrel_offset.  */
962
963   /* 16 bit offset from the short data area pointer.  */
964   HOWTO (R_V850_SDA_16_16_OFFSET,       /* Type.  */
965          0,                             /* Rightshift.  */
966          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
967          16,                            /* Bitsize.  */
968          FALSE,                         /* PC_relative.  */
969          0,                             /* Bitpos.  */
970          complain_overflow_dont,        /* Complain_on_overflow.  */
971          v850_elf_reloc,                /* Special_function.  */
972          "R_V850_SDA_16_16_OFFSET",     /* Name.  */
973          FALSE,                         /* Partial_inplace.  */
974          0xffff,                        /* Src_mask.  */
975          0xffff,                        /* Dst_mask.  */
976          FALSE),                        /* PCrel_offset.  */
977
978   /* 15 bit offset from the short data area pointer.  */
979   HOWTO (R_V850_SDA_15_16_OFFSET,       /* Type.  */
980          1,                             /* Rightshift.  */
981          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
982          16,                            /* Bitsize.  */
983          FALSE,                         /* PC_relative.  */
984          1,                             /* Bitpos.  */
985          complain_overflow_dont,        /* Complain_on_overflow.  */
986          v850_elf_reloc,                /* Special_function.  */
987          "R_V850_SDA_15_16_OFFSET",     /* Name.  */
988          FALSE,                         /* Partial_inplace.  */
989          0xfffe,                        /* Src_mask.  */
990          0xfffe,                        /* Dst_mask.  */
991          FALSE),                        /* PCrel_offset.  */
992
993   /* 16 bit offset from the zero data area pointer.  */
994   HOWTO (R_V850_ZDA_16_16_OFFSET,       /* Type.  */
995          0,                             /* Rightshift.  */
996          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
997          16,                            /* Bitsize.  */
998          FALSE,                         /* PC_relative.  */
999          0,                             /* Bitpos.  */
1000          complain_overflow_dont,        /* Complain_on_overflow.  */
1001          v850_elf_reloc,                /* Special_function.  */
1002          "R_V850_ZDA_16_16_OFFSET",     /* Name.  */
1003          FALSE,                         /* Partial_inplace.  */
1004          0xffff,                        /* Src_mask.  */
1005          0xffff,                        /* Dst_mask.  */
1006          FALSE),                        /* PCrel_offset.  */
1007
1008   /* 15 bit offset from the zero data area pointer.  */
1009   HOWTO (R_V850_ZDA_15_16_OFFSET,       /* Type.  */
1010          1,                             /* Rightshift.  */
1011          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
1012          16,                            /* Bitsize.  */
1013          FALSE,                         /* PC_relative.  */
1014          1,                             /* Bitpos.  */
1015          complain_overflow_dont,        /* Complain_on_overflow.  */
1016          v850_elf_reloc,                /* Special_function.  */
1017          "R_V850_ZDA_15_16_OFFSET",     /* Name.  */
1018          FALSE,                         /* Partial_inplace.  */
1019          0xfffe,                        /* Src_mask.  */
1020          0xfffe,                        /* Dst_mask.  */
1021          FALSE),                        /* PCrel_offset.  */
1022
1023   /* 6 bit offset from the tiny data area pointer.  */
1024   HOWTO (R_V850_TDA_6_8_OFFSET,         /* Type.  */
1025          2,                             /* Rightshift.  */
1026          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
1027          8,                             /* Bitsize.  */
1028          FALSE,                         /* PC_relative.  */
1029          1,                             /* Bitpos.  */
1030          complain_overflow_dont,        /* Complain_on_overflow.  */
1031          v850_elf_reloc,                /* Special_function.  */
1032          "R_V850_TDA_6_8_OFFSET",       /* Name.  */
1033          FALSE,                         /* Partial_inplace.  */
1034          0x7e,                          /* Src_mask.  */
1035          0x7e,                          /* Dst_mask.  */
1036          FALSE),                        /* PCrel_offset.  */
1037
1038   /* 8 bit offset from the tiny data area pointer.  */
1039   HOWTO (R_V850_TDA_7_8_OFFSET,         /* Type.  */
1040          1,                             /* Rightshift.  */
1041          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
1042          8,                             /* Bitsize.  */
1043          FALSE,                         /* PC_relative.  */
1044          0,                             /* Bitpos.  */
1045          complain_overflow_dont,        /* Complain_on_overflow.  */
1046          v850_elf_reloc,                /* Special_function.  */
1047          "R_V850_TDA_7_8_OFFSET",       /* Name.  */
1048          FALSE,                         /* Partial_inplace.  */
1049          0x7f,                          /* Src_mask.  */
1050          0x7f,                          /* Dst_mask.  */
1051          FALSE),                        /* PCrel_offset.  */
1052
1053   /* 7 bit offset from the tiny data area pointer.  */
1054   HOWTO (R_V850_TDA_7_7_OFFSET,         /* Type.  */
1055          0,                             /* Rightshift.  */
1056          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
1057          7,                             /* Bitsize.  */
1058          FALSE,                         /* PC_relative.  */
1059          0,                             /* Bitpos.  */
1060          complain_overflow_dont,        /* Complain_on_overflow.  */
1061          v850_elf_reloc,                /* Special_function.  */
1062          "R_V850_TDA_7_7_OFFSET",       /* Name.  */
1063          FALSE,                         /* Partial_inplace.  */
1064          0x7f,                          /* Src_mask.  */
1065          0x7f,                          /* Dst_mask.  */
1066          FALSE),                        /* PCrel_offset.  */
1067
1068   /* 16 bit offset from the tiny data area pointer!  */
1069   HOWTO (R_V850_TDA_16_16_OFFSET,       /* Type.  */
1070          0,                             /* Rightshift.  */
1071          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
1072          16,                            /* Bitsize.  */
1073          FALSE,                         /* PC_relative.  */
1074          0,                             /* Bitpos.  */
1075          complain_overflow_dont,        /* Complain_on_overflow.  */
1076          v850_elf_reloc,                /* Special_function.  */
1077          "R_V850_TDA_16_16_OFFSET",     /* Name.  */
1078          FALSE,                         /* Partial_inplace.  */
1079          0xffff,                        /* Src_mask.  */
1080          0xfff,                         /* Dst_mask.  */
1081          FALSE),                        /* PCrel_offset.  */
1082
1083   /* 5 bit offset from the tiny data area pointer.  */
1084   HOWTO (R_V850_TDA_4_5_OFFSET,         /* Type.  */
1085          1,                             /* Rightshift.  */
1086          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
1087          5,                             /* Bitsize.  */
1088          FALSE,                         /* PC_relative.  */
1089          0,                             /* Bitpos.  */
1090          complain_overflow_dont,        /* Complain_on_overflow.  */
1091          v850_elf_reloc,                /* Special_function.  */
1092          "R_V850_TDA_4_5_OFFSET",       /* Name.  */
1093          FALSE,                         /* Partial_inplace.  */
1094          0x0f,                          /* Src_mask.  */
1095          0x0f,                          /* Dst_mask.  */
1096          FALSE),                        /* PCrel_offset.  */
1097
1098   /* 4 bit offset from the tiny data area pointer.  */
1099   HOWTO (R_V850_TDA_4_4_OFFSET,         /* Type.  */
1100          0,                             /* Rightshift.  */
1101          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
1102          4,                             /* Bitsize.  */
1103          FALSE,                         /* PC_relative.  */
1104          0,                             /* Bitpos.  */
1105          complain_overflow_dont,        /* Complain_on_overflow.  */
1106          v850_elf_reloc,                /* Special_function.  */
1107          "R_V850_TDA_4_4_OFFSET",       /* Name.  */
1108          FALSE,                         /* Partial_inplace.  */
1109          0x0f,                          /* Src_mask.  */
1110          0x0f,                          /* Dst_mask.  */
1111          FALSE),                        /* PCrel_offset.  */
1112
1113   /* 16 bit offset from the short data area pointer.  */
1114   HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET, /* Type.  */
1115          0,                             /* Rightshift.  */
1116          2,                             /* Size (0 = byte, 1 = short, 2 = long).  */
1117          16,                            /* Bitsize.  */
1118          FALSE,                         /* PC_relative.  */
1119          0,                             /* Bitpos.  */
1120          complain_overflow_dont,        /* Complain_on_overflow.  */
1121          v850_elf_reloc,                /* Special_function.  */
1122          "R_V850_SDA_16_16_SPLIT_OFFSET",/* Name.  */
1123          FALSE,                         /* Partial_inplace.  */
1124          0xfffe0020,                    /* Src_mask.  */
1125          0xfffe0020,                    /* Dst_mask.  */
1126          FALSE),                        /* PCrel_offset.  */
1127
1128   /* 16 bit offset from the zero data area pointer.  */
1129   HOWTO (R_V850_ZDA_16_16_SPLIT_OFFSET, /* Type.  */
1130          0,                             /* Rightshift.  */
1131          2,                             /* Size (0 = byte, 1 = short, 2 = long).  */
1132          16,                            /* Bitsize.  */
1133          FALSE,                         /* PC_relative.  */
1134          0,                             /* Bitpos.  */
1135          complain_overflow_dont,        /* Complain_on_overflow.  */
1136          v850_elf_reloc,                /* Special_function.  */
1137          "R_V850_ZDA_16_16_SPLIT_OFFSET",/* Name.  */
1138          FALSE,                         /* Partial_inplace.  */
1139          0xfffe0020,                    /* Src_mask.  */
1140          0xfffe0020,                    /* Dst_mask.  */
1141          FALSE),                        /* PCrel_offset.  */
1142
1143   /* 6 bit offset from the call table base pointer.  */
1144   HOWTO (R_V850_CALLT_6_7_OFFSET,       /* Type.  */
1145          0,                             /* Rightshift.  */
1146          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
1147          7,                             /* Bitsize.  */
1148          FALSE,                         /* PC_relative.  */
1149          0,                             /* Bitpos.  */
1150          complain_overflow_dont,        /* Complain_on_overflow.  */
1151          v850_elf_reloc,                /* Special_function.  */
1152          "R_V850_CALLT_6_7_OFFSET",     /* Name.  */
1153          FALSE,                         /* Partial_inplace.  */
1154          0x3f,                          /* Src_mask.  */
1155          0x3f,                          /* Dst_mask.  */
1156          FALSE),                        /* PCrel_offset.  */
1157
1158   /* 16 bit offset from the call table base pointer.  */
1159   HOWTO (R_V850_CALLT_16_16_OFFSET,     /* Type.  */
1160          0,                             /* Rightshift.  */
1161          1,                             /* Size (0 = byte, 1 = short, 2 = long).  */
1162          16,                            /* Bitsize.  */
1163          FALSE,                         /* PC_relative.  */
1164          0,                             /* Bitpos.  */
1165          complain_overflow_dont,        /* Complain_on_overflow.  */
1166          v850_elf_reloc,                /* Special_function.  */
1167          "R_V850_CALLT_16_16_OFFSET",   /* Name.  */
1168          FALSE,                         /* Partial_inplace.  */
1169          0xffff,                        /* Src_mask.  */
1170          0xffff,                        /* Dst_mask.  */
1171          FALSE),                        /* PCrel_offset.  */
1172
1173   /* GNU extension to record C++ vtable hierarchy */
1174   HOWTO (R_V850_GNU_VTINHERIT, /* Type.  */
1175          0,                     /* Rightshift.  */
1176          2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1177          0,                     /* Bitsize.  */
1178          FALSE,                 /* PC_relative.  */
1179          0,                     /* Bitpos.  */
1180          complain_overflow_dont, /* Complain_on_overflow.  */
1181          NULL,                  /* Special_function.  */
1182          "R_V850_GNU_VTINHERIT", /* Name.  */
1183          FALSE,                 /* Partial_inplace.  */
1184          0,                     /* Src_mask.  */
1185          0,                     /* Dst_mask.  */
1186          FALSE),                /* PCrel_offset.  */
1187
1188   /* GNU extension to record C++ vtable member usage */
1189   HOWTO (R_V850_GNU_VTENTRY,     /* Type.  */
1190          0,                     /* Rightshift.  */
1191          2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1192          0,                     /* Bitsize.  */
1193          FALSE,                 /* PC_relative.  */
1194          0,                     /* Bitpos.  */
1195          complain_overflow_dont, /* Complain_on_overflow.  */
1196          _bfd_elf_rel_vtable_reloc_fn,  /* Special_function.  */
1197          "R_V850_GNU_VTENTRY",   /* Name.  */
1198          FALSE,                 /* Partial_inplace.  */
1199          0,                     /* Src_mask.  */
1200          0,                     /* Dst_mask.  */
1201          FALSE),                /* PCrel_offset.  */
1202
1203   /* Indicates a .longcall pseudo-op.  The compiler will generate a .longcall
1204      pseudo-op when it finds a function call which can be relaxed.  */
1205   HOWTO (R_V850_LONGCALL,     /* Type.  */
1206        0,                     /* Rightshift.  */
1207        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1208        32,                    /* Bitsize.  */
1209        TRUE,                  /* PC_relative.  */
1210        0,                     /* Bitpos.  */
1211        complain_overflow_signed, /* Complain_on_overflow.  */
1212        v850_elf_ignore_reloc, /* Special_function.  */
1213        "R_V850_LONGCALL",     /* Name.  */
1214        FALSE,                 /* Partial_inplace.  */
1215        0,                     /* Src_mask.  */
1216        0,                     /* Dst_mask.  */
1217        TRUE),                 /* PCrel_offset.  */
1218
1219   /* Indicates a .longjump pseudo-op.  The compiler will generate a
1220      .longjump pseudo-op when it finds a branch which can be relaxed.  */
1221   HOWTO (R_V850_LONGJUMP,     /* Type.  */
1222        0,                     /* Rightshift.  */
1223        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1224        32,                    /* Bitsize.  */
1225        TRUE,                  /* PC_relative.  */
1226        0,                     /* Bitpos.  */
1227        complain_overflow_signed, /* Complain_on_overflow.  */
1228        v850_elf_ignore_reloc, /* Special_function.  */
1229        "R_V850_LONGJUMP",     /* Name.  */
1230        FALSE,                 /* Partial_inplace.  */
1231        0,                     /* Src_mask.  */
1232        0,                     /* Dst_mask.  */
1233        TRUE),                 /* PCrel_offset.  */
1234
1235   HOWTO (R_V850_ALIGN,        /* Type.  */
1236        0,                     /* Rightshift.  */
1237        1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1238        0,                     /* Bitsize.  */
1239        FALSE,                 /* PC_relative.  */
1240        0,                     /* Bitpos.  */
1241        complain_overflow_unsigned, /* Complain_on_overflow.  */
1242        v850_elf_ignore_reloc, /* Special_function.  */
1243        "R_V850_ALIGN",        /* Name.  */
1244        FALSE,                 /* Partial_inplace.  */
1245        0,                     /* Src_mask.  */
1246        0,                     /* Dst_mask.  */
1247        TRUE),                 /* PCrel_offset.  */
1248   
1249   /* Simple pc-relative 32bit reloc.  */
1250   HOWTO (R_V850_REL32,                  /* Type.  */
1251          0,                             /* Rightshift.  */
1252          2,                             /* Size (0 = byte, 1 = short, 2 = long).  */
1253          32,                            /* Bitsize.  */
1254          TRUE,                          /* PC_relative.  */
1255          0,                             /* Bitpos.  */
1256          complain_overflow_dont,        /* Complain_on_overflow.  */
1257          v850_elf_reloc,                /* Special_function.  */
1258          "R_V850_REL32",                /* Name.  */
1259          FALSE,                         /* Partial_inplace.  */
1260          0xffffffff,                    /* Src_mask.  */
1261          0xffffffff,                    /* Dst_mask.  */
1262          FALSE),                        /* PCrel_offset.  */
1263
1264   /* An ld.bu version of R_V850_LO16.  */
1265   HOWTO (R_V850_LO16_SPLIT_OFFSET,      /* Type.  */
1266          0,                             /* Rightshift.  */
1267          2,                             /* Size (0 = byte, 1 = short, 2 = long).  */
1268          16,                            /* Bitsize.  */
1269          FALSE,                         /* PC_relative.  */
1270          0,                             /* Bitpos.  */
1271          complain_overflow_dont,        /* Complain_on_overflow.  */
1272          v850_elf_reloc,                /* Special_function.  */
1273          "R_V850_LO16_SPLIT_OFFSET",    /* Name.  */
1274          FALSE,                         /* Partial_inplace.  */
1275          0xfffe0020,                    /* Src_mask.  */
1276          0xfffe0020,                    /* Dst_mask.  */
1277          FALSE),                        /* PCrel_offset.  */
1278 };
1279
1280 /* Map BFD reloc types to V850 ELF reloc types.  */
1281
1282 struct v850_elf_reloc_map
1283 {
1284   /* BFD_RELOC_V850_CALLT_16_16_OFFSET is 258, which will not fix in an
1285      unsigned char.  */
1286   bfd_reloc_code_real_type bfd_reloc_val;
1287   unsigned int elf_reloc_val;
1288 };
1289
1290 static const struct v850_elf_reloc_map v850_elf_reloc_map[] =
1291 {
1292   { BFD_RELOC_NONE,                        R_V850_NONE                   },
1293   { BFD_RELOC_V850_9_PCREL,                R_V850_9_PCREL                },
1294   { BFD_RELOC_V850_22_PCREL,               R_V850_22_PCREL               },
1295   { BFD_RELOC_HI16_S,                      R_V850_HI16_S                 },
1296   { BFD_RELOC_HI16,                        R_V850_HI16                   },
1297   { BFD_RELOC_LO16,                        R_V850_LO16                   },
1298   { BFD_RELOC_32,                          R_V850_ABS32                  },
1299   { BFD_RELOC_32_PCREL,                    R_V850_REL32                  },
1300   { BFD_RELOC_16,                          R_V850_16                     },
1301   { BFD_RELOC_8,                           R_V850_8                      },
1302   { BFD_RELOC_V850_SDA_16_16_OFFSET,       R_V850_SDA_16_16_OFFSET       },
1303   { BFD_RELOC_V850_SDA_15_16_OFFSET,       R_V850_SDA_15_16_OFFSET       },
1304   { BFD_RELOC_V850_ZDA_16_16_OFFSET,       R_V850_ZDA_16_16_OFFSET       },
1305   { BFD_RELOC_V850_ZDA_15_16_OFFSET,       R_V850_ZDA_15_16_OFFSET       },
1306   { BFD_RELOC_V850_TDA_6_8_OFFSET,         R_V850_TDA_6_8_OFFSET         },
1307   { BFD_RELOC_V850_TDA_7_8_OFFSET,         R_V850_TDA_7_8_OFFSET         },
1308   { BFD_RELOC_V850_TDA_7_7_OFFSET,         R_V850_TDA_7_7_OFFSET         },
1309   { BFD_RELOC_V850_TDA_16_16_OFFSET,       R_V850_TDA_16_16_OFFSET       },
1310   { BFD_RELOC_V850_TDA_4_5_OFFSET,         R_V850_TDA_4_5_OFFSET         },
1311   { BFD_RELOC_V850_TDA_4_4_OFFSET,         R_V850_TDA_4_4_OFFSET         },
1312   { BFD_RELOC_V850_LO16_SPLIT_OFFSET,      R_V850_LO16_SPLIT_OFFSET      },
1313   { BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET, R_V850_SDA_16_16_SPLIT_OFFSET },
1314   { BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET, R_V850_ZDA_16_16_SPLIT_OFFSET },
1315   { BFD_RELOC_V850_CALLT_6_7_OFFSET,       R_V850_CALLT_6_7_OFFSET       },
1316   { BFD_RELOC_V850_CALLT_16_16_OFFSET,     R_V850_CALLT_16_16_OFFSET     },
1317   { BFD_RELOC_VTABLE_INHERIT,              R_V850_GNU_VTINHERIT          },
1318   { BFD_RELOC_VTABLE_ENTRY,                R_V850_GNU_VTENTRY            },
1319   { BFD_RELOC_V850_LONGCALL,               R_V850_LONGCALL               },
1320   { BFD_RELOC_V850_LONGJUMP,               R_V850_LONGJUMP               },
1321   { BFD_RELOC_V850_ALIGN,                  R_V850_ALIGN                  },
1322
1323 };
1324 \f
1325 /* Map a bfd relocation into the appropriate howto structure.  */
1326
1327 static reloc_howto_type *
1328 v850_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1329                             bfd_reloc_code_real_type code)
1330 {
1331   unsigned int i;
1332
1333   for (i = ARRAY_SIZE (v850_elf_reloc_map); i --;)
1334     if (v850_elf_reloc_map[i].bfd_reloc_val == code)
1335       {
1336         unsigned int elf_reloc_val = v850_elf_reloc_map[i].elf_reloc_val;
1337
1338         BFD_ASSERT (v850_elf_howto_table[elf_reloc_val].type == elf_reloc_val);
1339
1340         return v850_elf_howto_table + elf_reloc_val;
1341       }
1342
1343   return NULL;
1344 }
1345
1346 static reloc_howto_type *
1347 v850_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1348                             const char *r_name)
1349 {
1350   unsigned int i;
1351
1352   for (i = 0;
1353        i < sizeof (v850_elf_howto_table) / sizeof (v850_elf_howto_table[0]);
1354        i++)
1355     if (v850_elf_howto_table[i].name != NULL
1356         && strcasecmp (v850_elf_howto_table[i].name, r_name) == 0)
1357       return &v850_elf_howto_table[i];
1358
1359   return NULL;
1360 }
1361 \f
1362 /* Set the howto pointer for an V850 ELF reloc.  */
1363
1364 static void
1365 v850_elf_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
1366                             arelent *cache_ptr,
1367                             Elf_Internal_Rela *dst)
1368 {
1369   unsigned int r_type;
1370
1371   r_type = ELF32_R_TYPE (dst->r_info);
1372   BFD_ASSERT (r_type < (unsigned int) R_V850_max);
1373   cache_ptr->howto = &v850_elf_howto_table[r_type];
1374 }
1375
1376 /* Set the howto pointer for a V850 ELF reloc (type RELA).  */
1377
1378 static void
1379 v850_elf_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
1380                              arelent * cache_ptr,
1381                              Elf_Internal_Rela *dst)
1382 {
1383   unsigned int r_type;
1384
1385   r_type = ELF32_R_TYPE (dst->r_info);
1386   BFD_ASSERT (r_type < (unsigned int) R_V850_max);
1387   cache_ptr->howto = &v850_elf_howto_table[r_type];
1388 }
1389 \f
1390 static bfd_boolean
1391 v850_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
1392 {
1393   return (   (name[0] == '.' && (name[1] == 'L' || name[1] == '.'))
1394           || (name[0] == '_' &&  name[1] == '.' && name[2] == 'L' && name[3] == '_'));
1395 }
1396 \f
1397 /* We overload some of the bfd_reloc error codes for own purposes.  */
1398 #define bfd_reloc_gp_not_found          bfd_reloc_other
1399 #define bfd_reloc_ep_not_found          bfd_reloc_continue
1400 #define bfd_reloc_ctbp_not_found        (bfd_reloc_dangerous + 1)
1401
1402 /* Perform a relocation as part of a final link.  */
1403
1404 static bfd_reloc_status_type
1405 v850_elf_final_link_relocate (reloc_howto_type *howto,
1406                               bfd *input_bfd,
1407                               bfd *output_bfd ATTRIBUTE_UNUSED,
1408                               asection *input_section,
1409                               bfd_byte *contents,
1410                               bfd_vma offset,
1411                               bfd_vma value,
1412                               bfd_vma addend,
1413                               struct bfd_link_info *info,
1414                               asection *sym_sec,
1415                               int is_local ATTRIBUTE_UNUSED)
1416 {
1417   unsigned int r_type = howto->type;
1418   bfd_byte *hit_data = contents + offset;
1419
1420   /* Adjust the value according to the relocation.  */
1421   switch (r_type)
1422     {
1423     case R_V850_9_PCREL:
1424       value -= (input_section->output_section->vma
1425                 + input_section->output_offset);
1426       value -= offset;
1427       break;
1428
1429     case R_V850_22_PCREL:
1430       value -= (input_section->output_section->vma
1431                 + input_section->output_offset
1432                 + offset);
1433
1434       /* If the sign extension will corrupt the value then we have overflowed.  */
1435       if (((value & 0xff000000) != 0x0) && ((value & 0xff000000) != 0xff000000))
1436         return bfd_reloc_overflow;
1437
1438       /* Only the bottom 24 bits of the PC are valid.  */
1439       value = SEXT24 (value);
1440       break;
1441
1442     case R_V850_REL32:
1443       value -= (input_section->output_section->vma
1444                 + input_section->output_offset
1445                 + offset);
1446       break;
1447
1448     case R_V850_HI16_S:
1449     case R_V850_HI16:
1450     case R_V850_LO16:
1451     case R_V850_LO16_SPLIT_OFFSET:
1452     case R_V850_16:
1453     case R_V850_ABS32:
1454     case R_V850_8:
1455       break;
1456
1457     case R_V850_ZDA_15_16_OFFSET:
1458     case R_V850_ZDA_16_16_OFFSET:
1459     case R_V850_ZDA_16_16_SPLIT_OFFSET:
1460       if (sym_sec == NULL)
1461         return bfd_reloc_undefined;
1462
1463       value -= sym_sec->output_section->vma;
1464       break;
1465
1466     case R_V850_SDA_15_16_OFFSET:
1467     case R_V850_SDA_16_16_OFFSET:
1468     case R_V850_SDA_16_16_SPLIT_OFFSET:
1469       {
1470         unsigned long                gp;
1471         struct bfd_link_hash_entry * h;
1472
1473         if (sym_sec == NULL)
1474           return bfd_reloc_undefined;
1475
1476         /* Get the value of __gp.  */
1477         h = bfd_link_hash_lookup (info->hash, "__gp", FALSE, FALSE, TRUE);
1478         if (h == NULL
1479             || h->type != bfd_link_hash_defined)
1480           return bfd_reloc_gp_not_found;
1481
1482         gp = (h->u.def.value
1483               + h->u.def.section->output_section->vma
1484               + h->u.def.section->output_offset);
1485
1486         value -= sym_sec->output_section->vma;
1487         value -= (gp - sym_sec->output_section->vma);
1488       }
1489     break;
1490
1491     case R_V850_TDA_4_4_OFFSET:
1492     case R_V850_TDA_4_5_OFFSET:
1493     case R_V850_TDA_16_16_OFFSET:
1494     case R_V850_TDA_7_7_OFFSET:
1495     case R_V850_TDA_7_8_OFFSET:
1496     case R_V850_TDA_6_8_OFFSET:
1497       {
1498         unsigned long                ep;
1499         struct bfd_link_hash_entry * h;
1500
1501         /* Get the value of __ep.  */
1502         h = bfd_link_hash_lookup (info->hash, "__ep", FALSE, FALSE, TRUE);
1503         if (h == NULL
1504             || h->type != bfd_link_hash_defined)
1505           return bfd_reloc_ep_not_found;
1506
1507         ep = (h->u.def.value
1508               + h->u.def.section->output_section->vma
1509               + h->u.def.section->output_offset);
1510
1511         value -= ep;
1512       }
1513     break;
1514
1515     case R_V850_CALLT_6_7_OFFSET:
1516       {
1517         unsigned long                ctbp;
1518         struct bfd_link_hash_entry * h;
1519
1520         /* Get the value of __ctbp.  */
1521         h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
1522         if (h == NULL
1523             || h->type != bfd_link_hash_defined)
1524           return bfd_reloc_ctbp_not_found;
1525
1526         ctbp = (h->u.def.value
1527               + h->u.def.section->output_section->vma
1528               + h->u.def.section->output_offset);
1529         value -= ctbp;
1530       }
1531     break;
1532
1533     case R_V850_CALLT_16_16_OFFSET:
1534       {
1535         unsigned long                ctbp;
1536         struct bfd_link_hash_entry * h;
1537
1538         if (sym_sec == NULL)
1539           return bfd_reloc_undefined;
1540
1541         /* Get the value of __ctbp.  */
1542         h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
1543         if (h == NULL
1544             || h->type != bfd_link_hash_defined)
1545           return bfd_reloc_ctbp_not_found;
1546
1547         ctbp = (h->u.def.value
1548               + h->u.def.section->output_section->vma
1549               + h->u.def.section->output_offset);
1550
1551         value -= sym_sec->output_section->vma;
1552         value -= (ctbp - sym_sec->output_section->vma);
1553       }
1554     break;
1555
1556     case R_V850_NONE:
1557     case R_V850_GNU_VTINHERIT:
1558     case R_V850_GNU_VTENTRY:
1559     case R_V850_LONGCALL:
1560     case R_V850_LONGJUMP:
1561     case R_V850_ALIGN:
1562       return bfd_reloc_ok;
1563
1564     default:
1565       return bfd_reloc_notsupported;
1566     }
1567
1568   /* Perform the relocation.  */
1569   return v850_elf_perform_relocation (input_bfd, r_type, value + addend, hit_data);
1570 }
1571 \f
1572 /* Relocate an V850 ELF section.  */
1573
1574 static bfd_boolean
1575 v850_elf_relocate_section (bfd *output_bfd,
1576                            struct bfd_link_info *info,
1577                            bfd *input_bfd,
1578                            asection *input_section,
1579                            bfd_byte *contents,
1580                            Elf_Internal_Rela *relocs,
1581                            Elf_Internal_Sym *local_syms,
1582                            asection **local_sections)
1583 {
1584   Elf_Internal_Shdr *symtab_hdr;
1585   struct elf_link_hash_entry **sym_hashes;
1586   Elf_Internal_Rela *rel;
1587   Elf_Internal_Rela *relend;
1588
1589   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1590   sym_hashes = elf_sym_hashes (input_bfd);
1591
1592   /* Reset the list of remembered HI16S relocs to empty.  */
1593   free_hi16s     = previous_hi16s;
1594   previous_hi16s = NULL;
1595   hi16s_counter  = 0;
1596
1597   rel    = relocs;
1598   relend = relocs + input_section->reloc_count;
1599   for (; rel < relend; rel++)
1600     {
1601       int r_type;
1602       reloc_howto_type *howto;
1603       unsigned long r_symndx;
1604       Elf_Internal_Sym *sym;
1605       asection *sec;
1606       struct elf_link_hash_entry *h;
1607       bfd_vma relocation;
1608       bfd_reloc_status_type r;
1609
1610       r_symndx = ELF32_R_SYM (rel->r_info);
1611       r_type   = ELF32_R_TYPE (rel->r_info);
1612
1613       if (r_type == R_V850_GNU_VTENTRY
1614           || r_type == R_V850_GNU_VTINHERIT)
1615         continue;
1616
1617       howto = v850_elf_howto_table + r_type;
1618       h = NULL;
1619       sym = NULL;
1620       sec = NULL;
1621       if (r_symndx < symtab_hdr->sh_info)
1622         {
1623           sym = local_syms + r_symndx;
1624           sec = local_sections[r_symndx];
1625           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1626         }
1627       else
1628         {
1629           bfd_boolean unresolved_reloc, warned;
1630
1631           /* Note - this check is delayed until now as it is possible and
1632              valid to have a file without any symbols but with relocs that
1633              can be processed.  */
1634           if (sym_hashes == NULL)
1635             {
1636               info->callbacks->warning
1637                 (info, "no hash table available",
1638                  NULL, input_bfd, input_section, (bfd_vma) 0);
1639
1640               return FALSE;
1641             }
1642
1643           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1644                                    r_symndx, symtab_hdr, sym_hashes,
1645                                    h, sec, relocation,
1646                                    unresolved_reloc, warned);
1647         }
1648
1649       if (sec != NULL && elf_discarded_section (sec))
1650         {
1651           /* For relocs against symbols from removed linkonce sections,
1652              or sections discarded by a linker script, we just want the
1653              section contents zeroed.  Avoid any special processing.  */
1654           _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
1655           rel->r_info = 0;
1656           rel->r_addend = 0;
1657           continue;
1658         }
1659
1660       if (info->relocatable)
1661         continue;
1662
1663       /* FIXME: We should use the addend, but the COFF relocations don't.  */
1664       r = v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
1665                                         input_section,
1666                                         contents, rel->r_offset,
1667                                         relocation, rel->r_addend,
1668                                         info, sec, h == NULL);
1669
1670       if (r != bfd_reloc_ok)
1671         {
1672           const char * name;
1673           const char * msg = NULL;
1674
1675           if (h != NULL)
1676             name = h->root.root.string;
1677           else
1678             {
1679               name = (bfd_elf_string_from_elf_section
1680                       (input_bfd, symtab_hdr->sh_link, sym->st_name));
1681               if (name == NULL || *name == '\0')
1682                 name = bfd_section_name (input_bfd, sec);
1683             }
1684
1685           switch (r)
1686             {
1687             case bfd_reloc_overflow:
1688               if (! ((*info->callbacks->reloc_overflow)
1689                      (info, (h ? &h->root : NULL), name, howto->name,
1690                       (bfd_vma) 0, input_bfd, input_section,
1691                       rel->r_offset)))
1692                 return FALSE;
1693               break;
1694
1695             case bfd_reloc_undefined:
1696               if (! ((*info->callbacks->undefined_symbol)
1697                      (info, name, input_bfd, input_section,
1698                       rel->r_offset, TRUE)))
1699                 return FALSE;
1700               break;
1701
1702             case bfd_reloc_outofrange:
1703               msg = _("internal error: out of range error");
1704               goto common_error;
1705
1706             case bfd_reloc_notsupported:
1707               msg = _("internal error: unsupported relocation error");
1708               goto common_error;
1709
1710             case bfd_reloc_dangerous:
1711               msg = _("internal error: dangerous relocation");
1712               goto common_error;
1713
1714             case bfd_reloc_gp_not_found:
1715               msg = _("could not locate special linker symbol __gp");
1716               goto common_error;
1717
1718             case bfd_reloc_ep_not_found:
1719               msg = _("could not locate special linker symbol __ep");
1720               goto common_error;
1721
1722             case bfd_reloc_ctbp_not_found:
1723               msg = _("could not locate special linker symbol __ctbp");
1724               goto common_error;
1725
1726             default:
1727               msg = _("internal error: unknown error");
1728               /* fall through */
1729
1730             common_error:
1731               if (!((*info->callbacks->warning)
1732                     (info, msg, name, input_bfd, input_section,
1733                      rel->r_offset)))
1734                 return FALSE;
1735               break;
1736             }
1737         }
1738     }
1739
1740   return TRUE;
1741 }
1742
1743 static asection *
1744 v850_elf_gc_mark_hook (asection *sec,
1745                        struct bfd_link_info *info,
1746                        Elf_Internal_Rela *rel,
1747                        struct elf_link_hash_entry *h,
1748                        Elf_Internal_Sym *sym)
1749 {
1750   if (h != NULL)
1751     switch (ELF32_R_TYPE (rel->r_info))
1752       {
1753       case R_V850_GNU_VTINHERIT:
1754       case R_V850_GNU_VTENTRY:
1755         return NULL;
1756       }
1757
1758   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1759 }
1760
1761 /* Set the right machine number.  */
1762
1763 static bfd_boolean
1764 v850_elf_object_p (bfd *abfd)
1765 {
1766   switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1767     {
1768     default:
1769     case E_V850_ARCH:
1770       bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850);
1771       break;
1772     case E_V850E_ARCH:
1773       bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e);
1774       break;
1775     case E_V850E1_ARCH:
1776       bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e1);
1777       break;
1778     }
1779   return TRUE;
1780 }
1781
1782 /* Store the machine number in the flags field.  */
1783
1784 static void
1785 v850_elf_final_write_processing (bfd *abfd,
1786                                  bfd_boolean linker ATTRIBUTE_UNUSED)
1787 {
1788   unsigned long val;
1789
1790   switch (bfd_get_mach (abfd))
1791     {
1792     default:
1793     case bfd_mach_v850:   val = E_V850_ARCH; break;
1794     case bfd_mach_v850e:  val = E_V850E_ARCH; break;
1795     case bfd_mach_v850e1: val = E_V850E1_ARCH; break;
1796     }
1797
1798   elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
1799   elf_elfheader (abfd)->e_flags |= val;
1800 }
1801
1802 /* Function to keep V850 specific file flags.  */
1803
1804 static bfd_boolean
1805 v850_elf_set_private_flags (bfd *abfd, flagword flags)
1806 {
1807   BFD_ASSERT (!elf_flags_init (abfd)
1808               || elf_elfheader (abfd)->e_flags == flags);
1809
1810   elf_elfheader (abfd)->e_flags = flags;
1811   elf_flags_init (abfd) = TRUE;
1812   return TRUE;
1813 }
1814
1815 /* Merge backend specific data from an object file
1816    to the output object file when linking.  */
1817
1818 static bfd_boolean
1819 v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
1820 {
1821   flagword out_flags;
1822   flagword in_flags;
1823
1824   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1825       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1826     return TRUE;
1827
1828   in_flags = elf_elfheader (ibfd)->e_flags;
1829   out_flags = elf_elfheader (obfd)->e_flags;
1830
1831   if (! elf_flags_init (obfd))
1832     {
1833       /* If the input is the default architecture then do not
1834          bother setting the flags for the output architecture,
1835          instead allow future merges to do this.  If no future
1836          merges ever set these flags then they will retain their
1837          unitialised values, which surprise surprise, correspond
1838          to the default values.  */
1839       if (bfd_get_arch_info (ibfd)->the_default)
1840         return TRUE;
1841
1842       elf_flags_init (obfd) = TRUE;
1843       elf_elfheader (obfd)->e_flags = in_flags;
1844
1845       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
1846           && bfd_get_arch_info (obfd)->the_default)
1847         return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
1848
1849       return TRUE;
1850     }
1851
1852   /* Check flag compatibility.  */
1853   if (in_flags == out_flags)
1854     return TRUE;
1855
1856   if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
1857       && (in_flags & EF_V850_ARCH) != E_V850_ARCH)
1858     {
1859       /* Allow v850e1 binaries to be linked with v850e binaries.
1860          Set the output binary to v850e.  */
1861       if ((in_flags & EF_V850_ARCH) == E_V850E1_ARCH
1862           && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
1863         return TRUE;
1864
1865       if ((in_flags & EF_V850_ARCH) == E_V850E_ARCH
1866           && (out_flags & EF_V850_ARCH) == E_V850E1_ARCH)
1867         {
1868           elf_elfheader (obfd)->e_flags =
1869             ((out_flags & ~ EF_V850_ARCH) | E_V850E_ARCH);
1870           return TRUE;
1871         }
1872
1873       _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
1874                           ibfd);
1875     }
1876
1877   return TRUE;
1878 }
1879
1880 /* Display the flags field.  */
1881
1882 static bfd_boolean
1883 v850_elf_print_private_bfd_data (bfd *abfd, void * ptr)
1884 {
1885   FILE * file = (FILE *) ptr;
1886
1887   BFD_ASSERT (abfd != NULL && ptr != NULL);
1888
1889   _bfd_elf_print_private_bfd_data (abfd, ptr);
1890
1891   /* xgettext:c-format */
1892   fprintf (file, _("private flags = %lx: "), elf_elfheader (abfd)->e_flags);
1893
1894   switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1895     {
1896     default:
1897     case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
1898     case E_V850E_ARCH: fprintf (file, _("v850e architecture")); break;
1899     case E_V850E1_ARCH: fprintf (file, _("v850e1 architecture")); break;
1900     }
1901
1902   fputc ('\n', file);
1903
1904   return TRUE;
1905 }
1906
1907 /* V850 ELF uses four common sections.  One is the usual one, and the
1908    others are for (small) objects in one of the special data areas:
1909    small, tiny and zero.  All the objects are kept together, and then
1910    referenced via the gp register, the ep register or the r0 register
1911    respectively, which yields smaller, faster assembler code.  This
1912    approach is copied from elf32-mips.c.  */
1913
1914 static asection  v850_elf_scom_section;
1915 static asymbol   v850_elf_scom_symbol;
1916 static asymbol * v850_elf_scom_symbol_ptr;
1917 static asection  v850_elf_tcom_section;
1918 static asymbol   v850_elf_tcom_symbol;
1919 static asymbol * v850_elf_tcom_symbol_ptr;
1920 static asection  v850_elf_zcom_section;
1921 static asymbol   v850_elf_zcom_symbol;
1922 static asymbol * v850_elf_zcom_symbol_ptr;
1923
1924 /* Given a BFD section, try to locate the
1925    corresponding ELF section index.  */
1926
1927 static bfd_boolean
1928 v850_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
1929                                    asection *sec,
1930                                    int *retval)
1931 {
1932   if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
1933     *retval = SHN_V850_SCOMMON;
1934   else if (strcmp (bfd_get_section_name (abfd, sec), ".tcommon") == 0)
1935     *retval = SHN_V850_TCOMMON;
1936   else if (strcmp (bfd_get_section_name (abfd, sec), ".zcommon") == 0)
1937     *retval = SHN_V850_ZCOMMON;
1938   else
1939     return FALSE;
1940
1941   return TRUE;
1942 }
1943
1944 /* Handle the special V850 section numbers that a symbol may use.  */
1945
1946 static void
1947 v850_elf_symbol_processing (bfd *abfd, asymbol *asym)
1948 {
1949   elf_symbol_type * elfsym = (elf_symbol_type *) asym;
1950   unsigned int indx;
1951
1952   indx = elfsym->internal_elf_sym.st_shndx;
1953
1954   /* If the section index is an "ordinary" index, then it may
1955      refer to a v850 specific section created by the assembler.
1956      Check the section's type and change the index it matches.
1957
1958      FIXME: Should we alter the st_shndx field as well ?  */
1959
1960   if (indx < elf_numsections (abfd))
1961     switch (elf_elfsections(abfd)[indx]->sh_type)
1962       {
1963       case SHT_V850_SCOMMON:
1964         indx = SHN_V850_SCOMMON;
1965         break;
1966
1967       case SHT_V850_TCOMMON:
1968         indx = SHN_V850_TCOMMON;
1969         break;
1970
1971       case SHT_V850_ZCOMMON:
1972         indx = SHN_V850_ZCOMMON;
1973         break;
1974
1975       default:
1976         break;
1977       }
1978
1979   switch (indx)
1980     {
1981     case SHN_V850_SCOMMON:
1982       if (v850_elf_scom_section.name == NULL)
1983         {
1984           /* Initialize the small common section.  */
1985           v850_elf_scom_section.name           = ".scommon";
1986           v850_elf_scom_section.flags          = SEC_IS_COMMON | SEC_ALLOC | SEC_DATA;
1987           v850_elf_scom_section.output_section = & v850_elf_scom_section;
1988           v850_elf_scom_section.symbol         = & v850_elf_scom_symbol;
1989           v850_elf_scom_section.symbol_ptr_ptr = & v850_elf_scom_symbol_ptr;
1990           v850_elf_scom_symbol.name            = ".scommon";
1991           v850_elf_scom_symbol.flags           = BSF_SECTION_SYM;
1992           v850_elf_scom_symbol.section         = & v850_elf_scom_section;
1993           v850_elf_scom_symbol_ptr             = & v850_elf_scom_symbol;
1994         }
1995       asym->section = & v850_elf_scom_section;
1996       asym->value = elfsym->internal_elf_sym.st_size;
1997       break;
1998
1999     case SHN_V850_TCOMMON:
2000       if (v850_elf_tcom_section.name == NULL)
2001         {
2002           /* Initialize the tcommon section.  */
2003           v850_elf_tcom_section.name           = ".tcommon";
2004           v850_elf_tcom_section.flags          = SEC_IS_COMMON;
2005           v850_elf_tcom_section.output_section = & v850_elf_tcom_section;
2006           v850_elf_tcom_section.symbol         = & v850_elf_tcom_symbol;
2007           v850_elf_tcom_section.symbol_ptr_ptr = & v850_elf_tcom_symbol_ptr;
2008           v850_elf_tcom_symbol.name            = ".tcommon";
2009           v850_elf_tcom_symbol.flags           = BSF_SECTION_SYM;
2010           v850_elf_tcom_symbol.section         = & v850_elf_tcom_section;
2011           v850_elf_tcom_symbol_ptr             = & v850_elf_tcom_symbol;
2012         }
2013       asym->section = & v850_elf_tcom_section;
2014       asym->value = elfsym->internal_elf_sym.st_size;
2015       break;
2016
2017     case SHN_V850_ZCOMMON:
2018       if (v850_elf_zcom_section.name == NULL)
2019         {
2020           /* Initialize the zcommon section.  */
2021           v850_elf_zcom_section.name           = ".zcommon";
2022           v850_elf_zcom_section.flags          = SEC_IS_COMMON;
2023           v850_elf_zcom_section.output_section = & v850_elf_zcom_section;
2024           v850_elf_zcom_section.symbol         = & v850_elf_zcom_symbol;
2025           v850_elf_zcom_section.symbol_ptr_ptr = & v850_elf_zcom_symbol_ptr;
2026           v850_elf_zcom_symbol.name            = ".zcommon";
2027           v850_elf_zcom_symbol.flags           = BSF_SECTION_SYM;
2028           v850_elf_zcom_symbol.section         = & v850_elf_zcom_section;
2029           v850_elf_zcom_symbol_ptr             = & v850_elf_zcom_symbol;
2030         }
2031       asym->section = & v850_elf_zcom_section;
2032       asym->value = elfsym->internal_elf_sym.st_size;
2033       break;
2034     }
2035 }
2036
2037 /* Hook called by the linker routine which adds symbols from an object
2038    file.  We must handle the special v850 section numbers here.  */
2039
2040 static bfd_boolean
2041 v850_elf_add_symbol_hook (bfd *abfd,
2042                           struct bfd_link_info *info ATTRIBUTE_UNUSED,
2043                           Elf_Internal_Sym *sym,
2044                           const char **namep ATTRIBUTE_UNUSED,
2045                           flagword *flagsp ATTRIBUTE_UNUSED,
2046                           asection **secp,
2047                           bfd_vma *valp)
2048 {
2049   unsigned int indx = sym->st_shndx;
2050
2051   /* If the section index is an "ordinary" index, then it may
2052      refer to a v850 specific section created by the assembler.
2053      Check the section's type and change the index it matches.
2054
2055      FIXME: Should we alter the st_shndx field as well ?  */
2056
2057   if (indx < elf_numsections (abfd))
2058     switch (elf_elfsections(abfd)[indx]->sh_type)
2059       {
2060       case SHT_V850_SCOMMON:
2061         indx = SHN_V850_SCOMMON;
2062         break;
2063
2064       case SHT_V850_TCOMMON:
2065         indx = SHN_V850_TCOMMON;
2066         break;
2067
2068       case SHT_V850_ZCOMMON:
2069         indx = SHN_V850_ZCOMMON;
2070         break;
2071
2072       default:
2073         break;
2074       }
2075
2076   switch (indx)
2077     {
2078     case SHN_V850_SCOMMON:
2079       *secp = bfd_make_section_old_way (abfd, ".scommon");
2080       (*secp)->flags |= SEC_IS_COMMON;
2081       *valp = sym->st_size;
2082       break;
2083
2084     case SHN_V850_TCOMMON:
2085       *secp = bfd_make_section_old_way (abfd, ".tcommon");
2086       (*secp)->flags |= SEC_IS_COMMON;
2087       *valp = sym->st_size;
2088       break;
2089
2090     case SHN_V850_ZCOMMON:
2091       *secp = bfd_make_section_old_way (abfd, ".zcommon");
2092       (*secp)->flags |= SEC_IS_COMMON;
2093       *valp = sym->st_size;
2094       break;
2095     }
2096
2097   return TRUE;
2098 }
2099
2100 static bfd_boolean
2101 v850_elf_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
2102                                   const char *name ATTRIBUTE_UNUSED,
2103                                   Elf_Internal_Sym *sym,
2104                                   asection *input_sec,
2105                                   struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
2106 {
2107   /* If we see a common symbol, which implies a relocatable link, then
2108      if a symbol was in a special common section in an input file, mark
2109      it as a special common in the output file.  */
2110
2111   if (sym->st_shndx == SHN_COMMON)
2112     {
2113       if (strcmp (input_sec->name, ".scommon") == 0)
2114         sym->st_shndx = SHN_V850_SCOMMON;
2115       else if (strcmp (input_sec->name, ".tcommon") == 0)
2116         sym->st_shndx = SHN_V850_TCOMMON;
2117       else if (strcmp (input_sec->name, ".zcommon") == 0)
2118         sym->st_shndx = SHN_V850_ZCOMMON;
2119     }
2120
2121   /* The price we pay for using h->other unused bits as flags in the
2122      linker is cleaning up after ourselves.  */
2123
2124   sym->st_other &= ~(V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA
2125                      | V850_OTHER_ERROR);
2126
2127   return TRUE;
2128 }
2129
2130 static bfd_boolean
2131 v850_elf_section_from_shdr (bfd *abfd,
2132                             Elf_Internal_Shdr *hdr,
2133                             const char *name,
2134                             int shindex)
2135 {
2136   /* There ought to be a place to keep ELF backend specific flags, but
2137      at the moment there isn't one.  We just keep track of the
2138      sections by their name, instead.  */
2139
2140   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
2141     return FALSE;
2142
2143   switch (hdr->sh_type)
2144     {
2145     case SHT_V850_SCOMMON:
2146     case SHT_V850_TCOMMON:
2147     case SHT_V850_ZCOMMON:
2148       if (! bfd_set_section_flags (abfd, hdr->bfd_section,
2149                                    (bfd_get_section_flags (abfd,
2150                                                            hdr->bfd_section)
2151                                     | SEC_IS_COMMON)))
2152         return FALSE;
2153     }
2154
2155   return TRUE;
2156 }
2157
2158 /* Set the correct type for a V850 ELF section.  We do this
2159    by the section name, which is a hack, but ought to work.  */
2160
2161 static bfd_boolean
2162 v850_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
2163                         Elf_Internal_Shdr *hdr,
2164                         asection *sec)
2165 {
2166   const char * name;
2167
2168   name = bfd_get_section_name (abfd, sec);
2169
2170   if (strcmp (name, ".scommon") == 0)
2171     hdr->sh_type = SHT_V850_SCOMMON;
2172   else if (strcmp (name, ".tcommon") == 0)
2173     hdr->sh_type = SHT_V850_TCOMMON;
2174   else if (strcmp (name, ".zcommon") == 0)
2175     hdr->sh_type = SHT_V850_ZCOMMON;
2176
2177   return TRUE;
2178 }
2179
2180 /* Delete some bytes from a section while relaxing.  */
2181
2182 static bfd_boolean
2183 v850_elf_relax_delete_bytes (bfd *abfd,
2184                              asection *sec,
2185                              bfd_vma addr,
2186                              bfd_vma toaddr,
2187                              int count)
2188 {
2189   Elf_Internal_Shdr *symtab_hdr;
2190   Elf32_External_Sym *extsyms;
2191   Elf32_External_Sym *esym;
2192   Elf32_External_Sym *esymend;
2193   int index;
2194   unsigned int sec_shndx;
2195   bfd_byte *contents;
2196   Elf_Internal_Rela *irel;
2197   Elf_Internal_Rela *irelend;
2198   struct elf_link_hash_entry *sym_hash;
2199   Elf_Internal_Shdr *shndx_hdr;
2200   Elf_External_Sym_Shndx *shndx;
2201
2202   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2203   extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
2204
2205   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2206
2207   contents = elf_section_data (sec)->this_hdr.contents;
2208
2209   /* The deletion must stop at the next ALIGN reloc for an alignment
2210      power larger than the number of bytes we are deleting.  */
2211
2212   /* Actually delete the bytes.  */
2213 #if (DEBUG_RELAX & 2)
2214   fprintf (stderr, "relax_delete: contents: sec: %s  %p .. %p %x\n",
2215            sec->name, addr, toaddr, count );
2216 #endif
2217   memmove (contents + addr, contents + addr + count,
2218            toaddr - addr - count);
2219   memset (contents + toaddr-count, 0, count);
2220
2221   /* Adjust all the relocs.  */
2222   irel = elf_section_data (sec)->relocs;
2223   irelend = irel + sec->reloc_count;
2224   shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
2225   shndx = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
2226
2227   for (; irel < irelend; irel++)
2228     {
2229       bfd_vma raddr, paddr, symval;
2230       Elf_Internal_Sym isym;
2231
2232       /* Get the new reloc address.  */
2233       raddr = irel->r_offset;
2234       if ((raddr >= (addr + count) && raddr < toaddr))
2235         irel->r_offset -= count;
2236
2237       if (raddr >= addr && raddr < addr + count)
2238         {
2239           irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2240                                        (int) R_V850_NONE);
2241           continue;
2242         }
2243
2244       if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN)
2245         continue;
2246
2247       bfd_elf32_swap_symbol_in (abfd,
2248                                 extsyms + ELF32_R_SYM (irel->r_info),
2249                                 shndx ? shndx + ELF32_R_SYM (irel->r_info) : NULL,
2250                                 & isym);
2251
2252       if (isym.st_shndx != sec_shndx)
2253         continue;
2254
2255       /* Get the value of the symbol referred to by the reloc.  */
2256       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
2257         {
2258           symval = isym.st_value;
2259 #if (DEBUG_RELAX & 2)
2260           {
2261             char * name = bfd_elf_string_from_elf_section
2262                            (abfd, symtab_hdr->sh_link, isym.st_name);
2263             fprintf (stderr,
2264                "relax_delete: local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
2265                sec->name, name, isym.st_name,
2266                sec->output_section->vma, sec->output_offset,
2267                isym.st_value, irel->r_addend);
2268           }
2269 #endif
2270         }
2271       else
2272         {
2273           unsigned long indx;
2274           struct elf_link_hash_entry * h;
2275
2276           /* An external symbol.  */
2277           indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2278
2279           h = elf_sym_hashes (abfd) [indx];
2280           BFD_ASSERT (h != NULL);
2281
2282           symval = h->root.u.def.value;
2283 #if (DEBUG_RELAX & 2)
2284           fprintf (stderr,
2285                    "relax_delete: defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
2286                    sec->name, h->root.root.string, h->root.u.def.value,
2287                    sec->output_section->vma, sec->output_offset, irel->r_addend);
2288 #endif
2289         }
2290
2291       paddr = symval + irel->r_addend;
2292
2293       if ( (symval >= addr + count && symval < toaddr)
2294           && (paddr < addr + count || paddr >= toaddr))
2295         irel->r_addend += count;
2296       else if (    (symval < addr + count || symval >= toaddr)
2297                 && (paddr >= addr + count && paddr < toaddr))
2298         irel->r_addend -= count;
2299     }
2300
2301   /* Adjust the local symbols defined in this section.  */
2302   esym = extsyms;
2303   esymend = esym + symtab_hdr->sh_info;
2304
2305   for (; esym < esymend; esym++, shndx = (shndx ? shndx + 1 : NULL))
2306     {
2307       Elf_Internal_Sym isym;
2308
2309       bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
2310
2311       if (isym.st_shndx == sec_shndx
2312           && isym.st_value >= addr + count
2313           && isym.st_value < toaddr)
2314         {
2315           isym.st_value -= count;
2316
2317           if (isym.st_value + isym.st_size >= toaddr)
2318             isym.st_size += count;
2319
2320           bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2321         }
2322       else if (isym.st_shndx == sec_shndx
2323                && isym.st_value < addr + count)
2324         {
2325           if (isym.st_value+isym.st_size >= addr + count
2326               && isym.st_value+isym.st_size < toaddr)
2327             isym.st_size -= count;
2328
2329           if (isym.st_value >= addr
2330               && isym.st_value <  addr + count)
2331             isym.st_value = addr;
2332
2333           bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2334         }
2335     }
2336
2337   /* Now adjust the global symbols defined in this section.  */
2338   esym = extsyms + symtab_hdr->sh_info;
2339   esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
2340
2341   for (index = 0; esym < esymend; esym ++, index ++)
2342     {
2343       Elf_Internal_Sym isym;
2344
2345       bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
2346       sym_hash = elf_sym_hashes (abfd) [index];
2347
2348       if (isym.st_shndx == sec_shndx
2349           && ((sym_hash)->root.type == bfd_link_hash_defined
2350               || (sym_hash)->root.type == bfd_link_hash_defweak)
2351           && (sym_hash)->root.u.def.section == sec
2352           && (sym_hash)->root.u.def.value >= addr + count
2353           && (sym_hash)->root.u.def.value < toaddr)
2354         {
2355           if ((sym_hash)->root.u.def.value + isym.st_size >= toaddr)
2356             {
2357               isym.st_size += count;
2358               bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2359             }
2360
2361           (sym_hash)->root.u.def.value -= count;
2362         }
2363       else if (isym.st_shndx == sec_shndx
2364                && ((sym_hash)->root.type == bfd_link_hash_defined
2365                    || (sym_hash)->root.type == bfd_link_hash_defweak)
2366                && (sym_hash)->root.u.def.section == sec
2367                && (sym_hash)->root.u.def.value < addr + count)
2368         {
2369           if ((sym_hash)->root.u.def.value+isym.st_size >= addr + count
2370               && (sym_hash)->root.u.def.value+isym.st_size < toaddr)
2371             isym.st_size -= count;
2372
2373           if ((sym_hash)->root.u.def.value >= addr
2374               && (sym_hash)->root.u.def.value < addr + count)
2375             (sym_hash)->root.u.def.value = addr;
2376
2377           bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2378         }
2379
2380       if (shndx)
2381         ++ shndx;
2382     }
2383
2384   return TRUE;
2385 }
2386
2387 #define NOP_OPCODE      (0x0000)
2388 #define MOVHI           0x0640                          /* 4byte */
2389 #define MOVHI_MASK      0x07e0
2390 #define MOVHI_R1(insn)  ((insn) & 0x1f)                 /* 4byte */
2391 #define MOVHI_R2(insn)  ((insn) >> 11)
2392 #define MOVEA           0x0620                          /* 2byte */
2393 #define MOVEA_MASK      0x07e0
2394 #define MOVEA_R1(insn)  ((insn) & 0x1f)
2395 #define MOVEA_R2(insn)  ((insn) >> 11)
2396 #define JARL_4          0x00040780                              /* 4byte */
2397 #define JARL_4_MASK     0xFFFF07FF
2398 #define JARL_R2(insn)   (int)(((insn) & (~JARL_4_MASK)) >> 11)
2399 #define ADD_I           0x0240                                  /* 2byte */
2400 #define ADD_I_MASK      0x07e0
2401 #define ADD_I5(insn)    ((((insn) & 0x001f) << 11) >> 11)       /* 2byte */
2402 #define ADD_R2(insn)    ((insn) >> 11)
2403 #define JMP_R           0x0060                                  /* 2byte */
2404 #define JMP_R_MASK      0xFFE0
2405 #define JMP_R1(insn)    ((insn) & 0x1f)
2406
2407 static bfd_boolean
2408 v850_elf_relax_section (bfd *abfd,
2409                         asection *sec,
2410                         struct bfd_link_info *link_info,
2411                         bfd_boolean *again)
2412 {
2413   Elf_Internal_Shdr *symtab_hdr;
2414   Elf_Internal_Rela *internal_relocs;
2415   Elf_Internal_Rela *irel;
2416   Elf_Internal_Rela *irelend;
2417   Elf_Internal_Rela *irelalign = NULL;
2418   Elf_Internal_Sym *isymbuf = NULL;
2419   bfd_byte *contents = NULL;
2420   bfd_vma addr = 0;
2421   bfd_vma toaddr;
2422   int align_pad_size = 0;
2423   bfd_boolean result = TRUE;
2424
2425   *again = FALSE;
2426
2427   if (link_info->relocatable
2428       || (sec->flags & SEC_RELOC) == 0
2429       || sec->reloc_count == 0)
2430     return TRUE;
2431
2432   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
2433
2434   internal_relocs = (_bfd_elf_link_read_relocs
2435                      (abfd, sec, NULL, NULL, link_info->keep_memory));
2436   if (internal_relocs == NULL)
2437     goto error_return;
2438
2439   irelend = internal_relocs + sec->reloc_count;
2440
2441   while (addr < sec->size)
2442     {
2443       toaddr = sec->size;
2444
2445       for (irel = internal_relocs; irel < irelend; irel ++)
2446         if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
2447             && irel->r_offset > addr
2448             && irel->r_offset < toaddr)
2449           toaddr = irel->r_offset;
2450
2451 #ifdef DEBUG_RELAX
2452       fprintf (stderr, "relax region 0x%x to 0x%x align pad %d\n",
2453                addr, toaddr, align_pad_size);
2454 #endif
2455       if (irelalign)
2456         {
2457           bfd_vma alignto;
2458           bfd_vma alignmoveto;
2459
2460           alignmoveto = BFD_ALIGN (addr - align_pad_size, 1 << irelalign->r_addend);
2461           alignto = BFD_ALIGN (addr, 1 << irelalign->r_addend);
2462
2463           if (alignmoveto < alignto)
2464             {
2465               unsigned int i;
2466
2467               align_pad_size = alignto - alignmoveto;
2468 #ifdef DEBUG_RELAX
2469               fprintf (stderr, "relax move region 0x%x to 0x%x delete size 0x%x\n",
2470                        alignmoveto, toaddr, align_pad_size);
2471 #endif
2472               if (!v850_elf_relax_delete_bytes (abfd, sec, alignmoveto,
2473                                                 toaddr, align_pad_size))
2474                 goto error_return;
2475
2476               for (i  = BFD_ALIGN (toaddr - align_pad_size, 1);
2477                    (i + 1) < toaddr; i += 2)
2478                 bfd_put_16 (abfd, NOP_OPCODE, contents + i);
2479
2480               addr = alignmoveto;
2481             }
2482           else
2483             align_pad_size = 0;
2484         }
2485
2486       for (irel = internal_relocs; irel < irelend; irel++)
2487         {
2488           bfd_vma laddr;
2489           bfd_vma addend;
2490           bfd_vma symval;
2491           int insn[5];
2492           int no_match = -1;
2493           Elf_Internal_Rela *hi_irelfn;
2494           Elf_Internal_Rela *lo_irelfn;
2495           Elf_Internal_Rela *irelcall;
2496           bfd_signed_vma foff;
2497
2498           if (! (irel->r_offset >= addr && irel->r_offset < toaddr
2499                  && (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL
2500                      || ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)))
2501             continue;
2502
2503 #ifdef DEBUG_RELAX
2504           fprintf (stderr, "relax check r_info 0x%x r_offset 0x%x r_addend 0x%x\n",
2505                    irel->r_info,
2506                    irel->r_offset,
2507                    irel->r_addend );
2508 #endif
2509
2510           /* Get the section contents.  */
2511           if (contents == NULL)
2512             {
2513               if (elf_section_data (sec)->this_hdr.contents != NULL)
2514                 contents = elf_section_data (sec)->this_hdr.contents;
2515               else
2516                 {
2517                   if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2518                     goto error_return;
2519                 }
2520             }
2521
2522           /* Read this BFD's local symbols if we haven't done so already.  */
2523           if (isymbuf == NULL && symtab_hdr->sh_info != 0)
2524             {
2525               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2526               if (isymbuf == NULL)
2527                 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
2528                                                 symtab_hdr->sh_info, 0,
2529                                                 NULL, NULL, NULL);
2530               if (isymbuf == NULL)
2531                 goto error_return;
2532             }
2533
2534           laddr = irel->r_offset;
2535
2536           if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL)
2537             {
2538               /* Check code for -mlong-calls output. */
2539               if (laddr + 16 <= (bfd_vma) sec->size)
2540                 {
2541                   insn[0] = bfd_get_16 (abfd, contents + laddr);
2542                   insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
2543                   insn[2] = bfd_get_32 (abfd, contents + laddr + 8);
2544                   insn[3] = bfd_get_16 (abfd, contents + laddr + 12);
2545                   insn[4] = bfd_get_16 (abfd, contents + laddr + 14);
2546
2547                   if ((insn[0] & MOVHI_MASK) != MOVHI
2548                        || MOVHI_R1 (insn[0]) != 0)
2549                     no_match = 0;
2550
2551                   if (no_match < 0
2552                       && ((insn[1] & MOVEA_MASK) != MOVEA
2553                            || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
2554                     no_match = 1;
2555
2556                   if (no_match < 0
2557                       && (insn[2] & JARL_4_MASK) != JARL_4)
2558                     no_match = 2;
2559
2560                   if (no_match < 0
2561                       && ((insn[3] & ADD_I_MASK) != ADD_I
2562                            || ADD_I5 (insn[3]) != 4
2563                            || JARL_R2 (insn[2]) != ADD_R2 (insn[3])))
2564                     no_match = 3;
2565
2566                   if (no_match < 0
2567                       && ((insn[4] & JMP_R_MASK) != JMP_R
2568                            || MOVEA_R2 (insn[1]) != JMP_R1 (insn[4])))
2569                     no_match = 4;
2570                 }
2571               else
2572                 {
2573                   ((*_bfd_error_handler)
2574                    ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insns",
2575                     bfd_get_filename (abfd), (unsigned long) irel->r_offset));
2576
2577                   continue;
2578                 }
2579
2580               if (no_match >= 0)
2581                 {
2582                   ((*_bfd_error_handler)
2583                    ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insn 0x%x",
2584                     bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
2585
2586                   continue;
2587                 }
2588
2589               /* Get the reloc for the address from which the register is
2590                  being loaded.  This reloc will tell us which function is
2591                  actually being called.  */
2592               for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
2593                 if (hi_irelfn->r_offset == laddr + 2
2594                     && ELF32_R_TYPE (hi_irelfn->r_info)
2595                         == (int) R_V850_HI16_S)
2596                   break;
2597
2598               for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
2599                 if (lo_irelfn->r_offset == laddr + 6
2600                     && ELF32_R_TYPE (lo_irelfn->r_info)
2601                         == (int) R_V850_LO16)
2602                   break;
2603
2604               for (irelcall = internal_relocs; irelcall < irelend; irelcall ++)
2605                 if (irelcall->r_offset == laddr + 8
2606                     && ELF32_R_TYPE (irelcall->r_info)
2607                         == (int) R_V850_22_PCREL)
2608                   break;
2609
2610               if (   hi_irelfn == irelend
2611                   || lo_irelfn == irelend
2612                   || irelcall  == irelend)
2613                 {
2614                   ((*_bfd_error_handler)
2615                    ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc",
2616                     bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
2617
2618                   continue;
2619                 }
2620
2621               if (ELF32_R_SYM (irelcall->r_info) < symtab_hdr->sh_info)
2622                 {
2623                   Elf_Internal_Sym *  isym;
2624
2625                   /* A local symbol.  */
2626                   isym = isymbuf + ELF32_R_SYM (irelcall->r_info);
2627
2628                   symval = isym->st_value;
2629                 }
2630               else
2631                 {
2632                   unsigned long indx;
2633                   struct elf_link_hash_entry * h;
2634
2635                   /* An external symbol.  */
2636                   indx = ELF32_R_SYM (irelcall->r_info) - symtab_hdr->sh_info;
2637                   h = elf_sym_hashes (abfd)[indx];
2638                   BFD_ASSERT (h != NULL);
2639
2640                   if (   h->root.type != bfd_link_hash_defined
2641                       && h->root.type != bfd_link_hash_defweak)
2642                     /* This appears to be a reference to an undefined
2643                        symbol.  Just ignore it--it will be caught by the
2644                        regular reloc processing.  */
2645                     continue;
2646
2647                   symval = h->root.u.def.value;
2648                 }
2649
2650               if (symval + irelcall->r_addend != irelcall->r_offset + 4)
2651                 {
2652                   ((*_bfd_error_handler)
2653                    ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc 0x%lx",
2654                     bfd_get_filename (abfd), (unsigned long) irel->r_offset, irelcall->r_offset ));
2655
2656                   continue;
2657                 }
2658
2659               /* Get the value of the symbol referred to by the reloc.  */
2660               if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2661                 {
2662                   Elf_Internal_Sym *isym;
2663                   asection *sym_sec;
2664
2665                   /* A local symbol.  */
2666                   isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
2667
2668                   if (isym->st_shndx == SHN_UNDEF)
2669                     sym_sec = bfd_und_section_ptr;
2670                   else if (isym->st_shndx == SHN_ABS)
2671                     sym_sec = bfd_abs_section_ptr;
2672                   else if (isym->st_shndx == SHN_COMMON)
2673                     sym_sec = bfd_com_section_ptr;
2674                   else
2675                     sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2676                   symval = (isym->st_value
2677                             + sym_sec->output_section->vma
2678                             + sym_sec->output_offset);
2679                 }
2680               else
2681                 {
2682                   unsigned long indx;
2683                   struct elf_link_hash_entry *h;
2684
2685                   /* An external symbol.  */
2686                   indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
2687                   h = elf_sym_hashes (abfd)[indx];
2688                   BFD_ASSERT (h != NULL);
2689
2690                   if (   h->root.type != bfd_link_hash_defined
2691                       && h->root.type != bfd_link_hash_defweak)
2692                     /* This appears to be a reference to an undefined
2693                        symbol.  Just ignore it--it will be caught by the
2694                        regular reloc processing.  */
2695                     continue;
2696
2697                   symval = (h->root.u.def.value
2698                             + h->root.u.def.section->output_section->vma
2699                             + h->root.u.def.section->output_offset);
2700                 }
2701
2702               addend = irel->r_addend;
2703
2704               foff = (symval + addend
2705                       - (irel->r_offset
2706                          + sec->output_section->vma
2707                          + sec->output_offset
2708                          + 4));
2709 #ifdef DEBUG_RELAX
2710               fprintf (stderr, "relax longcall r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2711                        irel->r_offset,
2712                        (irel->r_offset
2713                         + sec->output_section->vma
2714                         + sec->output_offset),
2715                        symval, addend, foff);
2716 #endif
2717
2718               if (foff < -0x100000 || foff >= 0x100000)
2719                 /* After all that work, we can't shorten this function call.  */
2720                 continue;
2721
2722               /* For simplicity of coding, we are going to modify the section
2723                  contents, the section relocs, and the BFD symbol table.  We
2724                  must tell the rest of the code not to free up this
2725                  information.  It would be possible to instead create a table
2726                  of changes which have to be made, as is done in coff-mips.c;
2727                  that would be more work, but would require less memory when
2728                  the linker is run.  */
2729               elf_section_data (sec)->relocs = internal_relocs;
2730               elf_section_data (sec)->this_hdr.contents = contents;
2731               symtab_hdr->contents = (bfd_byte *) isymbuf;
2732
2733               /* Replace the long call with a jarl.  */
2734               irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_22_PCREL);
2735
2736               addend = 0;
2737
2738               if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2739                 /* If this needs to be changed because of future relaxing,
2740                    it will be handled here like other internal IND12W
2741                    relocs.  */
2742                 bfd_put_32 (abfd,
2743                             0x00000780 | (JARL_R2 (insn[2])<<11) | ((addend << 16) & 0xffff) | ((addend >> 16) & 0xf),
2744                             contents + irel->r_offset);
2745               else
2746                 /* We can't fully resolve this yet, because the external
2747                    symbol value may be changed by future relaxing.
2748                    We let the final link phase handle it.  */
2749                 bfd_put_32 (abfd, 0x00000780 | (JARL_R2 (insn[2])<<11),
2750                             contents + irel->r_offset);
2751
2752               hi_irelfn->r_info =
2753                 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
2754               lo_irelfn->r_info =
2755                 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
2756               irelcall->r_info =
2757                 ELF32_R_INFO (ELF32_R_SYM (irelcall->r_info), R_V850_NONE);
2758
2759               if (! v850_elf_relax_delete_bytes (abfd, sec,
2760                                                  irel->r_offset + 4, toaddr, 12))
2761                 goto error_return;
2762
2763               align_pad_size += 12;
2764             }
2765           else if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)
2766             {
2767               /* Check code for -mlong-jumps output.  */
2768               if (laddr + 10 <= (bfd_vma) sec->size)
2769                 {
2770                   insn[0] = bfd_get_16 (abfd, contents + laddr);
2771                   insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
2772                   insn[2] = bfd_get_16 (abfd, contents + laddr + 8);
2773
2774                   if ((insn[0] & MOVHI_MASK) != MOVHI
2775                        || MOVHI_R1 (insn[0]) != 0)
2776                     no_match = 0;
2777
2778                   if (no_match < 0
2779                       && ((insn[1] & MOVEA_MASK) != MOVEA
2780                            || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
2781                     no_match = 1;
2782
2783                   if (no_match < 0
2784                       && ((insn[2] & JMP_R_MASK) != JMP_R
2785                            || MOVEA_R2 (insn[1]) != JMP_R1 (insn[2])))
2786                     no_match = 4;
2787                 }
2788               else
2789                 {
2790                   ((*_bfd_error_handler)
2791                    ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insns",
2792                     bfd_get_filename (abfd), (unsigned long) irel->r_offset));
2793
2794                   continue;
2795                 }
2796
2797               if (no_match >= 0)
2798                 {
2799                   ((*_bfd_error_handler)
2800                    ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insn 0x%x",
2801                     bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
2802
2803                   continue;
2804                 }
2805
2806               /* Get the reloc for the address from which the register is
2807                  being loaded.  This reloc will tell us which function is
2808                  actually being called.  */
2809               for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
2810                 if (hi_irelfn->r_offset == laddr + 2
2811                     && ELF32_R_TYPE (hi_irelfn->r_info) == (int) R_V850_HI16_S)
2812                   break;
2813
2814               for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
2815                 if (lo_irelfn->r_offset == laddr + 6
2816                     && ELF32_R_TYPE (lo_irelfn->r_info) == (int) R_V850_LO16)
2817                   break;
2818
2819               if (   hi_irelfn == irelend
2820                   || lo_irelfn == irelend)
2821                 {
2822                   ((*_bfd_error_handler)
2823                    ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized reloc",
2824                     bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
2825
2826                   continue;
2827                 }
2828
2829               /* Get the value of the symbol referred to by the reloc.  */
2830               if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2831                 {
2832                   Elf_Internal_Sym *  isym;
2833                   asection *          sym_sec;
2834
2835                   /* A local symbol.  */
2836                   isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
2837
2838                   if (isym->st_shndx == SHN_UNDEF)
2839                     sym_sec = bfd_und_section_ptr;
2840                   else if (isym->st_shndx == SHN_ABS)
2841                     sym_sec = bfd_abs_section_ptr;
2842                   else if (isym->st_shndx == SHN_COMMON)
2843                     sym_sec = bfd_com_section_ptr;
2844                   else
2845                     sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2846                   symval = (isym->st_value
2847                             + sym_sec->output_section->vma
2848                             + sym_sec->output_offset);
2849 #ifdef DEBUG_RELAX
2850                   {
2851                     char * name = bfd_elf_string_from_elf_section
2852                       (abfd, symtab_hdr->sh_link, isym->st_name);
2853
2854                     fprintf (stderr, "relax long jump local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
2855                              sym_sec->name, name, isym->st_name,
2856                              sym_sec->output_section->vma,
2857                              sym_sec->output_offset,
2858                              isym->st_value, irel->r_addend);
2859                   }
2860 #endif
2861                 }
2862               else
2863                 {
2864                   unsigned long indx;
2865                   struct elf_link_hash_entry * h;
2866
2867                   /* An external symbol.  */
2868                   indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2869                   h = elf_sym_hashes (abfd)[indx];
2870                   BFD_ASSERT (h != NULL);
2871
2872                   if (   h->root.type != bfd_link_hash_defined
2873                       && h->root.type != bfd_link_hash_defweak)
2874                     /* This appears to be a reference to an undefined
2875                        symbol.  Just ignore it--it will be caught by the
2876                        regular reloc processing.  */
2877                     continue;
2878
2879                   symval = (h->root.u.def.value
2880                             + h->root.u.def.section->output_section->vma
2881                             + h->root.u.def.section->output_offset);
2882 #ifdef DEBUG_RELAX
2883                   fprintf (stderr,
2884                            "relax longjump defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
2885                            sec->name, h->root.root.string, h->root.u.def.value,
2886                            sec->output_section->vma, sec->output_offset, irel->r_addend);
2887 #endif
2888                 }
2889
2890               addend = irel->r_addend;
2891
2892               foff = (symval + addend
2893                       - (irel->r_offset
2894                          + sec->output_section->vma
2895                          + sec->output_offset
2896                          + 4));
2897 #ifdef DEBUG_RELAX
2898               fprintf (stderr, "relax longjump r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2899                        irel->r_offset,
2900                        (irel->r_offset
2901                         + sec->output_section->vma
2902                         + sec->output_offset),
2903                        symval, addend, foff);
2904 #endif
2905               if (foff < -0x100000 || foff >= 0x100000)
2906                 /* After all that work, we can't shorten this function call.  */
2907                 continue;
2908
2909               /* For simplicity of coding, we are going to modify the section
2910                  contents, the section relocs, and the BFD symbol table.  We
2911                  must tell the rest of the code not to free up this
2912                  information.  It would be possible to instead create a table
2913                  of changes which have to be made, as is done in coff-mips.c;
2914                  that would be more work, but would require less memory when
2915                  the linker is run.  */
2916               elf_section_data (sec)->relocs = internal_relocs;
2917               elf_section_data (sec)->this_hdr.contents = contents;
2918               symtab_hdr->contents = (bfd_byte *) isymbuf;
2919
2920               if (foff < -0x100 || foff >= 0x100)
2921                 {
2922                   /* Replace the long jump with a jr.  */
2923
2924                   irel->r_info =
2925                     ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_22_PCREL);
2926
2927                   irel->r_addend = addend;
2928                   addend = 0;
2929
2930                   if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2931                     /* If this needs to be changed because of future relaxing,
2932                        it will be handled here like other internal IND12W
2933                        relocs.  */
2934                     bfd_put_32 (abfd,
2935                                 0x00000780 | ((addend << 15) & 0xffff0000) | ((addend >> 17) & 0xf),
2936                                 contents + irel->r_offset);
2937                   else
2938                     /* We can't fully resolve this yet, because the external
2939                        symbol value may be changed by future relaxing.
2940                        We let the final link phase handle it.  */
2941                     bfd_put_32 (abfd, 0x00000780, contents + irel->r_offset);
2942
2943                   hi_irelfn->r_info =
2944                         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
2945                   lo_irelfn->r_info =
2946                         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
2947                   if (!v850_elf_relax_delete_bytes (abfd, sec,
2948                                                     irel->r_offset + 4, toaddr, 6))
2949                     goto error_return;
2950
2951                   align_pad_size += 6;
2952                 }
2953               else
2954                 {
2955                   /* Replace the long jump with a br.  */
2956
2957                   irel->r_info =
2958                         ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_9_PCREL);
2959
2960                   irel->r_addend = addend;
2961                   addend = 0;
2962
2963                   if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2964                     /* If this needs to be changed because of future relaxing,
2965                        it will be handled here like other internal IND12W
2966                        relocs.  */
2967                     bfd_put_16 (abfd,
2968                                 0x0585 | ((addend << 10) & 0xf800) | ((addend << 3) & 0x0070),
2969                                 contents + irel->r_offset);
2970                   else
2971                     /* We can't fully resolve this yet, because the external
2972                        symbol value may be changed by future relaxing.
2973                        We let the final link phase handle it.  */
2974                     bfd_put_16 (abfd, 0x0585, contents + irel->r_offset);
2975
2976                   hi_irelfn->r_info =
2977                         ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
2978                   lo_irelfn->r_info =
2979                         ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
2980                   if (!v850_elf_relax_delete_bytes (abfd, sec,
2981                                                     irel->r_offset + 2, toaddr, 8))
2982                     goto error_return;
2983
2984                   align_pad_size += 8;
2985                 }
2986             }
2987         }
2988
2989       irelalign = NULL;
2990       for (irel = internal_relocs; irel < irelend; irel++)
2991         {
2992           if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
2993               && irel->r_offset == toaddr)
2994             {
2995               irel->r_offset -= align_pad_size;
2996
2997               if (irelalign == NULL || irelalign->r_addend > irel->r_addend)
2998                 irelalign = irel;
2999             }
3000         }
3001
3002       addr = toaddr;
3003     }
3004
3005   if (!irelalign)
3006     {
3007 #ifdef DEBUG_RELAX
3008       fprintf (stderr, "relax pad %d shorten %d -> %d\n",
3009                align_pad_size,
3010                sec->size,
3011                sec->size - align_pad_size);
3012 #endif
3013       sec->size -= align_pad_size;
3014     }
3015
3016  finish:
3017   if (internal_relocs != NULL
3018       && elf_section_data (sec)->relocs != internal_relocs)
3019     free (internal_relocs);
3020
3021   if (contents != NULL
3022       && elf_section_data (sec)->this_hdr.contents != (unsigned char *) contents)
3023     free (contents);
3024
3025   if (isymbuf != NULL
3026       && symtab_hdr->contents != (bfd_byte *) isymbuf)
3027     free (isymbuf);
3028
3029   return result;
3030
3031  error_return:
3032   result = FALSE;
3033   goto finish;
3034 }
3035
3036 static const struct bfd_elf_special_section v850_elf_special_sections[] =
3037 {
3038   { STRING_COMMA_LEN (".call_table_data"), 0, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE) },
3039   { STRING_COMMA_LEN (".call_table_text"), 0, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3040                                                                  + SHF_EXECINSTR) },
3041   { STRING_COMMA_LEN (".rosdata"),        -2, SHT_PROGBITS,     (SHF_ALLOC
3042                                                                  + SHF_V850_GPREL) },
3043   { STRING_COMMA_LEN (".rozdata"),        -2, SHT_PROGBITS,     (SHF_ALLOC
3044                                                                  + SHF_V850_R0REL) },
3045   { STRING_COMMA_LEN (".sbss"),           -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
3046                                                                  + SHF_V850_GPREL) },
3047   { STRING_COMMA_LEN (".scommon"),        -2, SHT_V850_SCOMMON, (SHF_ALLOC + SHF_WRITE
3048                                                                  + SHF_V850_GPREL) },
3049   { STRING_COMMA_LEN (".sdata"),          -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3050                                                                  + SHF_V850_GPREL) },
3051   { STRING_COMMA_LEN (".tbss"),           -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
3052                                                                  + SHF_V850_EPREL) },
3053   { STRING_COMMA_LEN (".tcommon"),        -2, SHT_V850_TCOMMON, (SHF_ALLOC + SHF_WRITE
3054                                                                  + SHF_V850_R0REL) },
3055   { STRING_COMMA_LEN (".tdata"),          -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3056                                                                  + SHF_V850_EPREL) },
3057   { STRING_COMMA_LEN (".zbss"),           -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
3058                                                                  + SHF_V850_R0REL) },
3059   { STRING_COMMA_LEN (".zcommon"),        -2, SHT_V850_ZCOMMON, (SHF_ALLOC + SHF_WRITE
3060                                                                  + SHF_V850_R0REL) },
3061   { STRING_COMMA_LEN (".zdata"),          -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3062                                                                  + SHF_V850_R0REL) },
3063   { NULL,                     0,           0, 0,                0 }
3064 };
3065 \f
3066 #define TARGET_LITTLE_SYM                       bfd_elf32_v850_vec
3067 #define TARGET_LITTLE_NAME                      "elf32-v850"
3068 #define ELF_ARCH                                bfd_arch_v850
3069 #define ELF_MACHINE_CODE                        EM_V850
3070 #define ELF_MACHINE_ALT1                        EM_CYGNUS_V850
3071 #define ELF_MACHINE_ALT2                        EM_V800 /* This is the value used by the GreenHills toolchain.  */
3072 #define ELF_MAXPAGESIZE                         0x1000
3073
3074 #define elf_info_to_howto                       v850_elf_info_to_howto_rela
3075 #define elf_info_to_howto_rel                   v850_elf_info_to_howto_rel
3076
3077 #define elf_backend_check_relocs                v850_elf_check_relocs
3078 #define elf_backend_relocate_section            v850_elf_relocate_section
3079 #define elf_backend_object_p                    v850_elf_object_p
3080 #define elf_backend_final_write_processing      v850_elf_final_write_processing
3081 #define elf_backend_section_from_bfd_section    v850_elf_section_from_bfd_section
3082 #define elf_backend_symbol_processing           v850_elf_symbol_processing
3083 #define elf_backend_add_symbol_hook             v850_elf_add_symbol_hook
3084 #define elf_backend_link_output_symbol_hook     v850_elf_link_output_symbol_hook
3085 #define elf_backend_section_from_shdr           v850_elf_section_from_shdr
3086 #define elf_backend_fake_sections               v850_elf_fake_sections
3087 #define elf_backend_gc_mark_hook                v850_elf_gc_mark_hook
3088 #define elf_backend_special_sections            v850_elf_special_sections
3089
3090 #define elf_backend_can_gc_sections 1
3091 #define elf_backend_rela_normal 1
3092
3093 #define bfd_elf32_bfd_is_local_label_name       v850_elf_is_local_label_name
3094 #define bfd_elf32_bfd_reloc_type_lookup         v850_elf_reloc_type_lookup
3095 #define bfd_elf32_bfd_reloc_name_lookup v850_elf_reloc_name_lookup
3096 #define bfd_elf32_bfd_merge_private_bfd_data    v850_elf_merge_private_bfd_data
3097 #define bfd_elf32_bfd_set_private_flags         v850_elf_set_private_flags
3098 #define bfd_elf32_bfd_print_private_bfd_data    v850_elf_print_private_bfd_data
3099 #define bfd_elf32_bfd_relax_section             v850_elf_relax_section
3100
3101 #define elf_symbol_leading_char                 '_'
3102
3103 #include "elf32-target.h"