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