1 /* V850-specific support for 32-bit ELF
2    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
3    Free Software Foundation, Inc.
4 
5    This file is part of BFD, the Binary File Descriptor library.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 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 /* XXX FIXME: This code is littered with 32bit int, 16bit short, 8bit char
23    dependencies.  As is the gas & simulator code for the v850.  */
24 
25 #include "bfd.h"
26 #include "sysdep.h"
27 #include "bfdlink.h"
28 #include "libbfd.h"
29 #include "elf-bfd.h"
30 #include "elf/v850.h"
31 #include "libiberty.h"
32 
33 /* Sign-extend a 24-bit number.  */
34 #define SEXT24(x)	((((x) & 0xffffff) ^ 0x800000) - 0x800000)
35 
36 /* Look through the relocs for a section during the first phase, and
37    allocate space in the global offset table or procedure linkage
38    table.  */
39 
40 static bfd_boolean
v850_elf_check_relocs(bfd * abfd,struct bfd_link_info * info,asection * sec,const Elf_Internal_Rela * relocs)41 v850_elf_check_relocs (bfd *abfd,
42 		       struct bfd_link_info *info,
43 		       asection *sec,
44 		       const Elf_Internal_Rela *relocs)
45 {
46   bfd_boolean ret = TRUE;
47   bfd *dynobj;
48   Elf_Internal_Shdr *symtab_hdr;
49   struct elf_link_hash_entry **sym_hashes;
50   const Elf_Internal_Rela *rel;
51   const Elf_Internal_Rela *rel_end;
52   asection *sreloc;
53   enum v850_reloc_type r_type;
54   int other = 0;
55   const char *common = NULL;
56 
57   if (info->relocatable)
58     return TRUE;
59 
60 #ifdef DEBUG
61   _bfd_error_handler ("v850_elf_check_relocs called for section %A in %B",
62 		      sec, abfd);
63 #endif
64 
65   dynobj = elf_hash_table (info)->dynobj;
66   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
67   sym_hashes = elf_sym_hashes (abfd);
68   sreloc = NULL;
69 
70   rel_end = relocs + sec->reloc_count;
71   for (rel = relocs; rel < rel_end; rel++)
72     {
73       unsigned long r_symndx;
74       struct elf_link_hash_entry *h;
75 
76       r_symndx = ELF32_R_SYM (rel->r_info);
77       if (r_symndx < symtab_hdr->sh_info)
78 	h = NULL;
79       else
80 	{
81 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
82 	  while (h->root.type == bfd_link_hash_indirect
83 		 || h->root.type == bfd_link_hash_warning)
84 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
85 	}
86 
87       r_type = (enum v850_reloc_type) ELF32_R_TYPE (rel->r_info);
88       switch (r_type)
89 	{
90 	default:
91 	case R_V850_NONE:
92 	case R_V850_9_PCREL:
93 	case R_V850_22_PCREL:
94 	case R_V850_HI16_S:
95 	case R_V850_HI16:
96 	case R_V850_LO16:
97 	case R_V850_LO16_SPLIT_OFFSET:
98 	case R_V850_ABS32:
99 	case R_V850_REL32:
100 	case R_V850_16:
101 	case R_V850_8:
102 	case R_V850_CALLT_6_7_OFFSET:
103 	case R_V850_CALLT_16_16_OFFSET:
104 	  break;
105 
106         /* This relocation describes the C++ object vtable hierarchy.
107            Reconstruct it for later use during GC.  */
108         case R_V850_GNU_VTINHERIT:
109           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
110             return FALSE;
111           break;
112 
113         /* This relocation describes which C++ vtable entries
114 	   are actually used.  Record for later use during GC.  */
115         case R_V850_GNU_VTENTRY:
116           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
117             return FALSE;
118           break;
119 
120 	case R_V850_SDA_16_16_SPLIT_OFFSET:
121 	case R_V850_SDA_16_16_OFFSET:
122 	case R_V850_SDA_15_16_OFFSET:
123 	  other = V850_OTHER_SDA;
124 	  common = ".scommon";
125 	  goto small_data_common;
126 
127 	case R_V850_ZDA_16_16_SPLIT_OFFSET:
128 	case R_V850_ZDA_16_16_OFFSET:
129 	case R_V850_ZDA_15_16_OFFSET:
130 	  other = V850_OTHER_ZDA;
131 	  common = ".zcommon";
132 	  goto small_data_common;
133 
134 	case R_V850_TDA_4_5_OFFSET:
135 	case R_V850_TDA_4_4_OFFSET:
136 	case R_V850_TDA_6_8_OFFSET:
137 	case R_V850_TDA_7_8_OFFSET:
138 	case R_V850_TDA_7_7_OFFSET:
139 	case R_V850_TDA_16_16_OFFSET:
140 	  other = V850_OTHER_TDA;
141 	  common = ".tcommon";
142 	  /* fall through */
143 
144 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
145 
146 	small_data_common:
147 	  if (h)
148 	    {
149 	      /* Flag which type of relocation was used.  */
150 	      h->other |= other;
151 	      if ((h->other & V850_OTHER_MASK) != (other & V850_OTHER_MASK)
152 		  && (h->other & V850_OTHER_ERROR) == 0)
153 		{
154 		  const char * msg;
155 		  static char  buff[200]; /* XXX */
156 
157 		  switch (h->other & V850_OTHER_MASK)
158 		    {
159 		    default:
160 		      msg = _("Variable `%s' cannot occupy in multiple small data regions");
161 		      break;
162 		    case V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA:
163 		      msg = _("Variable `%s' can only be in one of the small, zero, and tiny data regions");
164 		      break;
165 		    case V850_OTHER_SDA | V850_OTHER_ZDA:
166 		      msg = _("Variable `%s' cannot be in both small and zero data regions simultaneously");
167 		      break;
168 		    case V850_OTHER_SDA | V850_OTHER_TDA:
169 		      msg = _("Variable `%s' cannot be in both small and tiny data regions simultaneously");
170 		      break;
171 		    case V850_OTHER_ZDA | V850_OTHER_TDA:
172 		      msg = _("Variable `%s' cannot be in both zero and tiny data regions simultaneously");
173 		      break;
174 		    }
175 
176 		  sprintf (buff, msg, h->root.root.string);
177 		  info->callbacks->warning (info, buff, h->root.root.string,
178 					    abfd, h->root.u.def.section,
179 					    (bfd_vma) 0);
180 
181 		  bfd_set_error (bfd_error_bad_value);
182 		  h->other |= V850_OTHER_ERROR;
183 		  ret = FALSE;
184 		}
185 	    }
186 
187 	  if (h && h->root.type == bfd_link_hash_common
188 	      && h->root.u.c.p
189 	      && !strcmp (bfd_get_section_name (abfd, h->root.u.c.p->section), "COMMON"))
190 	    {
191 	      asection * section;
192 
193 	      section = h->root.u.c.p->section = bfd_make_section_old_way (abfd, common);
194 	      section->flags |= SEC_IS_COMMON;
195 	    }
196 
197 #ifdef DEBUG
198 	  fprintf (stderr, "v850_elf_check_relocs, found %s relocation for %s%s\n",
199 		   v850_elf_howto_table[ (int)r_type ].name,
200 		   (h && h->root.root.string) ? h->root.root.string : "<unknown>",
201 		   (h->root.type == bfd_link_hash_common) ? ", symbol is common" : "");
202 #endif
203 	  break;
204 	}
205     }
206 
207   return ret;
208 }
209 
210 /* In the old version, when an entry was checked out from the table,
211    it was deleted.  This produced an error if the entry was needed
212    more than once, as the second attempted retry failed.
213 
214    In the current version, the entry is not deleted, instead we set
215    the field 'found' to TRUE.  If a second lookup matches the same
216    entry, then we know that the hi16s reloc has already been updated
217    and does not need to be updated a second time.
218 
219    TODO - TOFIX: If it is possible that we need to restore 2 different
220    addresses from the same table entry, where the first generates an
221    overflow, whilst the second do not, then this code will fail.  */
222 
223 typedef struct hi16s_location
224 {
225   bfd_vma                 addend;
226   bfd_byte *              address;
227   unsigned long           counter;
228   bfd_boolean             found;
229   struct hi16s_location * next;
230 }
231 hi16s_location;
232 
233 static hi16s_location * previous_hi16s;
234 static hi16s_location * free_hi16s;
235 static unsigned long    hi16s_counter;
236 
237 static void
remember_hi16s_reloc(bfd * abfd,bfd_vma addend,bfd_byte * address)238 remember_hi16s_reloc (bfd *abfd, bfd_vma addend, bfd_byte *address)
239 {
240   hi16s_location * entry = NULL;
241   bfd_size_type amt = sizeof (* free_hi16s);
242 
243   /* Find a free structure.  */
244   if (free_hi16s == NULL)
245     free_hi16s = bfd_zalloc (abfd, amt);
246 
247   entry      = free_hi16s;
248   free_hi16s = free_hi16s->next;
249 
250   entry->addend  = addend;
251   entry->address = address;
252   entry->counter = hi16s_counter ++;
253   entry->found   = FALSE;
254   entry->next    = previous_hi16s;
255   previous_hi16s = entry;
256 
257   /* Cope with wrap around of our counter.  */
258   if (hi16s_counter == 0)
259     {
260       /* XXX: Assume that all counter entries differ only in their low 16 bits.  */
261       for (entry = previous_hi16s; entry != NULL; entry = entry->next)
262 	entry->counter &= 0xffff;
263 
264       hi16s_counter = 0x10000;
265     }
266 }
267 
268 static bfd_byte *
find_remembered_hi16s_reloc(bfd_vma addend,bfd_boolean * already_found)269 find_remembered_hi16s_reloc (bfd_vma addend, bfd_boolean *already_found)
270 {
271   hi16s_location *match = NULL;
272   hi16s_location *entry;
273   hi16s_location *previous = NULL;
274   hi16s_location *prev;
275   bfd_byte *addr;
276 
277   /* Search the table.  Record the most recent entry that matches.  */
278   for (entry = previous_hi16s; entry; entry = entry->next)
279     {
280       if (entry->addend == addend
281 	  && (match == NULL || match->counter < entry->counter))
282 	{
283 	  previous = prev;
284 	  match    = entry;
285 	}
286 
287       prev = entry;
288     }
289 
290   if (match == NULL)
291     return NULL;
292 
293   /* Extract the address.  */
294   addr = match->address;
295 
296   /* Remember if this entry has already been used before.  */
297   if (already_found)
298     * already_found = match->found;
299 
300   /* Note that this entry has now been used.  */
301   match->found = TRUE;
302 
303   return addr;
304 }
305 
306 /* Calculate the final operand value for a R_V850_LO16 or
307    R_V850_LO16_SPLIT_OFFSET.  *INSN is the current operand value and
308    ADDEND is the sum of the relocation symbol and offset.  Store the
309    operand value in *INSN and return true on success.
310 
311    The assembler has already done some of this: If the value stored in
312    the instruction has its 15th bit set, (counting from zero) then the
313    assembler will have added 1 to the value stored in the associated
314    HI16S reloc.  So for example, these relocations:
315 
316        movhi hi( fred ), r0, r1
317        movea lo( fred ), r1, r1
318 
319    will store 0 in the value fields for the MOVHI and MOVEA instructions
320    and addend will be the address of fred, but for these instructions:
321 
322        movhi hi( fred + 0x123456), r0, r1
323        movea lo( fred + 0x123456), r1, r1
324 
325    the value stored in the MOVHI instruction will be 0x12 and the value
326    stored in the MOVEA instruction will be 0x3456.  If however the
327    instructions were:
328 
329        movhi hi( fred + 0x10ffff), r0, r1
330        movea lo( fred + 0x10ffff), r1, r1
331 
332    then the value stored in the MOVHI instruction would be 0x11 (not
333    0x10) and the value stored in the MOVEA instruction would be 0xffff.
334    Thus (assuming for the moment that the addend is 0), at run time the
335    MOVHI instruction loads 0x110000 into r1, then the MOVEA instruction
336    adds 0xffffffff (sign extension!) producing 0x10ffff.  Similarly if
337    the instructions were:
338 
339        movhi hi( fred - 1), r0, r1
340        movea lo( fred - 1), r1, r1
341 
342    then 0 is stored in the MOVHI instruction and -1 is stored in the
343    MOVEA instruction.
344 
345    Overflow can occur if the addition of the value stored in the
346    instruction plus the addend sets the 15th bit when before it was clear.
347    This is because the 15th bit will be sign extended into the high part,
348    thus reducing its value by one, but since the 15th bit was originally
349    clear, the assembler will not have added 1 to the previous HI16S reloc
350    to compensate for this effect.  For example:
351 
352       movhi hi( fred + 0x123456), r0, r1
353       movea lo( fred + 0x123456), r1, r1
354 
355    The value stored in HI16S reloc is 0x12, the value stored in the LO16
356    reloc is 0x3456.  If we assume that the address of fred is 0x00007000
357    then the relocations become:
358 
359      HI16S: 0x0012 + (0x00007000 >> 16)    = 0x12
360      LO16:  0x3456 + (0x00007000 & 0xffff) = 0xa456
361 
362    but when the instructions are executed, the MOVEA instruction's value
363    is signed extended, so the sum becomes:
364 
365 	0x00120000
366       + 0xffffa456
367       ------------
368 	0x0011a456    but 'fred + 0x123456' = 0x0012a456
369 
370    Note that if the 15th bit was set in the value stored in the LO16
371    reloc, then we do not have to do anything:
372 
373       movhi hi( fred + 0x10ffff), r0, r1
374       movea lo( fred + 0x10ffff), r1, r1
375 
376       HI16S:  0x0011 + (0x00007000 >> 16)    = 0x11
377       LO16:   0xffff + (0x00007000 & 0xffff) = 0x6fff
378 
379 	0x00110000
380       + 0x00006fff
381       ------------
382 	0x00116fff  = fred + 0x10ffff = 0x7000 + 0x10ffff
383 
384    Overflow can also occur if the computation carries into the 16th bit
385    and it also results in the 15th bit having the same value as the 15th
386    bit of the original value.   What happens is that the HI16S reloc
387    will have already examined the 15th bit of the original value and
388    added 1 to the high part if the bit is set.  This compensates for the
389    sign extension of 15th bit of the result of the computation.  But now
390    there is a carry into the 16th bit, and this has not been allowed for.
391 
392    So, for example if fred is at address 0xf000:
393 
394      movhi hi( fred + 0xffff), r0, r1    [bit 15 of the offset is set]
395      movea lo( fred + 0xffff), r1, r1
396 
397      HI16S: 0x0001 + (0x0000f000 >> 16)    = 0x0001
398      LO16:  0xffff + (0x0000f000 & 0xffff) = 0xefff   (carry into bit 16 is lost)
399 
400        0x00010000
401      + 0xffffefff
402      ------------
403        0x0000efff   but 'fred + 0xffff' = 0x0001efff
404 
405    Similarly, if the 15th bit remains clear, but overflow occurs into
406    the 16th bit then (assuming the address of fred is 0xf000):
407 
408      movhi hi( fred + 0x7000), r0, r1    [bit 15 of the offset is clear]
409      movea lo( fred + 0x7000), r1, r1
410 
411      HI16S: 0x0000 + (0x0000f000 >> 16)    = 0x0000
412      LO16:  0x7000 + (0x0000f000 & 0xffff) = 0x6fff  (carry into bit 16 is lost)
413 
414        0x00000000
415      + 0x00006fff
416      ------------
417        0x00006fff   but 'fred + 0x7000' = 0x00016fff
418 
419    Note - there is no need to change anything if a carry occurs, and the
420    15th bit changes its value from being set to being clear, as the HI16S
421    reloc will have already added in 1 to the high part for us:
422 
423      movhi hi( fred + 0xffff), r0, r1     [bit 15 of the offset is set]
424      movea lo( fred + 0xffff), r1, r1
425 
426      HI16S: 0x0001 + (0x00007000 >> 16)
427      LO16:  0xffff + (0x00007000 & 0xffff) = 0x6fff  (carry into bit 16 is lost)
428 
429        0x00010000
430      + 0x00006fff   (bit 15 not set, so the top half is zero)
431      ------------
432        0x00016fff   which is right (assuming that fred is at 0x7000)
433 
434    but if the 15th bit goes from being clear to being set, then we must
435    once again handle overflow:
436 
437      movhi hi( fred + 0x7000), r0, r1     [bit 15 of the offset is clear]
438      movea lo( fred + 0x7000), r1, r1
439 
440      HI16S: 0x0000 + (0x0000ffff >> 16)
441      LO16:  0x7000 + (0x0000ffff & 0xffff) = 0x6fff  (carry into bit 16)
442 
443        0x00000000
444      + 0x00006fff   (bit 15 not set, so the top half is zero)
445      ------------
446        0x00006fff   which is wrong (assuming that fred is at 0xffff).  */
447 
448 static bfd_boolean
v850_elf_perform_lo16_relocation(bfd * abfd,unsigned long * insn,unsigned long addend)449 v850_elf_perform_lo16_relocation (bfd *abfd, unsigned long *insn,
450 				  unsigned long addend)
451 {
452 #define BIT15_SET(x) ((x) & 0x8000)
453 #define OVERFLOWS(a,i) ((((a) & 0xffff) + (i)) > 0xffff)
454 
455   if ((BIT15_SET (*insn + addend) && ! BIT15_SET (addend))
456       || (OVERFLOWS (addend, *insn)
457 	  && ((! BIT15_SET (*insn)) || (BIT15_SET (addend)))))
458     {
459       bfd_boolean already_updated;
460       bfd_byte *hi16s_address = find_remembered_hi16s_reloc
461 	(addend, & already_updated);
462 
463       /* Amend the matching HI16_S relocation.  */
464       if (hi16s_address != NULL)
465 	{
466 	  if (! already_updated)
467 	    {
468 	      unsigned long hi_insn = bfd_get_16 (abfd, hi16s_address);
469 	      hi_insn += 1;
470 	      bfd_put_16 (abfd, hi_insn, hi16s_address);
471 	    }
472 	}
473       else
474 	{
475 	  fprintf (stderr, _("FAILED to find previous HI16 reloc\n"));
476 	  return FALSE;
477 	}
478     }
479 #undef OVERFLOWS
480 #undef BIT15_SET
481 
482   /* Do not complain if value has top bit set, as this has been
483      anticipated.  */
484   *insn = (*insn + addend) & 0xffff;
485   return TRUE;
486 }
487 
488 /* FIXME:  The code here probably ought to be removed and the code in reloc.c
489    allowed to do its stuff instead.  At least for most of the relocs, anyway.  */
490 
491 static bfd_reloc_status_type
v850_elf_perform_relocation(bfd * abfd,unsigned int r_type,bfd_vma addend,bfd_byte * address)492 v850_elf_perform_relocation (bfd *abfd,
493 			     unsigned int r_type,
494 			     bfd_vma addend,
495 			     bfd_byte *address)
496 {
497   unsigned long insn;
498   unsigned long result;
499   bfd_signed_vma saddend = (bfd_signed_vma) addend;
500 
501   switch (r_type)
502     {
503     default:
504       return bfd_reloc_notsupported;
505 
506     case R_V850_REL32:
507     case R_V850_ABS32:
508       bfd_put_32 (abfd, addend, address);
509       return bfd_reloc_ok;
510 
511     case R_V850_22_PCREL:
512       if (saddend > 0x1fffff || saddend < -0x200000)
513 	return bfd_reloc_overflow;
514 
515       if ((addend % 2) != 0)
516 	return bfd_reloc_dangerous;
517 
518       insn  = bfd_get_32 (abfd, address);
519       insn &= ~0xfffe003f;
520       insn |= (((addend & 0xfffe) << 16) | ((addend & 0x3f0000) >> 16));
521       bfd_put_32 (abfd, (bfd_vma) insn, address);
522       return bfd_reloc_ok;
523 
524     case R_V850_9_PCREL:
525       if (saddend > 0xff || saddend < -0x100)
526 	return bfd_reloc_overflow;
527 
528       if ((addend % 2) != 0)
529 	return bfd_reloc_dangerous;
530 
531       insn  = bfd_get_16 (abfd, address);
532       insn &= ~ 0xf870;
533       insn |= ((addend & 0x1f0) << 7) | ((addend & 0x0e) << 3);
534       break;
535 
536     case R_V850_HI16:
537       addend += (bfd_get_16 (abfd, address) << 16);
538       addend = (addend >> 16);
539       insn = addend;
540       break;
541 
542     case R_V850_HI16_S:
543       /* Remember where this relocation took place.  */
544       remember_hi16s_reloc (abfd, addend, address);
545 
546       addend += (bfd_get_16 (abfd, address) << 16);
547       addend = (addend >> 16) + ((addend & 0x8000) != 0);
548 
549       /* This relocation cannot overflow.  */
550       if (addend > 0x7fff)
551 	addend = 0;
552 
553       insn = addend;
554       break;
555 
556     case R_V850_LO16:
557       insn = bfd_get_16 (abfd, address);
558       if (! v850_elf_perform_lo16_relocation (abfd, &insn, addend))
559 	return bfd_reloc_overflow;
560       break;
561 
562     case R_V850_8:
563       addend += (char) bfd_get_8 (abfd, address);
564 
565       saddend = (bfd_signed_vma) addend;
566 
567       if (saddend > 0x7f || saddend < -0x80)
568 	return bfd_reloc_overflow;
569 
570       bfd_put_8 (abfd, addend, address);
571       return bfd_reloc_ok;
572 
573     case R_V850_CALLT_16_16_OFFSET:
574       addend += bfd_get_16 (abfd, address);
575 
576       saddend = (bfd_signed_vma) addend;
577 
578       if (saddend > 0xffff || saddend < 0)
579 	return bfd_reloc_overflow;
580 
581       insn = addend;
582       break;
583 
584     case R_V850_16:
585     case R_V850_SDA_16_16_OFFSET:
586     case R_V850_ZDA_16_16_OFFSET:
587     case R_V850_TDA_16_16_OFFSET:
588       addend += bfd_get_16 (abfd, address);
589 
590       saddend = (bfd_signed_vma) addend;
591 
592       if (saddend > 0x7fff || saddend < -0x8000)
593 	return bfd_reloc_overflow;
594 
595       insn = addend;
596       break;
597 
598     case R_V850_SDA_15_16_OFFSET:
599     case R_V850_ZDA_15_16_OFFSET:
600       insn = bfd_get_16 (abfd, address);
601       addend += (insn & 0xfffe);
602 
603       saddend = (bfd_signed_vma) addend;
604 
605       if (saddend > 0x7ffe || saddend < -0x8000)
606 	return bfd_reloc_overflow;
607 
608       if (addend & 1)
609         return bfd_reloc_dangerous;
610 
611       insn = (addend &~ (bfd_vma) 1) | (insn & 1);
612       break;
613 
614     case R_V850_TDA_6_8_OFFSET:
615       insn = bfd_get_16 (abfd, address);
616       addend += ((insn & 0x7e) << 1);
617 
618       saddend = (bfd_signed_vma) addend;
619 
620       if (saddend > 0xfc || saddend < 0)
621 	return bfd_reloc_overflow;
622 
623       if (addend & 3)
624 	return bfd_reloc_dangerous;
625 
626       insn &= 0xff81;
627       insn |= (addend >> 1);
628       break;
629 
630     case R_V850_TDA_7_8_OFFSET:
631       insn = bfd_get_16 (abfd, address);
632       addend += ((insn & 0x7f) << 1);
633 
634       saddend = (bfd_signed_vma) addend;
635 
636       if (saddend > 0xfe || saddend < 0)
637 	return bfd_reloc_overflow;
638 
639       if (addend & 1)
640 	return bfd_reloc_dangerous;
641 
642       insn &= 0xff80;
643       insn |= (addend >> 1);
644       break;
645 
646     case R_V850_TDA_7_7_OFFSET:
647       insn = bfd_get_16 (abfd, address);
648       addend += insn & 0x7f;
649 
650       saddend = (bfd_signed_vma) addend;
651 
652       if (saddend > 0x7f || saddend < 0)
653 	return bfd_reloc_overflow;
654 
655       insn &= 0xff80;
656       insn |= addend;
657       break;
658 
659     case R_V850_TDA_4_5_OFFSET:
660       insn = bfd_get_16 (abfd, address);
661       addend += ((insn & 0xf) << 1);
662 
663       saddend = (bfd_signed_vma) addend;
664 
665       if (saddend > 0x1e || saddend < 0)
666 	return bfd_reloc_overflow;
667 
668       if (addend & 1)
669 	return bfd_reloc_dangerous;
670 
671       insn &= 0xfff0;
672       insn |= (addend >> 1);
673       break;
674 
675     case R_V850_TDA_4_4_OFFSET:
676       insn = bfd_get_16 (abfd, address);
677       addend += insn & 0xf;
678 
679       saddend = (bfd_signed_vma) addend;
680 
681       if (saddend > 0xf || saddend < 0)
682 	return bfd_reloc_overflow;
683 
684       insn &= 0xfff0;
685       insn |= addend;
686       break;
687 
688     case R_V850_LO16_SPLIT_OFFSET:
689       insn = bfd_get_32 (abfd, address);
690       result = ((insn & 0xfffe0000) >> 16) | ((insn & 0x20) >> 5);
691       if (! v850_elf_perform_lo16_relocation (abfd, &result, addend))
692 	return bfd_reloc_overflow;
693       insn = (((result << 16) & 0xfffe0000)
694 	      | ((result << 5) & 0x20)
695 	      | (insn & ~0xfffe0020));
696       bfd_put_32 (abfd, insn, address);
697       return bfd_reloc_ok;
698 
699     case R_V850_ZDA_16_16_SPLIT_OFFSET:
700     case R_V850_SDA_16_16_SPLIT_OFFSET:
701       insn = bfd_get_32 (abfd, address);
702       addend += ((insn & 0xfffe0000) >> 16) + ((insn & 0x20) >> 5);
703 
704       saddend = (bfd_signed_vma) addend;
705 
706       if (saddend > 0x7fff || saddend < -0x8000)
707 	return bfd_reloc_overflow;
708 
709       insn &= 0x0001ffdf;
710       insn |= (addend & 1) << 5;
711       insn |= (addend &~ (bfd_vma) 1) << 16;
712 
713       bfd_put_32 (abfd, (bfd_vma) insn, address);
714       return bfd_reloc_ok;
715 
716     case R_V850_CALLT_6_7_OFFSET:
717       insn = bfd_get_16 (abfd, address);
718       addend += ((insn & 0x3f) << 1);
719 
720       saddend = (bfd_signed_vma) addend;
721 
722       if (saddend > 0x7e || saddend < 0)
723 	return bfd_reloc_overflow;
724 
725       if (addend & 1)
726 	return bfd_reloc_dangerous;
727 
728       insn &= 0xff80;
729       insn |= (addend >> 1);
730       break;
731 
732     case R_V850_GNU_VTINHERIT:
733     case R_V850_GNU_VTENTRY:
734       return bfd_reloc_ok;
735 
736     }
737 
738   bfd_put_16 (abfd, (bfd_vma) insn, address);
739   return bfd_reloc_ok;
740 }
741 
742 /* Insert the addend into the instruction.  */
743 
744 static bfd_reloc_status_type
v850_elf_reloc(bfd * abfd ATTRIBUTE_UNUSED,arelent * reloc,asymbol * symbol,void * data ATTRIBUTE_UNUSED,asection * isection,bfd * obfd,char ** err ATTRIBUTE_UNUSED)745 v850_elf_reloc (bfd *abfd ATTRIBUTE_UNUSED,
746 		arelent *reloc,
747 		asymbol *symbol,
748 		void * data ATTRIBUTE_UNUSED,
749 		asection *isection,
750 		bfd *obfd,
751 		char **err ATTRIBUTE_UNUSED)
752 {
753   long relocation;
754 
755   /* If there is an output BFD,
756      and the symbol is not a section name (which is only defined at final link time),
757      and either we are not putting the addend into the instruction
758       or the addend is zero, so there is nothing to add into the instruction
759      then just fixup the address and return.  */
760   if (obfd != NULL
761       && (symbol->flags & BSF_SECTION_SYM) == 0
762       && (! reloc->howto->partial_inplace
763 	  || reloc->addend == 0))
764     {
765       reloc->address += isection->output_offset;
766       return bfd_reloc_ok;
767     }
768 
769   /* Catch relocs involving undefined symbols.  */
770   if (bfd_is_und_section (symbol->section)
771       && (symbol->flags & BSF_WEAK) == 0
772       && obfd == NULL)
773     return bfd_reloc_undefined;
774 
775   /* We handle final linking of some relocs ourselves.  */
776 
777   /* Is the address of the relocation really within the section?  */
778   if (reloc->address > bfd_get_section_limit (abfd, isection))
779     return bfd_reloc_outofrange;
780 
781   /* Work out which section the relocation is targeted at and the
782      initial relocation command value.  */
783 
784   if (reloc->howto->pc_relative)
785     return bfd_reloc_ok;
786 
787   /* Get symbol value.  (Common symbols are special.)  */
788   if (bfd_is_com_section (symbol->section))
789     relocation = 0;
790   else
791     relocation = symbol->value;
792 
793   /* Convert input-section-relative symbol value to absolute + addend.  */
794   relocation += symbol->section->output_section->vma;
795   relocation += symbol->section->output_offset;
796   relocation += reloc->addend;
797 
798   reloc->addend = relocation;
799   return bfd_reloc_ok;
800 }
801 
802 /* This function is used for relocs which are only used
803    for relaxing, which the linker should otherwise ignore.  */
804 
805 static bfd_reloc_status_type
v850_elf_ignore_reloc(bfd * abfd ATTRIBUTE_UNUSED,arelent * reloc_entry,asymbol * symbol ATTRIBUTE_UNUSED,void * data ATTRIBUTE_UNUSED,asection * input_section,bfd * output_bfd,char ** error_message ATTRIBUTE_UNUSED)806 v850_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED,
807 		       arelent *reloc_entry,
808 		       asymbol *symbol ATTRIBUTE_UNUSED,
809 		       void * data ATTRIBUTE_UNUSED,
810 		       asection *input_section,
811 		       bfd *output_bfd,
812 		       char **error_message ATTRIBUTE_UNUSED)
813 {
814   if (output_bfd != NULL)
815     reloc_entry->address += input_section->output_offset;
816 
817   return bfd_reloc_ok;
818 }
819 /* Note: It is REQUIRED that the 'type' value of each entry
820    in this array match the index of the entry in the array.  */
821 static reloc_howto_type v850_elf_howto_table[] =
822 {
823   /* This reloc does nothing.  */
824   HOWTO (R_V850_NONE,			/* Type.  */
825 	 0,				/* Rightshift.  */
826 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
827 	 32,				/* Bitsize.  */
828 	 FALSE,				/* PC_relative.  */
829 	 0,				/* Bitpos.  */
830 	 complain_overflow_bitfield,	/* Complain_on_overflow.  */
831 	 bfd_elf_generic_reloc,		/* Special_function.  */
832 	 "R_V850_NONE",			/* Name.  */
833 	 FALSE,				/* Partial_inplace.  */
834 	 0,				/* Src_mask.  */
835 	 0,				/* Dst_mask.  */
836 	 FALSE),			/* PCrel_offset.  */
837 
838   /* A PC relative 9 bit branch.  */
839   HOWTO (R_V850_9_PCREL,		/* Type.  */
840 	 2,				/* Rightshift.  */
841 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
842 	 26,				/* Bitsize.  */
843 	 TRUE,				/* PC_relative.  */
844 	 0,				/* Bitpos.  */
845 	 complain_overflow_bitfield,	/* Complain_on_overflow.  */
846 	 v850_elf_reloc,		/* Special_function.  */
847 	 "R_V850_9_PCREL",		/* Name.  */
848 	 FALSE,				/* Partial_inplace.  */
849 	 0x00ffffff,			/* Src_mask.  */
850 	 0x00ffffff,			/* Dst_mask.  */
851 	 TRUE),				/* PCrel_offset.  */
852 
853   /* A PC relative 22 bit branch.  */
854   HOWTO (R_V850_22_PCREL,		/* Type.  */
855 	 2,				/* Rightshift.  */
856 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
857 	 22,				/* Bitsize.  */
858 	 TRUE,				/* PC_relative.  */
859 	 7,				/* Bitpos.  */
860 	 complain_overflow_signed,	/* Complain_on_overflow.  */
861 	 v850_elf_reloc,		/* Special_function.  */
862 	 "R_V850_22_PCREL",		/* Name.  */
863 	 FALSE,				/* Partial_inplace.  */
864 	 0x07ffff80,			/* Src_mask.  */
865 	 0x07ffff80,			/* Dst_mask.  */
866 	 TRUE),				/* PCrel_offset.  */
867 
868   /* High 16 bits of symbol value.  */
869   HOWTO (R_V850_HI16_S,			/* Type.  */
870 	 0,				/* Rightshift.  */
871 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
872 	 16,				/* Bitsize.  */
873 	 FALSE,				/* PC_relative.  */
874 	 0,				/* Bitpos.  */
875 	 complain_overflow_dont,	/* Complain_on_overflow.  */
876 	 v850_elf_reloc,		/* Special_function.  */
877 	 "R_V850_HI16_S",		/* Name.  */
878 	 FALSE,				/* Partial_inplace.  */
879 	 0xffff,			/* Src_mask.  */
880 	 0xffff,			/* Dst_mask.  */
881 	 FALSE),			/* PCrel_offset.  */
882 
883   /* High 16 bits of symbol value.  */
884   HOWTO (R_V850_HI16,			/* Type.  */
885 	 0,				/* Rightshift.  */
886 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
887 	 16,				/* Bitsize.  */
888 	 FALSE,				/* PC_relative.  */
889 	 0,				/* Bitpos.  */
890 	 complain_overflow_dont,	/* Complain_on_overflow.  */
891 	 v850_elf_reloc,		/* Special_function.  */
892 	 "R_V850_HI16",			/* Name.  */
893 	 FALSE,				/* Partial_inplace.  */
894 	 0xffff,			/* Src_mask.  */
895 	 0xffff,			/* Dst_mask.  */
896 	 FALSE),			/* PCrel_offset.  */
897 
898   /* Low 16 bits of symbol value.  */
899   HOWTO (R_V850_LO16,			/* Type.  */
900 	 0,				/* Rightshift.  */
901 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
902 	 16,				/* Bitsize.  */
903 	 FALSE,				/* PC_relative.  */
904 	 0,				/* Bitpos.  */
905 	 complain_overflow_dont,	/* Complain_on_overflow.  */
906 	 v850_elf_reloc,		/* Special_function.  */
907 	 "R_V850_LO16",			/* Name.  */
908 	 FALSE,				/* Partial_inplace.  */
909 	 0xffff,			/* Src_mask.  */
910 	 0xffff,			/* Dst_mask.  */
911 	 FALSE),			/* PCrel_offset.  */
912 
913   /* Simple 32bit reloc.  */
914   HOWTO (R_V850_ABS32,			/* Type.  */
915 	 0,				/* Rightshift.  */
916 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
917 	 32,				/* Bitsize.  */
918 	 FALSE,				/* PC_relative.  */
919 	 0,				/* Bitpos.  */
920 	 complain_overflow_dont,	/* Complain_on_overflow.  */
921 	 v850_elf_reloc,		/* Special_function.  */
922 	 "R_V850_ABS32",		/* Name.  */
923 	 FALSE,				/* Partial_inplace.  */
924 	 0xffffffff,			/* Src_mask.  */
925 	 0xffffffff,			/* Dst_mask.  */
926 	 FALSE),			/* PCrel_offset.  */
927 
928   /* Simple 16bit reloc.  */
929   HOWTO (R_V850_16,			/* Type.  */
930 	 0,				/* Rightshift.  */
931 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
932 	 16,				/* Bitsize.  */
933 	 FALSE,				/* PC_relative.  */
934 	 0,				/* Bitpos.  */
935 	 complain_overflow_dont,	/* Complain_on_overflow.  */
936 	 bfd_elf_generic_reloc,		/* Special_function.  */
937 	 "R_V850_16",			/* Name.  */
938 	 FALSE,				/* Partial_inplace.  */
939 	 0xffff,			/* Src_mask.  */
940 	 0xffff,			/* Dst_mask.  */
941 	 FALSE),			/* PCrel_offset.  */
942 
943   /* Simple 8bit reloc.	 */
944   HOWTO (R_V850_8,			/* Type.  */
945 	 0,				/* Rightshift.  */
946 	 0,				/* Size (0 = byte, 1 = short, 2 = long).  */
947 	 8,				/* Bitsize.  */
948 	 FALSE,				/* PC_relative.  */
949 	 0,				/* Bitpos.  */
950 	 complain_overflow_dont,	/* Complain_on_overflow.  */
951 	 bfd_elf_generic_reloc,		/* Special_function.  */
952 	 "R_V850_8",			/* Name.  */
953 	 FALSE,				/* Partial_inplace.  */
954 	 0xff,				/* Src_mask.  */
955 	 0xff,				/* Dst_mask.  */
956 	 FALSE),			/* PCrel_offset.  */
957 
958   /* 16 bit offset from the short data area pointer.  */
959   HOWTO (R_V850_SDA_16_16_OFFSET,	/* Type.  */
960 	 0,				/* Rightshift.  */
961 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
962 	 16,				/* Bitsize.  */
963 	 FALSE,				/* PC_relative.  */
964 	 0,				/* Bitpos.  */
965 	 complain_overflow_dont,	/* Complain_on_overflow.  */
966 	 v850_elf_reloc,		/* Special_function.  */
967 	 "R_V850_SDA_16_16_OFFSET",	/* Name.  */
968 	 FALSE,				/* Partial_inplace.  */
969 	 0xffff,			/* Src_mask.  */
970 	 0xffff,			/* Dst_mask.  */
971 	 FALSE),			/* PCrel_offset.  */
972 
973   /* 15 bit offset from the short data area pointer.  */
974   HOWTO (R_V850_SDA_15_16_OFFSET,	/* Type.  */
975 	 1,				/* Rightshift.  */
976 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
977 	 16,				/* Bitsize.  */
978 	 FALSE,				/* PC_relative.  */
979 	 1,				/* Bitpos.  */
980 	 complain_overflow_dont,	/* Complain_on_overflow.  */
981 	 v850_elf_reloc,		/* Special_function.  */
982 	 "R_V850_SDA_15_16_OFFSET",	/* Name.  */
983 	 FALSE,				/* Partial_inplace.  */
984 	 0xfffe,			/* Src_mask.  */
985 	 0xfffe,			/* Dst_mask.  */
986 	 FALSE),			/* PCrel_offset.  */
987 
988   /* 16 bit offset from the zero data area pointer.  */
989   HOWTO (R_V850_ZDA_16_16_OFFSET,	/* Type.  */
990 	 0,				/* Rightshift.  */
991 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
992 	 16,				/* Bitsize.  */
993 	 FALSE,				/* PC_relative.  */
994 	 0,				/* Bitpos.  */
995 	 complain_overflow_dont,	/* Complain_on_overflow.  */
996 	 v850_elf_reloc,		/* Special_function.  */
997 	 "R_V850_ZDA_16_16_OFFSET",	/* Name.  */
998 	 FALSE,				/* Partial_inplace.  */
999 	 0xffff,			/* Src_mask.  */
1000 	 0xffff,			/* Dst_mask.  */
1001 	 FALSE),			/* PCrel_offset.  */
1002 
1003   /* 15 bit offset from the zero data area pointer.  */
1004   HOWTO (R_V850_ZDA_15_16_OFFSET,	/* Type.  */
1005 	 1,				/* Rightshift.  */
1006 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1007 	 16,				/* Bitsize.  */
1008 	 FALSE,				/* PC_relative.  */
1009 	 1,				/* Bitpos.  */
1010 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1011 	 v850_elf_reloc,		/* Special_function.  */
1012 	 "R_V850_ZDA_15_16_OFFSET",	/* Name.  */
1013 	 FALSE,				/* Partial_inplace.  */
1014 	 0xfffe,			/* Src_mask.  */
1015 	 0xfffe,			/* Dst_mask.  */
1016 	 FALSE),			/* PCrel_offset.  */
1017 
1018   /* 6 bit offset from the tiny data area pointer.  */
1019   HOWTO (R_V850_TDA_6_8_OFFSET,		/* Type.  */
1020 	 2,				/* Rightshift.  */
1021 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1022 	 8,				/* Bitsize.  */
1023 	 FALSE,				/* PC_relative.  */
1024 	 1,				/* Bitpos.  */
1025 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1026 	 v850_elf_reloc,		/* Special_function.  */
1027 	 "R_V850_TDA_6_8_OFFSET",	/* Name.  */
1028 	 FALSE,				/* Partial_inplace.  */
1029 	 0x7e,				/* Src_mask.  */
1030 	 0x7e,				/* Dst_mask.  */
1031 	 FALSE),			/* PCrel_offset.  */
1032 
1033   /* 8 bit offset from the tiny data area pointer.  */
1034   HOWTO (R_V850_TDA_7_8_OFFSET,		/* Type.  */
1035 	 1,				/* Rightshift.  */
1036 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1037 	 8,				/* Bitsize.  */
1038 	 FALSE,				/* PC_relative.  */
1039 	 0,				/* Bitpos.  */
1040 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1041 	 v850_elf_reloc,		/* Special_function.  */
1042 	 "R_V850_TDA_7_8_OFFSET",	/* Name.  */
1043 	 FALSE,				/* Partial_inplace.  */
1044 	 0x7f,				/* Src_mask.  */
1045 	 0x7f,				/* Dst_mask.  */
1046 	 FALSE),			/* PCrel_offset.  */
1047 
1048   /* 7 bit offset from the tiny data area pointer.  */
1049   HOWTO (R_V850_TDA_7_7_OFFSET,		/* Type.  */
1050 	 0,				/* Rightshift.  */
1051 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1052 	 7,				/* Bitsize.  */
1053 	 FALSE,				/* PC_relative.  */
1054 	 0,				/* Bitpos.  */
1055 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1056 	 v850_elf_reloc,		/* Special_function.  */
1057 	 "R_V850_TDA_7_7_OFFSET",	/* Name.  */
1058 	 FALSE,				/* Partial_inplace.  */
1059 	 0x7f,				/* Src_mask.  */
1060 	 0x7f,				/* Dst_mask.  */
1061 	 FALSE),			/* PCrel_offset.  */
1062 
1063   /* 16 bit offset from the tiny data area pointer!  */
1064   HOWTO (R_V850_TDA_16_16_OFFSET,	/* Type.  */
1065 	 0,				/* Rightshift.  */
1066 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1067 	 16,				/* Bitsize.  */
1068 	 FALSE,				/* PC_relative.  */
1069 	 0,				/* Bitpos.  */
1070 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1071 	 v850_elf_reloc,		/* Special_function.  */
1072 	 "R_V850_TDA_16_16_OFFSET",	/* Name.  */
1073 	 FALSE,				/* Partial_inplace.  */
1074 	 0xffff,			/* Src_mask.  */
1075 	 0xfff,				/* Dst_mask.  */
1076 	 FALSE),			/* PCrel_offset.  */
1077 
1078   /* 5 bit offset from the tiny data area pointer.  */
1079   HOWTO (R_V850_TDA_4_5_OFFSET,		/* Type.  */
1080 	 1,				/* Rightshift.  */
1081 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1082 	 5,				/* Bitsize.  */
1083 	 FALSE,				/* PC_relative.  */
1084 	 0,				/* Bitpos.  */
1085 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1086 	 v850_elf_reloc,		/* Special_function.  */
1087 	 "R_V850_TDA_4_5_OFFSET",	/* Name.  */
1088 	 FALSE,				/* Partial_inplace.  */
1089 	 0x0f,				/* Src_mask.  */
1090 	 0x0f,				/* Dst_mask.  */
1091 	 FALSE),			/* PCrel_offset.  */
1092 
1093   /* 4 bit offset from the tiny data area pointer.  */
1094   HOWTO (R_V850_TDA_4_4_OFFSET,		/* Type.  */
1095 	 0,				/* Rightshift.  */
1096 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1097 	 4,				/* Bitsize.  */
1098 	 FALSE,				/* PC_relative.  */
1099 	 0,				/* Bitpos.  */
1100 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1101 	 v850_elf_reloc,		/* Special_function.  */
1102 	 "R_V850_TDA_4_4_OFFSET",	/* Name.  */
1103 	 FALSE,				/* Partial_inplace.  */
1104 	 0x0f,				/* Src_mask.  */
1105 	 0x0f,				/* Dst_mask.  */
1106 	 FALSE),			/* PCrel_offset.  */
1107 
1108   /* 16 bit offset from the short data area pointer.  */
1109   HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET,	/* Type.  */
1110 	 0,				/* Rightshift.  */
1111 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
1112 	 16,				/* Bitsize.  */
1113 	 FALSE,				/* PC_relative.  */
1114 	 0,				/* Bitpos.  */
1115 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1116 	 v850_elf_reloc,		/* Special_function.  */
1117 	 "R_V850_SDA_16_16_SPLIT_OFFSET",/* Name.  */
1118 	 FALSE,				/* Partial_inplace.  */
1119 	 0xfffe0020,			/* Src_mask.  */
1120 	 0xfffe0020,			/* Dst_mask.  */
1121 	 FALSE),			/* PCrel_offset.  */
1122 
1123   /* 16 bit offset from the zero data area pointer.  */
1124   HOWTO (R_V850_ZDA_16_16_SPLIT_OFFSET,	/* Type.  */
1125 	 0,				/* Rightshift.  */
1126 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
1127 	 16,				/* Bitsize.  */
1128 	 FALSE,				/* PC_relative.  */
1129 	 0,				/* Bitpos.  */
1130 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1131 	 v850_elf_reloc,		/* Special_function.  */
1132 	 "R_V850_ZDA_16_16_SPLIT_OFFSET",/* Name.  */
1133 	 FALSE,				/* Partial_inplace.  */
1134 	 0xfffe0020,			/* Src_mask.  */
1135 	 0xfffe0020,			/* Dst_mask.  */
1136 	 FALSE),			/* PCrel_offset.  */
1137 
1138   /* 6 bit offset from the call table base pointer.  */
1139   HOWTO (R_V850_CALLT_6_7_OFFSET,	/* Type.  */
1140 	 0,				/* Rightshift.  */
1141 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1142 	 7,				/* Bitsize.  */
1143 	 FALSE,				/* PC_relative.  */
1144 	 0,				/* Bitpos.  */
1145 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1146 	 v850_elf_reloc,		/* Special_function.  */
1147 	 "R_V850_CALLT_6_7_OFFSET",	/* Name.  */
1148 	 FALSE,				/* Partial_inplace.  */
1149 	 0x3f,				/* Src_mask.  */
1150 	 0x3f,				/* Dst_mask.  */
1151 	 FALSE),			/* PCrel_offset.  */
1152 
1153   /* 16 bit offset from the call table base pointer.  */
1154   HOWTO (R_V850_CALLT_16_16_OFFSET,	/* Type.  */
1155 	 0,				/* Rightshift.  */
1156 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1157 	 16,				/* Bitsize.  */
1158 	 FALSE,				/* PC_relative.  */
1159 	 0,				/* Bitpos.  */
1160 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1161 	 v850_elf_reloc,		/* Special_function.  */
1162 	 "R_V850_CALLT_16_16_OFFSET",	/* Name.  */
1163 	 FALSE,				/* Partial_inplace.  */
1164 	 0xffff,			/* Src_mask.  */
1165 	 0xffff,			/* Dst_mask.  */
1166 	 FALSE),			/* PCrel_offset.  */
1167 
1168   /* GNU extension to record C++ vtable hierarchy */
1169   HOWTO (R_V850_GNU_VTINHERIT, /* Type.  */
1170          0,                     /* Rightshift.  */
1171          2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1172          0,                     /* Bitsize.  */
1173          FALSE,                 /* PC_relative.  */
1174          0,                     /* Bitpos.  */
1175          complain_overflow_dont, /* Complain_on_overflow.  */
1176          NULL,                  /* Special_function.  */
1177          "R_V850_GNU_VTINHERIT", /* Name.  */
1178          FALSE,                 /* Partial_inplace.  */
1179          0,                     /* Src_mask.  */
1180          0,                     /* Dst_mask.  */
1181          FALSE),                /* PCrel_offset.  */
1182 
1183   /* GNU extension to record C++ vtable member usage */
1184   HOWTO (R_V850_GNU_VTENTRY,     /* Type.  */
1185          0,                     /* Rightshift.  */
1186          2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1187          0,                     /* Bitsize.  */
1188          FALSE,                 /* PC_relative.  */
1189          0,                     /* Bitpos.  */
1190          complain_overflow_dont, /* Complain_on_overflow.  */
1191          _bfd_elf_rel_vtable_reloc_fn,  /* Special_function.  */
1192          "R_V850_GNU_VTENTRY",   /* Name.  */
1193          FALSE,                 /* Partial_inplace.  */
1194          0,                     /* Src_mask.  */
1195          0,                     /* Dst_mask.  */
1196          FALSE),                /* PCrel_offset.  */
1197 
1198   /* Indicates a .longcall pseudo-op.  The compiler will generate a .longcall
1199      pseudo-op when it finds a function call which can be relaxed.  */
1200   HOWTO (R_V850_LONGCALL,     /* Type.  */
1201        0,                     /* Rightshift.  */
1202        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1203        32,                    /* Bitsize.  */
1204        TRUE,                  /* PC_relative.  */
1205        0,                     /* Bitpos.  */
1206        complain_overflow_signed, /* Complain_on_overflow.  */
1207        v850_elf_ignore_reloc, /* Special_function.  */
1208        "R_V850_LONGCALL",     /* Name.  */
1209        FALSE,                 /* Partial_inplace.  */
1210        0,                     /* Src_mask.  */
1211        0,                     /* Dst_mask.  */
1212        TRUE),                 /* PCrel_offset.  */
1213 
1214   /* Indicates a .longjump pseudo-op.  The compiler will generate a
1215      .longjump pseudo-op when it finds a branch which can be relaxed.  */
1216   HOWTO (R_V850_LONGJUMP,     /* Type.  */
1217        0,                     /* Rightshift.  */
1218        2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1219        32,                    /* Bitsize.  */
1220        TRUE,                  /* PC_relative.  */
1221        0,                     /* Bitpos.  */
1222        complain_overflow_signed, /* Complain_on_overflow.  */
1223        v850_elf_ignore_reloc, /* Special_function.  */
1224        "R_V850_LONGJUMP",     /* Name.  */
1225        FALSE,                 /* Partial_inplace.  */
1226        0,                     /* Src_mask.  */
1227        0,                     /* Dst_mask.  */
1228        TRUE),                 /* PCrel_offset.  */
1229 
1230   HOWTO (R_V850_ALIGN,        /* Type.  */
1231        0,                     /* Rightshift.  */
1232        1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1233        0,                     /* Bitsize.  */
1234        FALSE,                 /* PC_relative.  */
1235        0,                     /* Bitpos.  */
1236        complain_overflow_unsigned, /* Complain_on_overflow.  */
1237        v850_elf_ignore_reloc, /* Special_function.  */
1238        "R_V850_ALIGN",        /* Name.  */
1239        FALSE,                 /* Partial_inplace.  */
1240        0,                     /* Src_mask.  */
1241        0,                     /* Dst_mask.  */
1242        TRUE),                 /* PCrel_offset.  */
1243 
1244   /* Simple pc-relative 32bit reloc.  */
1245   HOWTO (R_V850_REL32,			/* Type.  */
1246 	 0,				/* Rightshift.  */
1247 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
1248 	 32,				/* Bitsize.  */
1249 	 TRUE,				/* PC_relative.  */
1250 	 0,				/* Bitpos.  */
1251 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1252 	 v850_elf_reloc,		/* Special_function.  */
1253 	 "R_V850_REL32",		/* Name.  */
1254 	 FALSE,				/* Partial_inplace.  */
1255 	 0xffffffff,			/* Src_mask.  */
1256 	 0xffffffff,			/* Dst_mask.  */
1257 	 FALSE),			/* PCrel_offset.  */
1258 
1259   /* An ld.bu version of R_V850_LO16.  */
1260   HOWTO (R_V850_LO16_SPLIT_OFFSET,	/* Type.  */
1261 	 0,				/* Rightshift.  */
1262 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
1263 	 16,				/* Bitsize.  */
1264 	 FALSE,				/* PC_relative.  */
1265 	 0,				/* Bitpos.  */
1266 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1267 	 v850_elf_reloc,		/* Special_function.  */
1268 	 "R_V850_LO16_SPLIT_OFFSET",	/* Name.  */
1269 	 FALSE,				/* Partial_inplace.  */
1270 	 0xfffe0020,			/* Src_mask.  */
1271 	 0xfffe0020,			/* Dst_mask.  */
1272 	 FALSE),			/* PCrel_offset.  */
1273 };
1274 
1275 /* Map BFD reloc types to V850 ELF reloc types.  */
1276 
1277 struct v850_elf_reloc_map
1278 {
1279   /* BFD_RELOC_V850_CALLT_16_16_OFFSET is 258, which will not fix in an
1280      unsigned char.  */
1281   bfd_reloc_code_real_type bfd_reloc_val;
1282   unsigned int elf_reloc_val;
1283 };
1284 
1285 static const struct v850_elf_reloc_map v850_elf_reloc_map[] =
1286 {
1287   { BFD_RELOC_NONE,		           R_V850_NONE                   },
1288   { BFD_RELOC_V850_9_PCREL,	           R_V850_9_PCREL                },
1289   { BFD_RELOC_V850_22_PCREL,	           R_V850_22_PCREL               },
1290   { BFD_RELOC_HI16_S,		           R_V850_HI16_S                 },
1291   { BFD_RELOC_HI16,		           R_V850_HI16                   },
1292   { BFD_RELOC_LO16,		           R_V850_LO16                   },
1293   { BFD_RELOC_32,		           R_V850_ABS32                  },
1294   { BFD_RELOC_32_PCREL,		           R_V850_REL32                  },
1295   { BFD_RELOC_16,		           R_V850_16                     },
1296   { BFD_RELOC_8,		           R_V850_8                      },
1297   { BFD_RELOC_V850_SDA_16_16_OFFSET,       R_V850_SDA_16_16_OFFSET       },
1298   { BFD_RELOC_V850_SDA_15_16_OFFSET,       R_V850_SDA_15_16_OFFSET       },
1299   { BFD_RELOC_V850_ZDA_16_16_OFFSET,       R_V850_ZDA_16_16_OFFSET       },
1300   { BFD_RELOC_V850_ZDA_15_16_OFFSET,       R_V850_ZDA_15_16_OFFSET       },
1301   { BFD_RELOC_V850_TDA_6_8_OFFSET,         R_V850_TDA_6_8_OFFSET         },
1302   { BFD_RELOC_V850_TDA_7_8_OFFSET,         R_V850_TDA_7_8_OFFSET         },
1303   { BFD_RELOC_V850_TDA_7_7_OFFSET,         R_V850_TDA_7_7_OFFSET         },
1304   { BFD_RELOC_V850_TDA_16_16_OFFSET,       R_V850_TDA_16_16_OFFSET       },
1305   { BFD_RELOC_V850_TDA_4_5_OFFSET,         R_V850_TDA_4_5_OFFSET         },
1306   { BFD_RELOC_V850_TDA_4_4_OFFSET,         R_V850_TDA_4_4_OFFSET         },
1307   { BFD_RELOC_V850_LO16_SPLIT_OFFSET,      R_V850_LO16_SPLIT_OFFSET      },
1308   { BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET, R_V850_SDA_16_16_SPLIT_OFFSET },
1309   { BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET, R_V850_ZDA_16_16_SPLIT_OFFSET },
1310   { BFD_RELOC_V850_CALLT_6_7_OFFSET,       R_V850_CALLT_6_7_OFFSET       },
1311   { BFD_RELOC_V850_CALLT_16_16_OFFSET,     R_V850_CALLT_16_16_OFFSET     },
1312   { BFD_RELOC_VTABLE_INHERIT,              R_V850_GNU_VTINHERIT          },
1313   { BFD_RELOC_VTABLE_ENTRY,                R_V850_GNU_VTENTRY            },
1314   { BFD_RELOC_V850_LONGCALL,               R_V850_LONGCALL               },
1315   { BFD_RELOC_V850_LONGJUMP,               R_V850_LONGJUMP               },
1316   { BFD_RELOC_V850_ALIGN,                  R_V850_ALIGN                  },
1317 
1318 };
1319 
1320 /* Map a bfd relocation into the appropriate howto structure.  */
1321 
1322 static reloc_howto_type *
v850_elf_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)1323 v850_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1324 			    bfd_reloc_code_real_type code)
1325 {
1326   unsigned int i;
1327 
1328   for (i = ARRAY_SIZE (v850_elf_reloc_map); i --;)
1329     if (v850_elf_reloc_map[i].bfd_reloc_val == code)
1330       {
1331 	unsigned int elf_reloc_val = v850_elf_reloc_map[i].elf_reloc_val;
1332 
1333 	BFD_ASSERT (v850_elf_howto_table[elf_reloc_val].type == elf_reloc_val);
1334 
1335 	return v850_elf_howto_table + elf_reloc_val;
1336       }
1337 
1338   return NULL;
1339 }
1340 
1341 /* Set the howto pointer for an V850 ELF reloc.  */
1342 
1343 static void
v850_elf_info_to_howto_rel(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr,Elf_Internal_Rela * dst)1344 v850_elf_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
1345 			    arelent *cache_ptr,
1346 			    Elf_Internal_Rela *dst)
1347 {
1348   unsigned int r_type;
1349 
1350   r_type = ELF32_R_TYPE (dst->r_info);
1351   BFD_ASSERT (r_type < (unsigned int) R_V850_max);
1352   cache_ptr->howto = &v850_elf_howto_table[r_type];
1353 }
1354 
1355 /* Set the howto pointer for a V850 ELF reloc (type RELA).  */
1356 
1357 static void
v850_elf_info_to_howto_rela(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr,Elf_Internal_Rela * dst)1358 v850_elf_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
1359 			     arelent * cache_ptr,
1360 			     Elf_Internal_Rela *dst)
1361 {
1362   unsigned int r_type;
1363 
1364   r_type = ELF32_R_TYPE (dst->r_info);
1365   BFD_ASSERT (r_type < (unsigned int) R_V850_max);
1366   cache_ptr->howto = &v850_elf_howto_table[r_type];
1367 }
1368 
1369 static bfd_boolean
v850_elf_is_local_label_name(bfd * abfd ATTRIBUTE_UNUSED,const char * name)1370 v850_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
1371 {
1372   return (   (name[0] == '.' && (name[1] == 'L' || name[1] == '.'))
1373 	  || (name[0] == '_' &&  name[1] == '.' && name[2] == 'L' && name[3] == '_'));
1374 }
1375 
1376 /* We overload some of the bfd_reloc error codes for own purposes.  */
1377 #define bfd_reloc_gp_not_found		bfd_reloc_other
1378 #define bfd_reloc_ep_not_found		bfd_reloc_continue
1379 #define bfd_reloc_ctbp_not_found	(bfd_reloc_dangerous + 1)
1380 
1381 /* Perform a relocation as part of a final link.  */
1382 
1383 static bfd_reloc_status_type
v850_elf_final_link_relocate(reloc_howto_type * howto,bfd * input_bfd,bfd * output_bfd ATTRIBUTE_UNUSED,asection * input_section,bfd_byte * contents,bfd_vma offset,bfd_vma value,bfd_vma addend,struct bfd_link_info * info,asection * sym_sec,int is_local ATTRIBUTE_UNUSED)1384 v850_elf_final_link_relocate (reloc_howto_type *howto,
1385 			      bfd *input_bfd,
1386 			      bfd *output_bfd ATTRIBUTE_UNUSED,
1387 			      asection *input_section,
1388 			      bfd_byte *contents,
1389 			      bfd_vma offset,
1390 			      bfd_vma value,
1391 			      bfd_vma addend,
1392 			      struct bfd_link_info *info,
1393 			      asection *sym_sec,
1394 			      int is_local ATTRIBUTE_UNUSED)
1395 {
1396   unsigned int r_type = howto->type;
1397   bfd_byte *hit_data = contents + offset;
1398 
1399   /* Adjust the value according to the relocation.  */
1400   switch (r_type)
1401     {
1402     case R_V850_9_PCREL:
1403       value -= (input_section->output_section->vma
1404 		+ input_section->output_offset);
1405       value -= offset;
1406       break;
1407 
1408     case R_V850_22_PCREL:
1409       value -= (input_section->output_section->vma
1410 		+ input_section->output_offset
1411 		+ offset);
1412 
1413       /* If the sign extension will corrupt the value then we have overflowed.  */
1414       if (((value & 0xff000000) != 0x0) && ((value & 0xff000000) != 0xff000000))
1415 	return bfd_reloc_overflow;
1416 
1417       /* Only the bottom 24 bits of the PC are valid.  */
1418       value = SEXT24 (value);
1419       break;
1420 
1421     case R_V850_REL32:
1422       value -= (input_section->output_section->vma
1423 		+ input_section->output_offset
1424 		+ offset);
1425       break;
1426 
1427     case R_V850_HI16_S:
1428     case R_V850_HI16:
1429     case R_V850_LO16:
1430     case R_V850_LO16_SPLIT_OFFSET:
1431     case R_V850_16:
1432     case R_V850_ABS32:
1433     case R_V850_8:
1434       break;
1435 
1436     case R_V850_ZDA_15_16_OFFSET:
1437     case R_V850_ZDA_16_16_OFFSET:
1438     case R_V850_ZDA_16_16_SPLIT_OFFSET:
1439       if (sym_sec == NULL)
1440 	return bfd_reloc_undefined;
1441 
1442       value -= sym_sec->output_section->vma;
1443       break;
1444 
1445     case R_V850_SDA_15_16_OFFSET:
1446     case R_V850_SDA_16_16_OFFSET:
1447     case R_V850_SDA_16_16_SPLIT_OFFSET:
1448       {
1449 	unsigned long                gp;
1450 	struct bfd_link_hash_entry * h;
1451 
1452 	if (sym_sec == NULL)
1453 	  return bfd_reloc_undefined;
1454 
1455 	/* Get the value of __gp.  */
1456 	h = bfd_link_hash_lookup (info->hash, "__gp", FALSE, FALSE, TRUE);
1457 	if (h == NULL
1458 	    || h->type != bfd_link_hash_defined)
1459 	  return bfd_reloc_gp_not_found;
1460 
1461 	gp = (h->u.def.value
1462 	      + h->u.def.section->output_section->vma
1463 	      + h->u.def.section->output_offset);
1464 
1465 	value -= sym_sec->output_section->vma;
1466 	value -= (gp - sym_sec->output_section->vma);
1467       }
1468     break;
1469 
1470     case R_V850_TDA_4_4_OFFSET:
1471     case R_V850_TDA_4_5_OFFSET:
1472     case R_V850_TDA_16_16_OFFSET:
1473     case R_V850_TDA_7_7_OFFSET:
1474     case R_V850_TDA_7_8_OFFSET:
1475     case R_V850_TDA_6_8_OFFSET:
1476       {
1477 	unsigned long                ep;
1478 	struct bfd_link_hash_entry * h;
1479 
1480 	/* Get the value of __ep.  */
1481 	h = bfd_link_hash_lookup (info->hash, "__ep", FALSE, FALSE, TRUE);
1482 	if (h == NULL
1483 	    || h->type != bfd_link_hash_defined)
1484 	  return bfd_reloc_ep_not_found;
1485 
1486 	ep = (h->u.def.value
1487 	      + h->u.def.section->output_section->vma
1488 	      + h->u.def.section->output_offset);
1489 
1490 	value -= ep;
1491       }
1492     break;
1493 
1494     case R_V850_CALLT_6_7_OFFSET:
1495       {
1496 	unsigned long                ctbp;
1497 	struct bfd_link_hash_entry * h;
1498 
1499 	/* Get the value of __ctbp.  */
1500 	h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
1501 	if (h == NULL
1502 	    || h->type != bfd_link_hash_defined)
1503 	  return bfd_reloc_ctbp_not_found;
1504 
1505 	ctbp = (h->u.def.value
1506 	      + h->u.def.section->output_section->vma
1507 	      + h->u.def.section->output_offset);
1508 	value -= ctbp;
1509       }
1510     break;
1511 
1512     case R_V850_CALLT_16_16_OFFSET:
1513       {
1514 	unsigned long                ctbp;
1515 	struct bfd_link_hash_entry * h;
1516 
1517 	if (sym_sec == NULL)
1518 	  return bfd_reloc_undefined;
1519 
1520 	/* Get the value of __ctbp.  */
1521 	h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
1522 	if (h == NULL
1523 	    || h->type != bfd_link_hash_defined)
1524 	  return bfd_reloc_ctbp_not_found;
1525 
1526 	ctbp = (h->u.def.value
1527 	      + h->u.def.section->output_section->vma
1528 	      + h->u.def.section->output_offset);
1529 
1530 	value -= sym_sec->output_section->vma;
1531 	value -= (ctbp - sym_sec->output_section->vma);
1532       }
1533     break;
1534 
1535     case R_V850_NONE:
1536     case R_V850_GNU_VTINHERIT:
1537     case R_V850_GNU_VTENTRY:
1538     case R_V850_LONGCALL:
1539     case R_V850_LONGJUMP:
1540     case R_V850_ALIGN:
1541       return bfd_reloc_ok;
1542 
1543     default:
1544       return bfd_reloc_notsupported;
1545     }
1546 
1547   /* Perform the relocation.  */
1548   return v850_elf_perform_relocation (input_bfd, r_type, value + addend, hit_data);
1549 }
1550 
1551 /* Relocate an V850 ELF section.  */
1552 
1553 static bfd_boolean
v850_elf_relocate_section(bfd * output_bfd,struct bfd_link_info * info,bfd * input_bfd,asection * input_section,bfd_byte * contents,Elf_Internal_Rela * relocs,Elf_Internal_Sym * local_syms,asection ** local_sections)1554 v850_elf_relocate_section (bfd *output_bfd,
1555 			   struct bfd_link_info *info,
1556 			   bfd *input_bfd,
1557 			   asection *input_section,
1558 			   bfd_byte *contents,
1559 			   Elf_Internal_Rela *relocs,
1560 			   Elf_Internal_Sym *local_syms,
1561 			   asection **local_sections)
1562 {
1563   Elf_Internal_Shdr *symtab_hdr;
1564   struct elf_link_hash_entry **sym_hashes;
1565   Elf_Internal_Rela *rel;
1566   Elf_Internal_Rela *relend;
1567 
1568   if (info->relocatable)
1569     return TRUE;
1570 
1571   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1572   sym_hashes = elf_sym_hashes (input_bfd);
1573 
1574   /* Reset the list of remembered HI16S relocs to empty.  */
1575   free_hi16s     = previous_hi16s;
1576   previous_hi16s = NULL;
1577   hi16s_counter  = 0;
1578 
1579   rel    = relocs;
1580   relend = relocs + input_section->reloc_count;
1581   for (; rel < relend; rel++)
1582     {
1583       int r_type;
1584       reloc_howto_type *howto;
1585       unsigned long r_symndx;
1586       Elf_Internal_Sym *sym;
1587       asection *sec;
1588       struct elf_link_hash_entry *h;
1589       bfd_vma relocation;
1590       bfd_reloc_status_type r;
1591 
1592       r_symndx = ELF32_R_SYM (rel->r_info);
1593       r_type   = ELF32_R_TYPE (rel->r_info);
1594 
1595       if (r_type == R_V850_GNU_VTENTRY
1596           || r_type == R_V850_GNU_VTINHERIT)
1597         continue;
1598 
1599       /* This is a final link.  */
1600       howto = v850_elf_howto_table + r_type;
1601       h = NULL;
1602       sym = NULL;
1603       sec = NULL;
1604       if (r_symndx < symtab_hdr->sh_info)
1605 	{
1606 	  sym = local_syms + r_symndx;
1607 	  sec = local_sections[r_symndx];
1608 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1609 	}
1610       else
1611 	{
1612 	  bfd_boolean unresolved_reloc, warned;
1613 
1614 	  /* Note - this check is delayed until now as it is possible and
1615 	     valid to have a file without any symbols but with relocs that
1616 	     can be processed.  */
1617 	  if (sym_hashes == NULL)
1618 	    {
1619 	      info->callbacks->warning
1620 		(info, "no hash table available",
1621 		 NULL, input_bfd, input_section, (bfd_vma) 0);
1622 
1623 	      return FALSE;
1624 	    }
1625 
1626 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1627 				   r_symndx, symtab_hdr, sym_hashes,
1628 				   h, sec, relocation,
1629 				   unresolved_reloc, warned);
1630 	}
1631 
1632       /* FIXME: We should use the addend, but the COFF relocations don't.  */
1633       r = v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
1634 					input_section,
1635 					contents, rel->r_offset,
1636 					relocation, rel->r_addend,
1637 					info, sec, h == NULL);
1638 
1639       if (r != bfd_reloc_ok)
1640 	{
1641 	  const char * name;
1642 	  const char * msg = NULL;
1643 
1644 	  if (h != NULL)
1645 	    name = h->root.root.string;
1646 	  else
1647 	    {
1648 	      name = (bfd_elf_string_from_elf_section
1649 		      (input_bfd, symtab_hdr->sh_link, sym->st_name));
1650 	      if (name == NULL || *name == '\0')
1651 		name = bfd_section_name (input_bfd, sec);
1652 	    }
1653 
1654 	  switch (r)
1655 	    {
1656 	    case bfd_reloc_overflow:
1657 	      if (! ((*info->callbacks->reloc_overflow)
1658 		     (info, (h ? &h->root : NULL), name, howto->name,
1659 		      (bfd_vma) 0, input_bfd, input_section,
1660 		      rel->r_offset)))
1661 		return FALSE;
1662 	      break;
1663 
1664 	    case bfd_reloc_undefined:
1665 	      if (! ((*info->callbacks->undefined_symbol)
1666 		     (info, name, input_bfd, input_section,
1667 		      rel->r_offset, TRUE)))
1668 		return FALSE;
1669 	      break;
1670 
1671 	    case bfd_reloc_outofrange:
1672 	      msg = _("internal error: out of range error");
1673 	      goto common_error;
1674 
1675 	    case bfd_reloc_notsupported:
1676 	      msg = _("internal error: unsupported relocation error");
1677 	      goto common_error;
1678 
1679 	    case bfd_reloc_dangerous:
1680 	      msg = _("internal error: dangerous relocation");
1681 	      goto common_error;
1682 
1683 	    case bfd_reloc_gp_not_found:
1684 	      msg = _("could not locate special linker symbol __gp");
1685 	      goto common_error;
1686 
1687 	    case bfd_reloc_ep_not_found:
1688 	      msg = _("could not locate special linker symbol __ep");
1689 	      goto common_error;
1690 
1691 	    case bfd_reloc_ctbp_not_found:
1692 	      msg = _("could not locate special linker symbol __ctbp");
1693 	      goto common_error;
1694 
1695 	    default:
1696 	      msg = _("internal error: unknown error");
1697 	      /* fall through */
1698 
1699 	    common_error:
1700 	      if (!((*info->callbacks->warning)
1701 		    (info, msg, name, input_bfd, input_section,
1702 		     rel->r_offset)))
1703 		return FALSE;
1704 	      break;
1705 	    }
1706 	}
1707     }
1708 
1709   return TRUE;
1710 }
1711 
1712 static bfd_boolean
v850_elf_gc_sweep_hook(bfd * abfd ATTRIBUTE_UNUSED,struct bfd_link_info * info ATTRIBUTE_UNUSED,asection * sec ATTRIBUTE_UNUSED,const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED)1713 v850_elf_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
1714 			struct bfd_link_info *info ATTRIBUTE_UNUSED,
1715 			asection *sec ATTRIBUTE_UNUSED,
1716 			const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
1717 {
1718   /* No got and plt entries for v850-elf.  */
1719   return TRUE;
1720 }
1721 
1722 static asection *
v850_elf_gc_mark_hook(asection * sec,struct bfd_link_info * info ATTRIBUTE_UNUSED,Elf_Internal_Rela * rel,struct elf_link_hash_entry * h,Elf_Internal_Sym * sym)1723 v850_elf_gc_mark_hook (asection *sec,
1724 		       struct bfd_link_info *info ATTRIBUTE_UNUSED,
1725 		       Elf_Internal_Rela *rel,
1726 		       struct elf_link_hash_entry *h,
1727 		       Elf_Internal_Sym *sym)
1728 {
1729   if (h != NULL)
1730     {
1731       switch (ELF32_R_TYPE (rel->r_info))
1732       {
1733       case R_V850_GNU_VTINHERIT:
1734       case R_V850_GNU_VTENTRY:
1735         break;
1736 
1737       default:
1738         switch (h->root.type)
1739           {
1740           case bfd_link_hash_defined:
1741           case bfd_link_hash_defweak:
1742             return h->root.u.def.section;
1743 
1744           case bfd_link_hash_common:
1745             return h->root.u.c.p->section;
1746 
1747 	  default:
1748 	    break;
1749           }
1750        }
1751      }
1752    else
1753      return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
1754 
1755   return NULL;
1756 }
1757 
1758 /* Set the right machine number.  */
1759 
1760 static bfd_boolean
v850_elf_object_p(bfd * abfd)1761 v850_elf_object_p (bfd *abfd)
1762 {
1763   switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1764     {
1765     default:
1766     case E_V850_ARCH:
1767       bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850);
1768       break;
1769     case E_V850E_ARCH:
1770       bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e);
1771       break;
1772     case E_V850E1_ARCH:
1773       bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e1);
1774       break;
1775     }
1776   return TRUE;
1777 }
1778 
1779 /* Store the machine number in the flags field.  */
1780 
1781 static void
v850_elf_final_write_processing(bfd * abfd,bfd_boolean linker ATTRIBUTE_UNUSED)1782 v850_elf_final_write_processing (bfd *abfd,
1783 				 bfd_boolean linker ATTRIBUTE_UNUSED)
1784 {
1785   unsigned long val;
1786 
1787   switch (bfd_get_mach (abfd))
1788     {
1789     default:
1790     case bfd_mach_v850:   val = E_V850_ARCH; break;
1791     case bfd_mach_v850e:  val = E_V850E_ARCH; break;
1792     case bfd_mach_v850e1: val = E_V850E1_ARCH; break;
1793     }
1794 
1795   elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
1796   elf_elfheader (abfd)->e_flags |= val;
1797 }
1798 
1799 /* Function to keep V850 specific file flags.  */
1800 
1801 static bfd_boolean
v850_elf_set_private_flags(bfd * abfd,flagword flags)1802 v850_elf_set_private_flags (bfd *abfd, flagword flags)
1803 {
1804   BFD_ASSERT (!elf_flags_init (abfd)
1805 	      || elf_elfheader (abfd)->e_flags == flags);
1806 
1807   elf_elfheader (abfd)->e_flags = flags;
1808   elf_flags_init (abfd) = TRUE;
1809   return TRUE;
1810 }
1811 
1812 /* Merge backend specific data from an object file
1813    to the output object file when linking.  */
1814 
1815 static bfd_boolean
v850_elf_merge_private_bfd_data(bfd * ibfd,bfd * obfd)1816 v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
1817 {
1818   flagword out_flags;
1819   flagword in_flags;
1820 
1821   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1822       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1823     return TRUE;
1824 
1825   in_flags = elf_elfheader (ibfd)->e_flags;
1826   out_flags = elf_elfheader (obfd)->e_flags;
1827 
1828   if (! elf_flags_init (obfd))
1829     {
1830       /* If the input is the default architecture then do not
1831 	 bother setting the flags for the output architecture,
1832 	 instead allow future merges to do this.  If no future
1833 	 merges ever set these flags then they will retain their
1834 	 unitialised values, which surprise surprise, correspond
1835 	 to the default values.  */
1836       if (bfd_get_arch_info (ibfd)->the_default)
1837 	return TRUE;
1838 
1839       elf_flags_init (obfd) = TRUE;
1840       elf_elfheader (obfd)->e_flags = in_flags;
1841 
1842       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
1843 	  && bfd_get_arch_info (obfd)->the_default)
1844 	return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
1845 
1846       return TRUE;
1847     }
1848 
1849   /* Check flag compatibility.  */
1850   if (in_flags == out_flags)
1851     return TRUE;
1852 
1853   if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
1854       && (in_flags & EF_V850_ARCH) != E_V850_ARCH)
1855     {
1856       /* Allow v850e1 binaries to be linked with v850e binaries.
1857 	 Set the output binary to v850e.  */
1858       if ((in_flags & EF_V850_ARCH) == E_V850E1_ARCH
1859 	  && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
1860 	return TRUE;
1861 
1862       if ((in_flags & EF_V850_ARCH) == E_V850E_ARCH
1863 	  && (out_flags & EF_V850_ARCH) == E_V850E1_ARCH)
1864 	{
1865 	  elf_elfheader (obfd)->e_flags =
1866 	    ((out_flags & ~ EF_V850_ARCH) | E_V850E_ARCH);
1867 	  return TRUE;
1868 	}
1869 
1870       _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
1871 			  ibfd);
1872     }
1873 
1874   return TRUE;
1875 }
1876 
1877 /* Display the flags field.  */
1878 
1879 static bfd_boolean
v850_elf_print_private_bfd_data(bfd * abfd,void * ptr)1880 v850_elf_print_private_bfd_data (bfd *abfd, void * ptr)
1881 {
1882   FILE * file = (FILE *) ptr;
1883 
1884   BFD_ASSERT (abfd != NULL && ptr != NULL);
1885 
1886   _bfd_elf_print_private_bfd_data (abfd, ptr);
1887 
1888   /* xgettext:c-format */
1889   fprintf (file, _("private flags = %lx: "), elf_elfheader (abfd)->e_flags);
1890 
1891   switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1892     {
1893     default:
1894     case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
1895     case E_V850E_ARCH: fprintf (file, _("v850e architecture")); break;
1896     case E_V850E1_ARCH: fprintf (file, _("v850e1 architecture")); break;
1897     }
1898 
1899   fputc ('\n', file);
1900 
1901   return TRUE;
1902 }
1903 
1904 /* V850 ELF uses four common sections.  One is the usual one, and the
1905    others are for (small) objects in one of the special data areas:
1906    small, tiny and zero.  All the objects are kept together, and then
1907    referenced via the gp register, the ep register or the r0 register
1908    respectively, which yields smaller, faster assembler code.  This
1909    approach is copied from elf32-mips.c.  */
1910 
1911 static asection  v850_elf_scom_section;
1912 static asymbol   v850_elf_scom_symbol;
1913 static asymbol * v850_elf_scom_symbol_ptr;
1914 static asection  v850_elf_tcom_section;
1915 static asymbol   v850_elf_tcom_symbol;
1916 static asymbol * v850_elf_tcom_symbol_ptr;
1917 static asection  v850_elf_zcom_section;
1918 static asymbol   v850_elf_zcom_symbol;
1919 static asymbol * v850_elf_zcom_symbol_ptr;
1920 
1921 /* Given a BFD section, try to locate the
1922    corresponding ELF section index.  */
1923 
1924 static bfd_boolean
v850_elf_section_from_bfd_section(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,int * retval)1925 v850_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
1926 				   asection *sec,
1927 				   int *retval)
1928 {
1929   if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
1930     *retval = SHN_V850_SCOMMON;
1931   else if (strcmp (bfd_get_section_name (abfd, sec), ".tcommon") == 0)
1932     *retval = SHN_V850_TCOMMON;
1933   else if (strcmp (bfd_get_section_name (abfd, sec), ".zcommon") == 0)
1934     *retval = SHN_V850_ZCOMMON;
1935   else
1936     return FALSE;
1937 
1938   return TRUE;
1939 }
1940 
1941 /* Handle the special V850 section numbers that a symbol may use.  */
1942 
1943 static void
v850_elf_symbol_processing(bfd * abfd,asymbol * asym)1944 v850_elf_symbol_processing (bfd *abfd, asymbol *asym)
1945 {
1946   elf_symbol_type * elfsym = (elf_symbol_type *) asym;
1947   unsigned int indx;
1948 
1949   indx = elfsym->internal_elf_sym.st_shndx;
1950 
1951   /* If the section index is an "ordinary" index, then it may
1952      refer to a v850 specific section created by the assembler.
1953      Check the section's type and change the index it matches.
1954 
1955      FIXME: Should we alter the st_shndx field as well ?  */
1956 
1957   if (indx < elf_numsections (abfd))
1958     switch (elf_elfsections(abfd)[indx]->sh_type)
1959       {
1960       case SHT_V850_SCOMMON:
1961 	indx = SHN_V850_SCOMMON;
1962 	break;
1963 
1964       case SHT_V850_TCOMMON:
1965 	indx = SHN_V850_TCOMMON;
1966 	break;
1967 
1968       case SHT_V850_ZCOMMON:
1969 	indx = SHN_V850_ZCOMMON;
1970 	break;
1971 
1972       default:
1973 	break;
1974       }
1975 
1976   switch (indx)
1977     {
1978     case SHN_V850_SCOMMON:
1979       if (v850_elf_scom_section.name == NULL)
1980 	{
1981 	  /* Initialize the small common section.  */
1982 	  v850_elf_scom_section.name           = ".scommon";
1983 	  v850_elf_scom_section.flags          = SEC_IS_COMMON | SEC_ALLOC | SEC_DATA;
1984 	  v850_elf_scom_section.output_section = & v850_elf_scom_section;
1985 	  v850_elf_scom_section.symbol         = & v850_elf_scom_symbol;
1986 	  v850_elf_scom_section.symbol_ptr_ptr = & v850_elf_scom_symbol_ptr;
1987 	  v850_elf_scom_symbol.name            = ".scommon";
1988 	  v850_elf_scom_symbol.flags           = BSF_SECTION_SYM;
1989 	  v850_elf_scom_symbol.section         = & v850_elf_scom_section;
1990 	  v850_elf_scom_symbol_ptr             = & v850_elf_scom_symbol;
1991 	}
1992       asym->section = & v850_elf_scom_section;
1993       asym->value = elfsym->internal_elf_sym.st_size;
1994       break;
1995 
1996     case SHN_V850_TCOMMON:
1997       if (v850_elf_tcom_section.name == NULL)
1998 	{
1999 	  /* Initialize the tcommon section.  */
2000 	  v850_elf_tcom_section.name           = ".tcommon";
2001 	  v850_elf_tcom_section.flags          = SEC_IS_COMMON;
2002 	  v850_elf_tcom_section.output_section = & v850_elf_tcom_section;
2003 	  v850_elf_tcom_section.symbol         = & v850_elf_tcom_symbol;
2004 	  v850_elf_tcom_section.symbol_ptr_ptr = & v850_elf_tcom_symbol_ptr;
2005 	  v850_elf_tcom_symbol.name            = ".tcommon";
2006 	  v850_elf_tcom_symbol.flags           = BSF_SECTION_SYM;
2007 	  v850_elf_tcom_symbol.section         = & v850_elf_tcom_section;
2008 	  v850_elf_tcom_symbol_ptr             = & v850_elf_tcom_symbol;
2009 	}
2010       asym->section = & v850_elf_tcom_section;
2011       asym->value = elfsym->internal_elf_sym.st_size;
2012       break;
2013 
2014     case SHN_V850_ZCOMMON:
2015       if (v850_elf_zcom_section.name == NULL)
2016 	{
2017 	  /* Initialize the zcommon section.  */
2018 	  v850_elf_zcom_section.name           = ".zcommon";
2019 	  v850_elf_zcom_section.flags          = SEC_IS_COMMON;
2020 	  v850_elf_zcom_section.output_section = & v850_elf_zcom_section;
2021 	  v850_elf_zcom_section.symbol         = & v850_elf_zcom_symbol;
2022 	  v850_elf_zcom_section.symbol_ptr_ptr = & v850_elf_zcom_symbol_ptr;
2023 	  v850_elf_zcom_symbol.name            = ".zcommon";
2024 	  v850_elf_zcom_symbol.flags           = BSF_SECTION_SYM;
2025 	  v850_elf_zcom_symbol.section         = & v850_elf_zcom_section;
2026 	  v850_elf_zcom_symbol_ptr             = & v850_elf_zcom_symbol;
2027 	}
2028       asym->section = & v850_elf_zcom_section;
2029       asym->value = elfsym->internal_elf_sym.st_size;
2030       break;
2031     }
2032 }
2033 
2034 /* Hook called by the linker routine which adds symbols from an object
2035    file.  We must handle the special v850 section numbers here.  */
2036 
2037 static bfd_boolean
v850_elf_add_symbol_hook(bfd * abfd,struct bfd_link_info * info ATTRIBUTE_UNUSED,Elf_Internal_Sym * sym,const char ** namep ATTRIBUTE_UNUSED,flagword * flagsp ATTRIBUTE_UNUSED,asection ** secp,bfd_vma * valp)2038 v850_elf_add_symbol_hook (bfd *abfd,
2039 			  struct bfd_link_info *info ATTRIBUTE_UNUSED,
2040 			  Elf_Internal_Sym *sym,
2041 			  const char **namep ATTRIBUTE_UNUSED,
2042 			  flagword *flagsp ATTRIBUTE_UNUSED,
2043 			  asection **secp,
2044 			  bfd_vma *valp)
2045 {
2046   unsigned int indx = sym->st_shndx;
2047 
2048   /* If the section index is an "ordinary" index, then it may
2049      refer to a v850 specific section created by the assembler.
2050      Check the section's type and change the index it matches.
2051 
2052      FIXME: Should we alter the st_shndx field as well ?  */
2053 
2054   if (indx < elf_numsections (abfd))
2055     switch (elf_elfsections(abfd)[indx]->sh_type)
2056       {
2057       case SHT_V850_SCOMMON:
2058 	indx = SHN_V850_SCOMMON;
2059 	break;
2060 
2061       case SHT_V850_TCOMMON:
2062 	indx = SHN_V850_TCOMMON;
2063 	break;
2064 
2065       case SHT_V850_ZCOMMON:
2066 	indx = SHN_V850_ZCOMMON;
2067 	break;
2068 
2069       default:
2070 	break;
2071       }
2072 
2073   switch (indx)
2074     {
2075     case SHN_V850_SCOMMON:
2076       *secp = bfd_make_section_old_way (abfd, ".scommon");
2077       (*secp)->flags |= SEC_IS_COMMON;
2078       *valp = sym->st_size;
2079       break;
2080 
2081     case SHN_V850_TCOMMON:
2082       *secp = bfd_make_section_old_way (abfd, ".tcommon");
2083       (*secp)->flags |= SEC_IS_COMMON;
2084       *valp = sym->st_size;
2085       break;
2086 
2087     case SHN_V850_ZCOMMON:
2088       *secp = bfd_make_section_old_way (abfd, ".zcommon");
2089       (*secp)->flags |= SEC_IS_COMMON;
2090       *valp = sym->st_size;
2091       break;
2092     }
2093 
2094   return TRUE;
2095 }
2096 
2097 static bfd_boolean
v850_elf_link_output_symbol_hook(struct bfd_link_info * info ATTRIBUTE_UNUSED,const char * name ATTRIBUTE_UNUSED,Elf_Internal_Sym * sym,asection * input_sec,struct elf_link_hash_entry * h ATTRIBUTE_UNUSED)2098 v850_elf_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
2099 				  const char *name ATTRIBUTE_UNUSED,
2100 				  Elf_Internal_Sym *sym,
2101 				  asection *input_sec,
2102 				  struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
2103 {
2104   /* If we see a common symbol, which implies a relocatable link, then
2105      if a symbol was in a special common section in an input file, mark
2106      it as a special common in the output file.  */
2107 
2108   if (sym->st_shndx == SHN_COMMON)
2109     {
2110       if (strcmp (input_sec->name, ".scommon") == 0)
2111 	sym->st_shndx = SHN_V850_SCOMMON;
2112       else if (strcmp (input_sec->name, ".tcommon") == 0)
2113 	sym->st_shndx = SHN_V850_TCOMMON;
2114       else if (strcmp (input_sec->name, ".zcommon") == 0)
2115 	sym->st_shndx = SHN_V850_ZCOMMON;
2116     }
2117 
2118   return TRUE;
2119 }
2120 
2121 static bfd_boolean
v850_elf_section_from_shdr(bfd * abfd,Elf_Internal_Shdr * hdr,const char * name,int shindex)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
v850_elf_fake_sections(bfd * abfd ATTRIBUTE_UNUSED,Elf_Internal_Shdr * hdr,asection * sec)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
v850_elf_relax_delete_bytes(bfd * abfd,asection * sec,bfd_vma addr,bfd_vma toaddr,int count)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 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 (index = 0; esym < esymend; esym ++, 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) [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
v850_elf_relax_section(bfd * abfd,asection * sec,struct bfd_link_info * link_info,bfd_boolean * again)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   { ".call_table_data", 16,  0, SHT_PROGBITS,     (SHF_ALLOC
3030                                                    + SHF_WRITE) },
3031   { ".call_table_text", 16,  0, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3032                                                    + SHF_EXECINSTR) },
3033   { ".rosdata",          8, -2, SHT_PROGBITS,     (SHF_ALLOC
3034                                                    + SHF_V850_GPREL) },
3035   { ".rozdata",          8, -2, SHT_PROGBITS,     (SHF_ALLOC
3036                                                    + SHF_V850_R0REL) },
3037   { ".sbss",             5, -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
3038                                                    + SHF_V850_GPREL) },
3039   { ".scommon",          8, -2, SHT_V850_SCOMMON, (SHF_ALLOC + SHF_WRITE
3040                                                    + SHF_V850_GPREL) },
3041   { ".sdata",            6, -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3042                                                    + SHF_V850_GPREL) },
3043   { ".tbss",             5, -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
3044                                                    + SHF_V850_EPREL) },
3045   { ".tcommon",          8, -2, SHT_V850_TCOMMON, (SHF_ALLOC + SHF_WRITE
3046                                                    + SHF_V850_R0REL) },
3047   { ".tdata",            6, -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3048                                                    + SHF_V850_EPREL) },
3049   { ".zbss",             5, -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
3050                                                    + SHF_V850_R0REL) },
3051   { ".zcommon",          8, -2, SHT_V850_ZCOMMON, (SHF_ALLOC + SHF_WRITE
3052                                                    + SHF_V850_R0REL) },
3053   { ".zdata",            6, -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3054                                                    + SHF_V850_R0REL) },
3055   { NULL,        0, 0, 0,            0 }
3056 };
3057 
3058 #define TARGET_LITTLE_SYM			bfd_elf32_v850_vec
3059 #define TARGET_LITTLE_NAME			"elf32-v850"
3060 #define ELF_ARCH				bfd_arch_v850
3061 #define ELF_MACHINE_CODE			EM_V850
3062 #define ELF_MACHINE_ALT1			EM_CYGNUS_V850
3063 #define ELF_MACHINE_ALT2			EM_V800 /* This is the value used by the GreenHills toolchain.  */
3064 #define ELF_MAXPAGESIZE				0x1000
3065 
3066 #define elf_info_to_howto			v850_elf_info_to_howto_rela
3067 #define elf_info_to_howto_rel			v850_elf_info_to_howto_rel
3068 
3069 #define elf_backend_check_relocs		v850_elf_check_relocs
3070 #define elf_backend_relocate_section    	v850_elf_relocate_section
3071 #define elf_backend_object_p			v850_elf_object_p
3072 #define elf_backend_final_write_processing 	v850_elf_final_write_processing
3073 #define elf_backend_section_from_bfd_section 	v850_elf_section_from_bfd_section
3074 #define elf_backend_symbol_processing		v850_elf_symbol_processing
3075 #define elf_backend_add_symbol_hook		v850_elf_add_symbol_hook
3076 #define elf_backend_link_output_symbol_hook 	v850_elf_link_output_symbol_hook
3077 #define elf_backend_section_from_shdr		v850_elf_section_from_shdr
3078 #define elf_backend_fake_sections		v850_elf_fake_sections
3079 #define elf_backend_gc_mark_hook                v850_elf_gc_mark_hook
3080 #define elf_backend_gc_sweep_hook               v850_elf_gc_sweep_hook
3081 #define elf_backend_special_sections		v850_elf_special_sections
3082 
3083 #define elf_backend_can_gc_sections 1
3084 #define elf_backend_rela_normal 1
3085 
3086 #define bfd_elf32_bfd_is_local_label_name	v850_elf_is_local_label_name
3087 #define bfd_elf32_bfd_reloc_type_lookup		v850_elf_reloc_type_lookup
3088 #define bfd_elf32_bfd_merge_private_bfd_data 	v850_elf_merge_private_bfd_data
3089 #define bfd_elf32_bfd_set_private_flags		v850_elf_set_private_flags
3090 #define bfd_elf32_bfd_print_private_bfd_data	v850_elf_print_private_bfd_data
3091 #define bfd_elf32_bfd_relax_section		v850_elf_relax_section
3092 
3093 #define elf_symbol_leading_char			'_'
3094 
3095 #include "elf32-target.h"
3096