1 /* V850-specific support for 32-bit ELF
2    Copyright (C) 1996-2014 Free Software Foundation, Inc.
3 
4    This file is part of BFD, the Binary File Descriptor library.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20 
21 
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 "sysdep.h"
26 #include "bfd.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 17-bit number.  */
34 #define SEXT17(x)	((((x) & 0x1ffff) ^ 0x10000) - 0x10000)
35 
36 /* Sign-extend a 22-bit number.  */
37 #define SEXT22(x)	((((x) & 0x3fffff) ^ 0x200000) - 0x200000)
38 
39 static reloc_howto_type v850_elf_howto_table[];
40 
41 /* Look through the relocs for a section during the first phase, and
42    allocate space in the global offset table or procedure linkage
43    table.  */
44 
45 static bfd_boolean
v850_elf_check_relocs(bfd * abfd,struct bfd_link_info * info,asection * sec,const Elf_Internal_Rela * relocs)46 v850_elf_check_relocs (bfd *abfd,
47 		       struct bfd_link_info *info,
48 		       asection *sec,
49 		       const Elf_Internal_Rela *relocs)
50 {
51   bfd_boolean ret = TRUE;
52   Elf_Internal_Shdr *symtab_hdr;
53   struct elf_link_hash_entry **sym_hashes;
54   const Elf_Internal_Rela *rel;
55   const Elf_Internal_Rela *rel_end;
56   unsigned int r_type;
57   int other = 0;
58   const char *common = NULL;
59 
60   if (info->relocatable)
61     return TRUE;
62 
63 #ifdef DEBUG
64   _bfd_error_handler ("v850_elf_check_relocs called for section %A in %B",
65 		      sec, abfd);
66 #endif
67 
68   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
69   sym_hashes = elf_sym_hashes (abfd);
70 
71   rel_end = relocs + sec->reloc_count;
72   for (rel = relocs; rel < rel_end; rel++)
73     {
74       unsigned long r_symndx;
75       struct elf_link_hash_entry *h;
76 
77       r_symndx = ELF32_R_SYM (rel->r_info);
78       if (r_symndx < symtab_hdr->sh_info)
79 	h = NULL;
80       else
81 	{
82 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
83 	  while (h->root.type == bfd_link_hash_indirect
84 		 || h->root.type == bfd_link_hash_warning)
85 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
86 
87 	  /* PR15323, ref flags aren't set for references in the same
88 	     object.  */
89 	  h->root.non_ir_ref = 1;
90 	}
91 
92       r_type = ELF32_R_TYPE (rel->r_info);
93       switch (r_type)
94 	{
95 	default:
96 	  break;
97 
98         /* This relocation describes the C++ object vtable hierarchy.
99            Reconstruct it for later use during GC.  */
100         case R_V850_GNU_VTINHERIT:
101           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
102             return FALSE;
103           break;
104 
105         /* This relocation describes which C++ vtable entries
106 	   are actually used.  Record for later use during GC.  */
107         case R_V850_GNU_VTENTRY:
108           BFD_ASSERT (h != NULL);
109           if (h != NULL
110               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
111             return FALSE;
112           break;
113 
114 	case R_V850_SDA_16_16_SPLIT_OFFSET:
115 	case R_V850_SDA_16_16_OFFSET:
116 	case R_V850_SDA_15_16_OFFSET:
117 	case R_V810_GPWLO_1:
118 	case R_V850_HWLO:
119 	case R_V850_HWLO_1:
120 	  other = V850_OTHER_SDA;
121 	  common = ".scommon";
122 	  goto small_data_common;
123 
124 	case R_V850_ZDA_16_16_SPLIT_OFFSET:
125 	case R_V850_ZDA_16_16_OFFSET:
126 	case R_V850_ZDA_15_16_OFFSET:
127 	  other = V850_OTHER_ZDA;
128 	  common = ".zcommon";
129 	  goto small_data_common;
130 
131 	case R_V850_TDA_4_4_OFFSET:
132 	case R_V850_TDA_4_5_OFFSET:
133 	case R_V850_TDA_7_7_OFFSET:
134 	case R_V850_TDA_6_8_OFFSET:
135 	case R_V850_TDA_7_8_OFFSET:
136 	case R_V850_TDA_16_16_OFFSET:
137 	  other = V850_OTHER_TDA;
138 	  common = ".tcommon";
139 	  /* fall through */
140 
141 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
142 
143 	small_data_common:
144 	  if (h)
145 	    {
146 	      /* Flag which type of relocation was used.  */
147 	      h->other |= other;
148 	      if ((h->other & V850_OTHER_MASK) != (other & V850_OTHER_MASK)
149 		  && (h->other & V850_OTHER_ERROR) == 0)
150 		{
151 		  const char * msg;
152 		  static char  buff[200]; /* XXX */
153 
154 		  switch (h->other & V850_OTHER_MASK)
155 		    {
156 		    default:
157 		      msg = _("Variable `%s' cannot occupy in multiple small data regions");
158 		      break;
159 		    case V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA:
160 		      msg = _("Variable `%s' can only be in one of the small, zero, and tiny data regions");
161 		      break;
162 		    case V850_OTHER_SDA | V850_OTHER_ZDA:
163 		      msg = _("Variable `%s' cannot be in both small and zero data regions simultaneously");
164 		      break;
165 		    case V850_OTHER_SDA | V850_OTHER_TDA:
166 		      msg = _("Variable `%s' cannot be in both small and tiny data regions simultaneously");
167 		      break;
168 		    case V850_OTHER_ZDA | V850_OTHER_TDA:
169 		      msg = _("Variable `%s' cannot be in both zero and tiny data regions simultaneously");
170 		      break;
171 		    }
172 
173 		  sprintf (buff, msg, h->root.root.string);
174 		  info->callbacks->warning (info, buff, h->root.root.string,
175 					    abfd, h->root.u.def.section,
176 					    (bfd_vma) 0);
177 
178 		  bfd_set_error (bfd_error_bad_value);
179 		  h->other |= V850_OTHER_ERROR;
180 		  ret = FALSE;
181 		}
182 	    }
183 
184 	  if (h && h->root.type == bfd_link_hash_common
185 	      && h->root.u.c.p
186 	      && !strcmp (bfd_get_section_name (abfd, h->root.u.c.p->section), "COMMON"))
187 	    {
188 	      asection * section;
189 
190 	      section = h->root.u.c.p->section = bfd_make_section_old_way (abfd, common);
191 	      section->flags |= SEC_IS_COMMON;
192 	    }
193 
194 #ifdef DEBUG
195 	  fprintf (stderr, "v850_elf_check_relocs, found %s relocation for %s%s\n",
196 		   v850_elf_howto_table[ (int)r_type ].name,
197 		   (h && h->root.root.string) ? h->root.root.string : "<unknown>",
198 		   (h->root.type == bfd_link_hash_common) ? ", symbol is common" : "");
199 #endif
200 	  break;
201 	}
202     }
203 
204   return ret;
205 }
206 
207 /* In the old version, when an entry was checked out from the table,
208    it was deleted.  This produced an error if the entry was needed
209    more than once, as the second attempted retry failed.
210 
211    In the current version, the entry is not deleted, instead we set
212    the field 'found' to TRUE.  If a second lookup matches the same
213    entry, then we know that the hi16s reloc has already been updated
214    and does not need to be updated a second time.
215 
216    TODO - TOFIX: If it is possible that we need to restore 2 different
217    addresses from the same table entry, where the first generates an
218    overflow, whilst the second do not, then this code will fail.  */
219 
220 typedef struct hi16s_location
221 {
222   bfd_vma                 addend;
223   bfd_byte *              address;
224   unsigned long           counter;
225   bfd_boolean             found;
226   struct hi16s_location * next;
227 }
228 hi16s_location;
229 
230 static hi16s_location * previous_hi16s;
231 static hi16s_location * free_hi16s;
232 static unsigned long    hi16s_counter;
233 
234 static void
remember_hi16s_reloc(bfd * abfd,bfd_vma addend,bfd_byte * address)235 remember_hi16s_reloc (bfd *abfd, bfd_vma addend, bfd_byte *address)
236 {
237   hi16s_location * entry = NULL;
238   bfd_size_type amt = sizeof (* free_hi16s);
239 
240   /* Find a free structure.  */
241   if (free_hi16s == NULL)
242     free_hi16s = bfd_zalloc (abfd, amt);
243 
244   entry      = free_hi16s;
245   free_hi16s = free_hi16s->next;
246 
247   entry->addend  = addend;
248   entry->address = address;
249   entry->counter = hi16s_counter ++;
250   entry->found   = FALSE;
251   entry->next    = previous_hi16s;
252   previous_hi16s = entry;
253 
254   /* Cope with wrap around of our counter.  */
255   if (hi16s_counter == 0)
256     {
257       /* XXX: Assume that all counter entries differ only in their low 16 bits.  */
258       for (entry = previous_hi16s; entry != NULL; entry = entry->next)
259 	entry->counter &= 0xffff;
260 
261       hi16s_counter = 0x10000;
262     }
263 }
264 
265 static bfd_byte *
find_remembered_hi16s_reloc(bfd_vma addend,bfd_boolean * already_found)266 find_remembered_hi16s_reloc (bfd_vma addend, bfd_boolean *already_found)
267 {
268   hi16s_location *match = NULL;
269   hi16s_location *entry;
270   bfd_byte *addr;
271 
272   /* Search the table.  Record the most recent entry that matches.  */
273   for (entry = previous_hi16s; entry; entry = entry->next)
274     {
275       if (entry->addend == addend
276 	  && (match == NULL || match->counter < entry->counter))
277 	{
278 	  match    = entry;
279 	}
280     }
281 
282   if (match == NULL)
283     return NULL;
284 
285   /* Extract the address.  */
286   addr = match->address;
287 
288   /* Remember if this entry has already been used before.  */
289   if (already_found)
290     * already_found = match->found;
291 
292   /* Note that this entry has now been used.  */
293   match->found = TRUE;
294 
295   return addr;
296 }
297 
298 /* Calculate the final operand value for a R_V850_LO16 or
299    R_V850_LO16_SPLIT_OFFSET.  *INSN is the current operand value and
300    ADDEND is the sum of the relocation symbol and offset.  Store the
301    operand value in *INSN and return true on success.
302 
303    The assembler has already done some of this: If the value stored in
304    the instruction has its 15th bit set, (counting from zero) then the
305    assembler will have added 1 to the value stored in the associated
306    HI16S reloc.  So for example, these relocations:
307 
308        movhi hi( fred ), r0, r1
309        movea lo( fred ), r1, r1
310 
311    will store 0 in the value fields for the MOVHI and MOVEA instructions
312    and addend will be the address of fred, but for these instructions:
313 
314        movhi hi( fred + 0x123456 ), r0, r1
315        movea lo( fred + 0x123456 ), r1, r1
316 
317    the value stored in the MOVHI instruction will be 0x12 and the value
318    stored in the MOVEA instruction will be 0x3456.  If however the
319    instructions were:
320 
321        movhi hi( fred + 0x10ffff ), r0, r1
322        movea lo( fred + 0x10ffff ), r1, r1
323 
324    then the value stored in the MOVHI instruction would be 0x11 (not
325    0x10) and the value stored in the MOVEA instruction would be 0xffff.
326    Thus (assuming for the moment that the addend is 0), at run time the
327    MOVHI instruction loads 0x110000 into r1, then the MOVEA instruction
328    adds 0xffffffff (sign extension!) producing 0x10ffff.  Similarly if
329    the instructions were:
330 
331        movhi hi( fred - 1 ), r0, r1
332        movea lo( fred - 1 ), r1, r1
333 
334    then 0 is stored in the MOVHI instruction and -1 is stored in the
335    MOVEA instruction.
336 
337    Overflow can occur if the addition of the value stored in the
338    instruction plus the addend sets the 15th bit when before it was clear.
339    This is because the 15th bit will be sign extended into the high part,
340    thus reducing its value by one, but since the 15th bit was originally
341    clear, the assembler will not have added 1 to the previous HI16S reloc
342    to compensate for this effect.  For example:
343 
344       movhi hi( fred + 0x123456 ), r0, r1
345       movea lo( fred + 0x123456 ), r1, r1
346 
347    The value stored in HI16S reloc is 0x12, the value stored in the LO16
348    reloc is 0x3456.  If we assume that the address of fred is 0x00007000
349    then the relocations become:
350 
351      HI16S: 0x0012 + (0x00007000 >> 16)    = 0x12
352      LO16:  0x3456 + (0x00007000 & 0xffff) = 0xa456
353 
354    but when the instructions are executed, the MOVEA instruction's value
355    is signed extended, so the sum becomes:
356 
357 	0x00120000
358       + 0xffffa456
359       ------------
360 	0x0011a456    but 'fred + 0x123456' = 0x0012a456
361 
362    Note that if the 15th bit was set in the value stored in the LO16
363    reloc, then we do not have to do anything:
364 
365       movhi hi( fred + 0x10ffff ), r0, r1
366       movea lo( fred + 0x10ffff ), r1, r1
367 
368       HI16S:  0x0011 + (0x00007000 >> 16)    = 0x11
369       LO16:   0xffff + (0x00007000 & 0xffff) = 0x6fff
370 
371 	0x00110000
372       + 0x00006fff
373       ------------
374 	0x00116fff  = fred + 0x10ffff = 0x7000 + 0x10ffff
375 
376    Overflow can also occur if the computation carries into the 16th bit
377    and it also results in the 15th bit having the same value as the 15th
378    bit of the original value.   What happens is that the HI16S reloc
379    will have already examined the 15th bit of the original value and
380    added 1 to the high part if the bit is set.  This compensates for the
381    sign extension of 15th bit of the result of the computation.  But now
382    there is a carry into the 16th bit, and this has not been allowed for.
383 
384    So, for example if fred is at address 0xf000:
385 
386      movhi hi( fred + 0xffff ), r0, r1    [bit 15 of the offset is set]
387      movea lo( fred + 0xffff ), r1, r1
388 
389      HI16S: 0x0001 + (0x0000f000 >> 16)    = 0x0001
390      LO16:  0xffff + (0x0000f000 & 0xffff) = 0xefff   (carry into bit 16 is lost)
391 
392        0x00010000
393      + 0xffffefff
394      ------------
395        0x0000efff   but 'fred + 0xffff' = 0x0001efff
396 
397    Similarly, if the 15th bit remains clear, but overflow occurs into
398    the 16th bit then (assuming the address of fred is 0xf000):
399 
400      movhi hi( fred + 0x7000 ), r0, r1    [bit 15 of the offset is clear]
401      movea lo( fred + 0x7000 ), r1, r1
402 
403      HI16S: 0x0000 + (0x0000f000 >> 16)    = 0x0000
404      LO16:  0x7000 + (0x0000f000 & 0xffff) = 0x6fff  (carry into bit 16 is lost)
405 
406        0x00000000
407      + 0x00006fff
408      ------------
409        0x00006fff   but 'fred + 0x7000' = 0x00016fff
410 
411    Note - there is no need to change anything if a carry occurs, and the
412    15th bit changes its value from being set to being clear, as the HI16S
413    reloc will have already added in 1 to the high part for us:
414 
415      movhi hi( fred + 0xffff ), r0, r1     [bit 15 of the offset is set]
416      movea lo( fred + 0xffff ), r1, r1
417 
418      HI16S: 0x0001 + (0x00007000 >> 16)
419      LO16:  0xffff + (0x00007000 & 0xffff) = 0x6fff  (carry into bit 16 is lost)
420 
421        0x00010000
422      + 0x00006fff   (bit 15 not set, so the top half is zero)
423      ------------
424        0x00016fff   which is right (assuming that fred is at 0x7000)
425 
426    but if the 15th bit goes from being clear to being set, then we must
427    once again handle overflow:
428 
429      movhi hi( fred + 0x7000 ), r0, r1     [bit 15 of the offset is clear]
430      movea lo( fred + 0x7000 ), r1, r1
431 
432      HI16S: 0x0000 + (0x0000ffff >> 16)
433      LO16:  0x7000 + (0x0000ffff & 0xffff) = 0x6fff  (carry into bit 16)
434 
435        0x00000000
436      + 0x00006fff   (bit 15 not set, so the top half is zero)
437      ------------
438        0x00006fff   which is wrong (assuming that fred is at 0xffff).  */
439 
440 static bfd_boolean
v850_elf_perform_lo16_relocation(bfd * abfd,unsigned long * insn,unsigned long addend)441 v850_elf_perform_lo16_relocation (bfd *abfd, unsigned long *insn,
442 				  unsigned long addend)
443 {
444 #define BIT15_SET(x) ((x) & 0x8000)
445 #define OVERFLOWS(a,i) ((((a) & 0xffff) + (i)) > 0xffff)
446 
447   if ((BIT15_SET (*insn + addend) && ! BIT15_SET (addend))
448       || (OVERFLOWS (addend, *insn)
449 	  && ((! BIT15_SET (*insn)) || (BIT15_SET (addend)))))
450     {
451       bfd_boolean already_updated;
452       bfd_byte *hi16s_address = find_remembered_hi16s_reloc
453 	(addend, & already_updated);
454 
455       /* Amend the matching HI16_S relocation.  */
456       if (hi16s_address != NULL)
457 	{
458 	  if (! already_updated)
459 	    {
460 	      unsigned long hi_insn = bfd_get_16 (abfd, hi16s_address);
461 	      hi_insn += 1;
462 	      bfd_put_16 (abfd, hi_insn, hi16s_address);
463 	    }
464 	}
465       else
466 	{
467 	  (*_bfd_error_handler) (_("FAILED to find previous HI16 reloc"));
468 	  return FALSE;
469 	}
470     }
471 #undef OVERFLOWS
472 #undef BIT15_SET
473 
474   /* Do not complain if value has top bit set, as this has been
475      anticipated.  */
476   *insn = (*insn + addend) & 0xffff;
477   return TRUE;
478 }
479 
480 /* FIXME:  The code here probably ought to be removed and the code in reloc.c
481    allowed to do its stuff instead.  At least for most of the relocs, anyway.  */
482 
483 static bfd_reloc_status_type
v850_elf_perform_relocation(bfd * abfd,unsigned int r_type,bfd_vma addend,bfd_byte * address)484 v850_elf_perform_relocation (bfd *abfd,
485 			     unsigned int r_type,
486 			     bfd_vma addend,
487 			     bfd_byte *address)
488 {
489   unsigned long insn;
490   unsigned long result;
491   bfd_signed_vma saddend = (bfd_signed_vma) addend;
492 
493   switch (r_type)
494     {
495     default:
496 #ifdef DEBUG
497       fprintf (stderr, "reloc number %d not recognised\n", r_type);
498 #endif
499       return bfd_reloc_notsupported;
500 
501     case R_V850_REL32:
502     case R_V850_ABS32:
503     case R_V810_WORD:
504     case R_V850_PC32:
505       bfd_put_32 (abfd, addend, address);
506       return bfd_reloc_ok;
507 
508     case R_V850_WLO23:
509     case R_V850_23:
510       insn  = bfd_get_32 (abfd, address);
511       insn &= ~((0x7f << 4) | (0x7fff80 << (16-7)));
512       insn |= ((addend & 0x7f) << 4) | ((addend & 0x7fff80) << (16-7));
513       bfd_put_32 (abfd, (bfd_vma) insn, address);
514       return bfd_reloc_ok;
515 
516     case R_V850_PCR22:
517     case R_V850_22_PCREL:
518       if (saddend > 0x1fffff || saddend < -0x200000)
519 	return bfd_reloc_overflow;
520 
521       if ((addend % 2) != 0)
522 	return bfd_reloc_dangerous;
523 
524       insn  = bfd_get_32 (abfd, address);
525       insn &= ~0xfffe003f;
526       insn |= (((addend & 0xfffe) << 16) | ((addend & 0x3f0000) >> 16));
527       bfd_put_32 (abfd, (bfd_vma) insn, address);
528       return bfd_reloc_ok;
529 
530     case R_V850_PC17:
531     case R_V850_17_PCREL:
532       if (saddend > 0xffff || saddend < -0x10000)
533 	return bfd_reloc_overflow;
534 
535       if ((addend % 2) != 0)
536 	return bfd_reloc_dangerous;
537 
538       insn  = bfd_get_32 (abfd, address);
539       insn &= ~ 0xfffe0010;
540       insn |= ((addend & 0xfffe) << 16) | ((addend & 0x10000) >> (16-4));
541       break;
542 
543     case R_V850_PC16U:
544     case R_V850_16_PCREL:
545       if ((saddend < -0xffff) || (saddend > 0))
546 	return bfd_reloc_overflow;
547 
548       if ((addend % 2) != 0)
549 	return bfd_reloc_dangerous;
550 
551       insn  = bfd_get_16 (abfd, address);
552       insn &= ~0xfffe;
553       insn |= (-addend & 0xfffe);
554       break;
555 
556     case R_V850_PC9:
557     case R_V850_9_PCREL:
558       if (saddend > 0xff || saddend < -0x100)
559 	return bfd_reloc_overflow;
560 
561       if ((addend % 2) != 0)
562 	return bfd_reloc_dangerous;
563 
564       insn  = bfd_get_16 (abfd, address);
565       insn &= ~ 0xf870;
566       insn |= ((addend & 0x1f0) << 7) | ((addend & 0x0e) << 3);
567       break;
568 
569     case R_V810_WHI:
570     case R_V850_HI16:
571       addend += (bfd_get_16 (abfd, address) << 16);
572       addend = (addend >> 16);
573       insn = addend;
574       break;
575 
576     case R_V810_WHI1:
577     case R_V850_HI16_S:
578       /* Remember where this relocation took place.  */
579       remember_hi16s_reloc (abfd, addend, address);
580 
581       addend += (bfd_get_16 (abfd, address) << 16);
582       addend = (addend >> 16) + ((addend & 0x8000) != 0);
583 
584       /* This relocation cannot overflow.  */
585       if (addend > 0xffff)
586 	addend = 0;
587 
588       insn = addend;
589       break;
590 
591     case R_V810_WLO:
592     case R_V850_LO16:
593       insn = bfd_get_16 (abfd, address);
594       if (! v850_elf_perform_lo16_relocation (abfd, &insn, addend))
595 	return bfd_reloc_overflow;
596       break;
597 
598     case R_V810_BYTE:
599     case R_V850_8:
600       addend += (char) bfd_get_8 (abfd, address);
601 
602       saddend = (bfd_signed_vma) addend;
603 
604       if (saddend > 0x7f || saddend < -0x80)
605 	return bfd_reloc_overflow;
606 
607       bfd_put_8 (abfd, addend, address);
608       return bfd_reloc_ok;
609 
610     case R_V850_CALLT_16_16_OFFSET:
611       addend += bfd_get_16 (abfd, address);
612 
613       saddend = (bfd_signed_vma) addend;
614 
615       if (saddend > 0xffff || saddend < 0)
616 	return bfd_reloc_overflow;
617 
618       insn = addend;
619       break;
620 
621     case R_V850_CALLT_15_16_OFFSET:
622       insn = bfd_get_16 (abfd, address);
623 
624       addend += insn & 0xfffe;
625 
626       saddend = (bfd_signed_vma) addend;
627 
628       if (saddend > 0xffff || saddend < 0)
629 	return bfd_reloc_overflow;
630 
631       insn = (0xfffe & addend)
632 	| (insn & ~0xfffe);
633       break;
634 
635     case R_V850_CALLT_6_7_OFFSET:
636       insn = bfd_get_16 (abfd, address);
637       addend += ((insn & 0x3f) << 1);
638 
639       saddend = (bfd_signed_vma) addend;
640 
641       if (saddend > 0x7e || saddend < 0)
642 	return bfd_reloc_overflow;
643 
644       if (addend & 1)
645 	return bfd_reloc_dangerous;
646 
647       insn &= 0xff80;
648       insn |= (addend >> 1);
649       break;
650 
651     case R_V850_16:
652     case R_V810_HWORD:
653     case R_V850_SDA_16_16_OFFSET:
654     case R_V850_ZDA_16_16_OFFSET:
655     case R_V850_TDA_16_16_OFFSET:
656       addend += bfd_get_16 (abfd, address);
657 
658       saddend = (bfd_signed_vma) addend;
659 
660       if (saddend > 0x7fff || saddend < -0x8000)
661 	return bfd_reloc_overflow;
662 
663       insn = addend;
664       break;
665 
666     case R_V850_16_S1:
667     case R_V850_SDA_15_16_OFFSET:
668     case R_V850_ZDA_15_16_OFFSET:
669     case R_V810_GPWLO_1:
670       insn = bfd_get_16 (abfd, address);
671       addend += (insn & 0xfffe);
672 
673       saddend = (bfd_signed_vma) addend;
674 
675       if (saddend > 0x7ffe || saddend < -0x8000)
676 	return bfd_reloc_overflow;
677 
678       if (addend & 1)
679         return bfd_reloc_dangerous;
680 
681       insn = (addend &~ (bfd_vma) 1) | (insn & 1);
682       break;
683 
684     case R_V850_TDA_6_8_OFFSET:
685       insn = bfd_get_16 (abfd, address);
686       addend += ((insn & 0x7e) << 1);
687 
688       saddend = (bfd_signed_vma) addend;
689 
690       if (saddend > 0xfc || saddend < 0)
691 	return bfd_reloc_overflow;
692 
693       if (addend & 3)
694 	return bfd_reloc_dangerous;
695 
696       insn &= 0xff81;
697       insn |= (addend >> 1);
698       break;
699 
700     case R_V850_TDA_7_8_OFFSET:
701       insn = bfd_get_16 (abfd, address);
702       addend += ((insn & 0x7f) << 1);
703 
704       saddend = (bfd_signed_vma) addend;
705 
706       if (saddend > 0xfe || saddend < 0)
707 	return bfd_reloc_overflow;
708 
709       if (addend & 1)
710 	return bfd_reloc_dangerous;
711 
712       insn &= 0xff80;
713       insn |= (addend >> 1);
714       break;
715 
716     case R_V850_TDA_7_7_OFFSET:
717       insn = bfd_get_16 (abfd, address);
718       addend += insn & 0x7f;
719 
720       saddend = (bfd_signed_vma) addend;
721 
722       if (saddend > 0x7f || saddend < 0)
723 	return bfd_reloc_overflow;
724 
725       insn &= 0xff80;
726       insn |= addend;
727       break;
728 
729     case R_V850_TDA_4_5_OFFSET:
730       insn = bfd_get_16 (abfd, address);
731       addend += ((insn & 0xf) << 1);
732 
733       saddend = (bfd_signed_vma) addend;
734 
735       if (saddend > 0x1e || saddend < 0)
736 	return bfd_reloc_overflow;
737 
738       if (addend & 1)
739 	return bfd_reloc_dangerous;
740 
741       insn &= 0xfff0;
742       insn |= (addend >> 1);
743       break;
744 
745     case R_V850_TDA_4_4_OFFSET:
746       insn = bfd_get_16 (abfd, address);
747       addend += insn & 0xf;
748 
749       saddend = (bfd_signed_vma) addend;
750 
751       if (saddend > 0xf || saddend < 0)
752 	return bfd_reloc_overflow;
753 
754       insn &= 0xfff0;
755       insn |= addend;
756       break;
757 
758     case R_V810_WLO_1:
759     case R_V850_HWLO:
760     case R_V850_HWLO_1:
761     case R_V850_LO16_S1:
762       insn = bfd_get_16 (abfd, address);
763       result = insn & 0xfffe;
764       if (! v850_elf_perform_lo16_relocation (abfd, &result, addend))
765 	return bfd_reloc_overflow;
766       if (result & 1)
767 	return bfd_reloc_overflow;
768       insn = (result & 0xfffe)
769 	| (insn & ~0xfffe);
770 	bfd_put_16 (abfd, insn, address);
771       return bfd_reloc_ok;
772 
773     case R_V850_BLO:
774     case R_V850_LO16_SPLIT_OFFSET:
775       insn = bfd_get_32 (abfd, address);
776       result = ((insn & 0xfffe0000) >> 16) | ((insn & 0x20) >> 5);
777       if (! v850_elf_perform_lo16_relocation (abfd, &result, addend))
778 	return bfd_reloc_overflow;
779       insn = (((result << 16) & 0xfffe0000)
780 	      | ((result << 5) & 0x20)
781 	      | (insn & ~0xfffe0020));
782       bfd_put_32 (abfd, insn, address);
783       return bfd_reloc_ok;
784 
785     case R_V850_16_SPLIT_OFFSET:
786     case R_V850_SDA_16_16_SPLIT_OFFSET:
787     case R_V850_ZDA_16_16_SPLIT_OFFSET:
788       insn = bfd_get_32 (abfd, address);
789       addend += ((insn & 0xfffe0000) >> 16) + ((insn & 0x20) >> 5);
790 
791       saddend = (bfd_signed_vma) addend;
792 
793       if (saddend > 0x7fff || saddend < -0x8000)
794 	return bfd_reloc_overflow;
795 
796       insn &= 0x0001ffdf;
797       insn |= (addend & 1) << 5;
798       insn |= (addend &~ (bfd_vma) 1) << 16;
799 
800       bfd_put_32 (abfd, (bfd_vma) insn, address);
801       return bfd_reloc_ok;
802 
803     case R_V850_GNU_VTINHERIT:
804     case R_V850_GNU_VTENTRY:
805       return bfd_reloc_ok;
806 
807     }
808 
809   bfd_put_16 (abfd, (bfd_vma) insn, address);
810   return bfd_reloc_ok;
811 }
812 
813 /* Insert the addend into the instruction.  */
814 
815 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)816 v850_elf_reloc (bfd *abfd ATTRIBUTE_UNUSED,
817 		arelent *reloc,
818 		asymbol *symbol,
819 		void * data ATTRIBUTE_UNUSED,
820 		asection *isection,
821 		bfd *obfd,
822 		char **err ATTRIBUTE_UNUSED)
823 {
824   long relocation;
825 
826   /* If there is an output BFD,
827      and the symbol is not a section name (which is only defined at final link time),
828      and either we are not putting the addend into the instruction
829       or the addend is zero, so there is nothing to add into the instruction
830      then just fixup the address and return.  */
831   if (obfd != NULL
832       && (symbol->flags & BSF_SECTION_SYM) == 0
833       && (! reloc->howto->partial_inplace
834 	  || reloc->addend == 0))
835     {
836       reloc->address += isection->output_offset;
837       return bfd_reloc_ok;
838     }
839 
840   /* Catch relocs involving undefined symbols.  */
841   if (bfd_is_und_section (symbol->section)
842       && (symbol->flags & BSF_WEAK) == 0
843       && obfd == NULL)
844     return bfd_reloc_undefined;
845 
846   /* We handle final linking of some relocs ourselves.  */
847 
848   /* Is the address of the relocation really within the section?  */
849   if (reloc->address > bfd_get_section_limit (abfd, isection))
850     return bfd_reloc_outofrange;
851 
852   /* Work out which section the relocation is targeted at and the
853      initial relocation command value.  */
854 
855   if (reloc->howto->pc_relative)
856     return bfd_reloc_ok;
857 
858   /* Get symbol value.  (Common symbols are special.)  */
859   if (bfd_is_com_section (symbol->section))
860     relocation = 0;
861   else
862     relocation = symbol->value;
863 
864   /* Convert input-section-relative symbol value to absolute + addend.  */
865   relocation += symbol->section->output_section->vma;
866   relocation += symbol->section->output_offset;
867   relocation += reloc->addend;
868 
869   reloc->addend = relocation;
870   return bfd_reloc_ok;
871 }
872 
873 /* This function is used for relocs which are only used
874    for relaxing, which the linker should otherwise ignore.  */
875 
876 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)877 v850_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED,
878 		       arelent *reloc_entry,
879 		       asymbol *symbol ATTRIBUTE_UNUSED,
880 		       void * data ATTRIBUTE_UNUSED,
881 		       asection *input_section,
882 		       bfd *output_bfd,
883 		       char **error_message ATTRIBUTE_UNUSED)
884 {
885   if (output_bfd != NULL)
886     reloc_entry->address += input_section->output_offset;
887 
888   return bfd_reloc_ok;
889 }
890 /* Note: It is REQUIRED that the 'type' value of each entry
891    in this array match the index of the entry in the array.
892    SeeAlso: RELOC_NUBMER in include/elf/v850.h.  */
893 static reloc_howto_type v850_elf_howto_table[] =
894 {
895   /* This reloc does nothing.  */
896   HOWTO (R_V850_NONE,			/* Type.  */
897 	 0,				/* Rightshift.  */
898 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
899 	 32,				/* Bitsize.  */
900 	 FALSE,				/* PC_relative.  */
901 	 0,				/* Bitpos.  */
902 	 complain_overflow_bitfield,	/* Complain_on_overflow.  */
903 	 bfd_elf_generic_reloc,		/* Special_function.  */
904 	 "R_V850_NONE",			/* Name.  */
905 	 FALSE,				/* Partial_inplace.  */
906 	 0,				/* Src_mask.  */
907 	 0,				/* Dst_mask.  */
908 	 FALSE),			/* PCrel_offset.  */
909 
910   /* A PC relative 9 bit branch.  */
911   HOWTO (R_V850_9_PCREL,		/* Type.  */
912 	 0,				/* Rightshift.  */
913 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
914 	 9,				/* Bitsize.  */
915 	 TRUE,				/* PC_relative.  */
916 	 0,				/* Bitpos.  */
917 	 complain_overflow_bitfield,	/* Complain_on_overflow.  */
918 	 v850_elf_reloc,		/* Special_function.  */
919 	 "R_V850_9_PCREL",		/* Name.  */
920 	 FALSE,				/* Partial_inplace.  */
921 	 0x00ffffff,			/* Src_mask.  */
922 	 0x00ffffff,			/* Dst_mask.  */
923 	 TRUE),				/* PCrel_offset.  */
924 
925   /* A PC relative 22 bit branch.  */
926   HOWTO (R_V850_22_PCREL,		/* Type.  */
927 	 0,				/* Rightshift.  */
928 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
929 	 22,				/* Bitsize.  */
930 	 TRUE,				/* PC_relative.  */
931 	 0,				/* Bitpos.  */
932 	 complain_overflow_signed,	/* Complain_on_overflow.  */
933 	 v850_elf_reloc,		/* Special_function.  */
934 	 "R_V850_22_PCREL",		/* Name.  */
935 	 FALSE,				/* Partial_inplace.  */
936 	 0x07ffff80,			/* Src_mask.  */
937 	 0x07ffff80,			/* Dst_mask.  */
938 	 TRUE),				/* PCrel_offset.  */
939 
940   /* High 16 bits of symbol value.  */
941   HOWTO (R_V850_HI16_S,			/* Type.  */
942 	 0,				/* Rightshift.  */
943 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
944 	 16,				/* Bitsize.  */
945 	 FALSE,				/* PC_relative.  */
946 	 0,				/* Bitpos.  */
947 	 complain_overflow_dont,	/* Complain_on_overflow.  */
948 	 v850_elf_reloc,		/* Special_function.  */
949 	 "R_V850_HI16_S",		/* Name.  */
950 	 FALSE,				/* Partial_inplace.  */
951 	 0xffff,			/* Src_mask.  */
952 	 0xffff,			/* Dst_mask.  */
953 	 FALSE),			/* PCrel_offset.  */
954 
955   /* High 16 bits of symbol value.  */
956   HOWTO (R_V850_HI16,			/* Type.  */
957 	 0,				/* Rightshift.  */
958 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
959 	 16,				/* Bitsize.  */
960 	 FALSE,				/* PC_relative.  */
961 	 0,				/* Bitpos.  */
962 	 complain_overflow_dont,	/* Complain_on_overflow.  */
963 	 v850_elf_reloc,		/* Special_function.  */
964 	 "R_V850_HI16",			/* Name.  */
965 	 FALSE,				/* Partial_inplace.  */
966 	 0xffff,			/* Src_mask.  */
967 	 0xffff,			/* Dst_mask.  */
968 	 FALSE),			/* PCrel_offset.  */
969 
970   /* Low 16 bits of symbol value.  */
971   HOWTO (R_V850_LO16,			/* Type.  */
972 	 0,				/* Rightshift.  */
973 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
974 	 16,				/* Bitsize.  */
975 	 FALSE,				/* PC_relative.  */
976 	 0,				/* Bitpos.  */
977 	 complain_overflow_dont,	/* Complain_on_overflow.  */
978 	 v850_elf_reloc,		/* Special_function.  */
979 	 "R_V850_LO16",			/* Name.  */
980 	 FALSE,				/* Partial_inplace.  */
981 	 0xffff,			/* Src_mask.  */
982 	 0xffff,			/* Dst_mask.  */
983 	 FALSE),			/* PCrel_offset.  */
984 
985   /* Simple 32bit reloc.  */
986   HOWTO (R_V850_ABS32,			/* Type.  */
987 	 0,				/* Rightshift.  */
988 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
989 	 32,				/* Bitsize.  */
990 	 FALSE,				/* PC_relative.  */
991 	 0,				/* Bitpos.  */
992 	 complain_overflow_dont,	/* Complain_on_overflow.  */
993 	 v850_elf_reloc,		/* Special_function.  */
994 	 "R_V850_ABS32",		/* Name.  */
995 	 FALSE,				/* Partial_inplace.  */
996 	 0xffffffff,			/* Src_mask.  */
997 	 0xffffffff,			/* Dst_mask.  */
998 	 FALSE),			/* PCrel_offset.  */
999 
1000   /* Simple 16bit reloc.  */
1001   HOWTO (R_V850_16,			/* Type.  */
1002 	 0,				/* Rightshift.  */
1003 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1004 	 16,				/* Bitsize.  */
1005 	 FALSE,				/* PC_relative.  */
1006 	 0,				/* Bitpos.  */
1007 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1008 	 bfd_elf_generic_reloc,		/* Special_function.  */
1009 	 "R_V850_16",			/* Name.  */
1010 	 FALSE,				/* Partial_inplace.  */
1011 	 0xffff,			/* Src_mask.  */
1012 	 0xffff,			/* Dst_mask.  */
1013 	 FALSE),			/* PCrel_offset.  */
1014 
1015   /* Simple 8bit reloc.	 */
1016   HOWTO (R_V850_8,			/* Type.  */
1017 	 0,				/* Rightshift.  */
1018 	 0,				/* Size (0 = byte, 1 = short, 2 = long).  */
1019 	 8,				/* Bitsize.  */
1020 	 FALSE,				/* PC_relative.  */
1021 	 0,				/* Bitpos.  */
1022 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1023 	 bfd_elf_generic_reloc,		/* Special_function.  */
1024 	 "R_V850_8",			/* Name.  */
1025 	 FALSE,				/* Partial_inplace.  */
1026 	 0xff,				/* Src_mask.  */
1027 	 0xff,				/* Dst_mask.  */
1028 	 FALSE),			/* PCrel_offset.  */
1029 
1030   /* 16 bit offset from the short data area pointer.  */
1031   HOWTO (R_V850_SDA_16_16_OFFSET,	/* Type.  */
1032 	 0,				/* Rightshift.  */
1033 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1034 	 16,				/* Bitsize.  */
1035 	 FALSE,				/* PC_relative.  */
1036 	 0,				/* Bitpos.  */
1037 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1038 	 v850_elf_reloc,		/* Special_function.  */
1039 	 "R_V850_SDA_16_16_OFFSET",	/* Name.  */
1040 	 FALSE,				/* Partial_inplace.  */
1041 	 0xffff,			/* Src_mask.  */
1042 	 0xffff,			/* Dst_mask.  */
1043 	 FALSE),			/* PCrel_offset.  */
1044 
1045   /* 15 bit offset from the short data area pointer.  */
1046   HOWTO (R_V850_SDA_15_16_OFFSET,	/* Type.  */
1047 	 1,				/* Rightshift.  */
1048 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1049 	 16,				/* Bitsize.  */
1050 	 FALSE,				/* PC_relative.  */
1051 	 1,				/* Bitpos.  */
1052 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1053 	 v850_elf_reloc,		/* Special_function.  */
1054 	 "R_V850_SDA_15_16_OFFSET",	/* Name.  */
1055 	 FALSE,				/* Partial_inplace.  */
1056 	 0xfffe,			/* Src_mask.  */
1057 	 0xfffe,			/* Dst_mask.  */
1058 	 FALSE),			/* PCrel_offset.  */
1059 
1060   /* 16 bit offset from the zero data area pointer.  */
1061   HOWTO (R_V850_ZDA_16_16_OFFSET,	/* Type.  */
1062 	 0,				/* Rightshift.  */
1063 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1064 	 16,				/* Bitsize.  */
1065 	 FALSE,				/* PC_relative.  */
1066 	 0,				/* Bitpos.  */
1067 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1068 	 v850_elf_reloc,		/* Special_function.  */
1069 	 "R_V850_ZDA_16_16_OFFSET",	/* Name.  */
1070 	 FALSE,				/* Partial_inplace.  */
1071 	 0xffff,			/* Src_mask.  */
1072 	 0xffff,			/* Dst_mask.  */
1073 	 FALSE),			/* PCrel_offset.  */
1074 
1075   /* 15 bit offset from the zero data area pointer.  */
1076   HOWTO (R_V850_ZDA_15_16_OFFSET,	/* Type.  */
1077 	 1,				/* Rightshift.  */
1078 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1079 	 16,				/* Bitsize.  */
1080 	 FALSE,				/* PC_relative.  */
1081 	 1,				/* Bitpos.  */
1082 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1083 	 v850_elf_reloc,		/* Special_function.  */
1084 	 "R_V850_ZDA_15_16_OFFSET",	/* Name.  */
1085 	 FALSE,				/* Partial_inplace.  */
1086 	 0xfffe,			/* Src_mask.  */
1087 	 0xfffe,			/* Dst_mask.  */
1088 	 FALSE),			/* PCrel_offset.  */
1089 
1090   /* 6 bit offset from the tiny data area pointer.  */
1091   HOWTO (R_V850_TDA_6_8_OFFSET,		/* Type.  */
1092 	 2,				/* Rightshift.  */
1093 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1094 	 8,				/* Bitsize.  */
1095 	 FALSE,				/* PC_relative.  */
1096 	 1,				/* Bitpos.  */
1097 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1098 	 v850_elf_reloc,		/* Special_function.  */
1099 	 "R_V850_TDA_6_8_OFFSET",	/* Name.  */
1100 	 FALSE,				/* Partial_inplace.  */
1101 	 0x7e,				/* Src_mask.  */
1102 	 0x7e,				/* Dst_mask.  */
1103 	 FALSE),			/* PCrel_offset.  */
1104 
1105   /* 8 bit offset from the tiny data area pointer.  */
1106   HOWTO (R_V850_TDA_7_8_OFFSET,		/* Type.  */
1107 	 1,				/* Rightshift.  */
1108 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1109 	 8,				/* Bitsize.  */
1110 	 FALSE,				/* PC_relative.  */
1111 	 0,				/* Bitpos.  */
1112 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1113 	 v850_elf_reloc,		/* Special_function.  */
1114 	 "R_V850_TDA_7_8_OFFSET",	/* Name.  */
1115 	 FALSE,				/* Partial_inplace.  */
1116 	 0x7f,				/* Src_mask.  */
1117 	 0x7f,				/* Dst_mask.  */
1118 	 FALSE),			/* PCrel_offset.  */
1119 
1120   /* 7 bit offset from the tiny data area pointer.  */
1121   HOWTO (R_V850_TDA_7_7_OFFSET,		/* Type.  */
1122 	 0,				/* Rightshift.  */
1123 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1124 	 7,				/* Bitsize.  */
1125 	 FALSE,				/* PC_relative.  */
1126 	 0,				/* Bitpos.  */
1127 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1128 	 v850_elf_reloc,		/* Special_function.  */
1129 	 "R_V850_TDA_7_7_OFFSET",	/* Name.  */
1130 	 FALSE,				/* Partial_inplace.  */
1131 	 0x7f,				/* Src_mask.  */
1132 	 0x7f,				/* Dst_mask.  */
1133 	 FALSE),			/* PCrel_offset.  */
1134 
1135   /* 16 bit offset from the tiny data area pointer!  */
1136   HOWTO (R_V850_TDA_16_16_OFFSET,	/* Type.  */
1137 	 0,				/* Rightshift.  */
1138 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1139 	 16,				/* Bitsize.  */
1140 	 FALSE,				/* PC_relative.  */
1141 	 0,				/* Bitpos.  */
1142 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1143 	 v850_elf_reloc,		/* Special_function.  */
1144 	 "R_V850_TDA_16_16_OFFSET",	/* Name.  */
1145 	 FALSE,				/* Partial_inplace.  */
1146 	 0xffff,			/* Src_mask.  */
1147 	 0xfff,				/* Dst_mask.  */
1148 	 FALSE),			/* PCrel_offset.  */
1149 
1150   /* 5 bit offset from the tiny data area pointer.  */
1151   HOWTO (R_V850_TDA_4_5_OFFSET,		/* Type.  */
1152 	 1,				/* Rightshift.  */
1153 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1154 	 5,				/* Bitsize.  */
1155 	 FALSE,				/* PC_relative.  */
1156 	 0,				/* Bitpos.  */
1157 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1158 	 v850_elf_reloc,		/* Special_function.  */
1159 	 "R_V850_TDA_4_5_OFFSET",	/* Name.  */
1160 	 FALSE,				/* Partial_inplace.  */
1161 	 0x0f,				/* Src_mask.  */
1162 	 0x0f,				/* Dst_mask.  */
1163 	 FALSE),			/* PCrel_offset.  */
1164 
1165   /* 4 bit offset from the tiny data area pointer.  */
1166   HOWTO (R_V850_TDA_4_4_OFFSET,		/* Type.  */
1167 	 0,				/* Rightshift.  */
1168 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1169 	 4,				/* Bitsize.  */
1170 	 FALSE,				/* PC_relative.  */
1171 	 0,				/* Bitpos.  */
1172 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1173 	 v850_elf_reloc,		/* Special_function.  */
1174 	 "R_V850_TDA_4_4_OFFSET",	/* Name.  */
1175 	 FALSE,				/* Partial_inplace.  */
1176 	 0x0f,				/* Src_mask.  */
1177 	 0x0f,				/* Dst_mask.  */
1178 	 FALSE),			/* PCrel_offset.  */
1179 
1180   /* 16 bit offset from the short data area pointer.  */
1181   HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET,	/* Type.  */
1182 	 0,				/* Rightshift.  */
1183 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
1184 	 16,				/* Bitsize.  */
1185 	 FALSE,				/* PC_relative.  */
1186 	 0,				/* Bitpos.  */
1187 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1188 	 v850_elf_reloc,		/* Special_function.  */
1189 	 "R_V850_SDA_16_16_SPLIT_OFFSET",/* Name.  */
1190 	 FALSE,				/* Partial_inplace.  */
1191 	 0xfffe0020,			/* Src_mask.  */
1192 	 0xfffe0020,			/* Dst_mask.  */
1193 	 FALSE),			/* PCrel_offset.  */
1194 
1195   /* 16 bit offset from the zero data area pointer.  */
1196   HOWTO (R_V850_ZDA_16_16_SPLIT_OFFSET,	/* Type.  */
1197 	 0,				/* Rightshift.  */
1198 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
1199 	 16,				/* Bitsize.  */
1200 	 FALSE,				/* PC_relative.  */
1201 	 0,				/* Bitpos.  */
1202 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1203 	 v850_elf_reloc,		/* Special_function.  */
1204 	 "R_V850_ZDA_16_16_SPLIT_OFFSET",/* Name.  */
1205 	 FALSE,				/* Partial_inplace.  */
1206 	 0xfffe0020,			/* Src_mask.  */
1207 	 0xfffe0020,			/* Dst_mask.  */
1208 	 FALSE),			/* PCrel_offset.  */
1209 
1210   /* 6 bit offset from the call table base pointer.  */
1211   HOWTO (R_V850_CALLT_6_7_OFFSET,	/* Type.  */
1212 	 0,				/* Rightshift.  */
1213 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1214 	 7,				/* Bitsize.  */
1215 	 FALSE,				/* PC_relative.  */
1216 	 0,				/* Bitpos.  */
1217 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1218 	 v850_elf_reloc,		/* Special_function.  */
1219 	 "R_V850_CALLT_6_7_OFFSET",	/* Name.  */
1220 	 FALSE,				/* Partial_inplace.  */
1221 	 0x3f,				/* Src_mask.  */
1222 	 0x3f,				/* Dst_mask.  */
1223 	 FALSE),			/* PCrel_offset.  */
1224 
1225   /* 16 bit offset from the call table base pointer.  */
1226   HOWTO (R_V850_CALLT_16_16_OFFSET,	/* Type.  */
1227 	 0,				/* Rightshift.  */
1228 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1229 	 16,				/* Bitsize.  */
1230 	 FALSE,				/* PC_relative.  */
1231 	 0,				/* Bitpos.  */
1232 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1233 	 v850_elf_reloc,		/* Special_function.  */
1234 	 "R_V850_CALLT_16_16_OFFSET",	/* Name.  */
1235 	 FALSE,				/* Partial_inplace.  */
1236 	 0xffff,			/* Src_mask.  */
1237 	 0xffff,			/* Dst_mask.  */
1238 	 FALSE),			/* PCrel_offset.  */
1239 
1240 
1241   /* GNU extension to record C++ vtable hierarchy */
1242   HOWTO (R_V850_GNU_VTINHERIT, /* Type.  */
1243 	 0,                     /* Rightshift.  */
1244 	 2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1245 	 0,                     /* Bitsize.  */
1246 	 FALSE,                 /* PC_relative.  */
1247 	 0,                     /* Bitpos.  */
1248 	 complain_overflow_dont, /* Complain_on_overflow.  */
1249 	 NULL,                  /* Special_function.  */
1250 	 "R_V850_GNU_VTINHERIT", /* Name.  */
1251 	 FALSE,                 /* Partial_inplace.  */
1252 	 0,                     /* Src_mask.  */
1253 	 0,                     /* Dst_mask.  */
1254 	 FALSE),                /* PCrel_offset.  */
1255 
1256   /* GNU extension to record C++ vtable member usage.  */
1257   HOWTO (R_V850_GNU_VTENTRY,     /* Type.  */
1258 	 0,                     /* Rightshift.  */
1259 	 2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1260 	 0,                     /* Bitsize.  */
1261 	 FALSE,                 /* PC_relative.  */
1262 	 0,                     /* Bitpos.  */
1263 	 complain_overflow_dont, /* Complain_on_overflow.  */
1264 	 _bfd_elf_rel_vtable_reloc_fn,  /* Special_function.  */
1265 	 "R_V850_GNU_VTENTRY",   /* Name.  */
1266 	 FALSE,                 /* Partial_inplace.  */
1267 	 0,                     /* Src_mask.  */
1268 	 0,                     /* Dst_mask.  */
1269 	 FALSE),                /* PCrel_offset.  */
1270 
1271   /* Indicates a .longcall pseudo-op.  The compiler will generate a .longcall
1272      pseudo-op when it finds a function call which can be relaxed.  */
1273   HOWTO (R_V850_LONGCALL,     /* Type.  */
1274 	 0,                     /* Rightshift.  */
1275 	 2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1276 	 32,                    /* Bitsize.  */
1277 	 TRUE,                  /* PC_relative.  */
1278 	 0,                     /* Bitpos.  */
1279 	 complain_overflow_signed, /* Complain_on_overflow.  */
1280 	 v850_elf_ignore_reloc, /* Special_function.  */
1281 	 "R_V850_LONGCALL",     /* Name.  */
1282 	 FALSE,                 /* Partial_inplace.  */
1283 	 0,                     /* Src_mask.  */
1284 	 0,                     /* Dst_mask.  */
1285 	 TRUE),                 /* PCrel_offset.  */
1286 
1287   /* Indicates a .longjump pseudo-op.  The compiler will generate a
1288      .longjump pseudo-op when it finds a branch which can be relaxed.  */
1289   HOWTO (R_V850_LONGJUMP,     /* Type.  */
1290 	 0,                     /* Rightshift.  */
1291 	 2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1292 	 32,                    /* Bitsize.  */
1293 	 TRUE,                  /* PC_relative.  */
1294 	 0,                     /* Bitpos.  */
1295 	 complain_overflow_signed, /* Complain_on_overflow.  */
1296 	 v850_elf_ignore_reloc, /* Special_function.  */
1297 	 "R_V850_LONGJUMP",     /* Name.  */
1298 	 FALSE,                 /* Partial_inplace.  */
1299 	 0,                     /* Src_mask.  */
1300 	 0,                     /* Dst_mask.  */
1301 	 TRUE),                 /* PCrel_offset.  */
1302 
1303   HOWTO (R_V850_ALIGN,        /* Type.  */
1304 	 0,                     /* Rightshift.  */
1305 	 1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
1306 	 0,                     /* Bitsize.  */
1307 	 FALSE,                 /* PC_relative.  */
1308 	 0,                     /* Bitpos.  */
1309 	 complain_overflow_unsigned, /* Complain_on_overflow.  */
1310 	 v850_elf_ignore_reloc, /* Special_function.  */
1311 	 "R_V850_ALIGN",        /* Name.  */
1312 	 FALSE,                 /* Partial_inplace.  */
1313 	 0,                     /* Src_mask.  */
1314 	 0,                     /* Dst_mask.  */
1315 	 TRUE),                 /* PCrel_offset.  */
1316 
1317   /* Simple pc-relative 32bit reloc.  */
1318   HOWTO (R_V850_REL32,			/* Type.  */
1319 	 0,				/* Rightshift.  */
1320 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
1321 	 32,				/* Bitsize.  */
1322 	 TRUE,				/* PC_relative.  */
1323 	 0,				/* Bitpos.  */
1324 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1325 	 v850_elf_reloc,		/* Special_function.  */
1326 	 "R_V850_REL32",		/* Name.  */
1327 	 FALSE,				/* Partial_inplace.  */
1328 	 0xffffffff,			/* Src_mask.  */
1329 	 0xffffffff,			/* Dst_mask.  */
1330 	 FALSE),			/* PCrel_offset.  */
1331 
1332   /* An ld.bu version of R_V850_LO16.  */
1333   HOWTO (R_V850_LO16_SPLIT_OFFSET,	/* Type.  */
1334 	 0,				/* Rightshift.  */
1335 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
1336 	 16,				/* Bitsize.  */
1337 	 FALSE,				/* PC_relative.  */
1338 	 0,				/* Bitpos.  */
1339 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1340 	 v850_elf_reloc,		/* Special_function.  */
1341 	 "R_V850_LO16_SPLIT_OFFSET",	/* Name.  */
1342 	 FALSE,				/* Partial_inplace.  */
1343 	 0xfffe0020,			/* Src_mask.  */
1344 	 0xfffe0020,			/* Dst_mask.  */
1345 	 FALSE),			/* PCrel_offset.  */
1346 
1347   /* A unsigned PC relative 16 bit loop.  */
1348   HOWTO (R_V850_16_PCREL,		/* Type.  */
1349 	 0,				/* Rightshift.  */
1350 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1351 	 16,				/* Bitsize.  */
1352 	 TRUE,				/* PC_relative.  */
1353 	 0,				/* Bitpos.  */
1354 	 complain_overflow_bitfield,	/* Complain_on_overflow.  */
1355 	 v850_elf_reloc,		/* Special_function.  */
1356 	 "R_V850_16_PCREL",		/* Name.  */
1357 	 FALSE,				/* Partial_inplace.  */
1358 	 0xfffe,			/* Src_mask.  */
1359 	 0xfffe,			/* Dst_mask.  */
1360 	 TRUE),				/* PCrel_offset.  */
1361 
1362   /* A PC relative 17 bit branch.  */
1363   HOWTO (R_V850_17_PCREL,		/* Type.  */
1364 	 0,				/* Rightshift.  */
1365 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
1366 	 17,				/* Bitsize.  */
1367 	 TRUE,				/* PC_relative.  */
1368 	 0,				/* Bitpos.  */
1369 	 complain_overflow_bitfield,	/* Complain_on_overflow.  */
1370 	 v850_elf_reloc,		/* Special_function.  */
1371 	 "R_V850_17_PCREL",		/* Name.  */
1372 	 FALSE,				/* Partial_inplace.  */
1373 	 0x0010fffe,			/* Src_mask.  */
1374 	 0x0010fffe,			/* Dst_mask.  */
1375 	 TRUE),				/* PCrel_offset.  */
1376 
1377   /* A 23bit offset ld/st.  */
1378   HOWTO (R_V850_23,			/* type.  */
1379 	 0,				/* rightshift.  */
1380 	 2,				/* size (0 = byte, 1 = short, 2 = long).  */
1381 	 23,				/* bitsize.  */
1382 	 FALSE,				/* pc_relative.  */
1383 	 0,				/* bitpos.  */
1384 	 complain_overflow_dont,	/* complain_on_overflow.  */
1385 	 v850_elf_reloc,		/* special_function.  */
1386 	 "R_V850_23",			/* name.  */
1387 	 FALSE,				/* partial_inplace.  */
1388 	 0xffff07f0,			/* src_mask.  */
1389 	 0xffff07f0,			/* dst_mask.  */
1390 	 FALSE),			/* pcrel_offset.  */
1391 
1392   /* A PC relative 32 bit branch.  */
1393   HOWTO (R_V850_32_PCREL,		/* type.  */
1394 	 1,				/* rightshift.  */
1395 	 2,				/* size (0 = byte, 1 = short, 2 = long).  */
1396 	 32,				/* bitsize.  */
1397 	 TRUE,				/* pc_relative.  */
1398 	 1,				/* bitpos.  */
1399 	 complain_overflow_signed,	/* complain_on_overflow.  */
1400 	 v850_elf_reloc,		/* special_function.  */
1401 	 "R_V850_32_PCREL",		/* name.  */
1402 	 FALSE,				/* partial_inplace.  */
1403 	 0xfffffffe,			/* src_mask.  */
1404 	 0xfffffffe,			/* dst_mask.  */
1405 	 TRUE),				/* pcrel_offset.  */
1406 
1407   /* A absolute 32 bit branch.	*/
1408   HOWTO (R_V850_32_ABS,			/* type.  */
1409 	 1,				/* rightshift.  */
1410 	 2,				/* size (0 = byte, 1 = short, 2 = long).  */
1411 	 32,				/* bitsize.  */
1412 	 TRUE,				/* pc_relative.  */
1413 	 1,				/* bitpos.  */
1414 	 complain_overflow_signed,	/* complain_on_overflow.  */
1415 	 v850_elf_reloc,		/* special_function.  */
1416 	 "R_V850_32_ABS",		/* name.  */
1417 	 FALSE,				/* partial_inplace.  */
1418 	 0xfffffffe,			/* src_mask.  */
1419 	 0xfffffffe,			/* dst_mask.  */
1420 	 FALSE),			/* pcrel_offset.  */
1421 
1422   /* High 16 bits of symbol value.  */
1423   HOWTO (R_V850_HI16,			/* Type.  */
1424 	 0,				/* Rightshift.  */
1425 	 1,				/* Size (0 = byte, 1 = short, 2 = long).  */
1426 	 16,				/* Bitsize.  */
1427 	 FALSE,				/* PC_relative.  */
1428 	 0,				/* Bitpos.  */
1429 	 complain_overflow_dont,	/* Complain_on_overflow.  */
1430 	 v850_elf_reloc,		/* Special_function.  */
1431 	 "R_V850_HI16",			/* Name.  */
1432 	 FALSE,				/* Partial_inplace.  */
1433 	 0xffff,			/* Src_mask.  */
1434 	 0xffff,			/* Dst_mask.  */
1435 	 FALSE),			/* PCrel_offset.  */
1436 
1437   /* Low 16 bits of symbol value.  */
1438   HOWTO (R_V850_16_S1,			/* type.  */
1439 	 1,				/* rightshift.  */
1440 	 1,				/* size (0 = byte, 1 = short, 2 = long).  */
1441 	 16,				/* bitsize.  */
1442 	 FALSE,				/* pc_relative.  */
1443 	 1,				/* bitpos.  */
1444 	 complain_overflow_dont,	/* complain_on_overflow.  */
1445 	 v850_elf_reloc,		/* special_function.  */
1446 	 "R_V850_16_S1",		/* name.  */
1447 	 FALSE,				/* partial_inplace.  */
1448 	 0xfffe,			/* src_mask.  */
1449 	 0xfffe,			/* dst_mask.  */
1450 	 FALSE),			/* pcrel_offset.  */
1451 
1452   /* Low 16 bits of symbol value.  */
1453   HOWTO (R_V850_LO16_S1,		/* type.  */
1454 	 1,				/* rightshift.  */
1455 	 1,				/* size (0 = byte, 1 = short, 2 = long).  */
1456 	 16,				/* bitsize.  */
1457 	 FALSE,				/* pc_relative.  */
1458 	 1,				/* bitpos.  */
1459 	 complain_overflow_dont,	/* complain_on_overflow.  */
1460 	 v850_elf_reloc,		/* special_function.  */
1461 	 "R_V850_LO16_S1",		/* name.  */
1462 	 FALSE,				/* partial_inplace.  */
1463 	 0xfffe,			/* src_mask.  */
1464 	 0xfffe,			/* dst_mask.  */
1465 	 FALSE),			/* pcrel_offset.  */
1466 
1467   /* 16 bit offset from the call table base pointer.  */
1468   HOWTO (R_V850_CALLT_15_16_OFFSET,	/* type.  */
1469 	 1,				/* rightshift.  */
1470 	 1,				/* size (0 = byte, 1 = short, 2 = long).  */
1471 	 16,				/* bitsize.  */
1472 	 FALSE,				/* pc_relative.  */
1473 	 1,				/* bitpos.  */
1474 	 complain_overflow_dont,	/* complain_on_overflow.  */
1475 	 v850_elf_reloc,		/* special_function.  */
1476 	 "R_V850_CALLT_15_16_OFFSET",	/* name.  */
1477 	 FALSE,				/* partial_inplace.  */
1478 	 0xfffe,			/* src_mask.  */
1479 	 0xfffe,			/* dst_mask.  */
1480 	 FALSE),			/* pcrel_offset.  */
1481 
1482   /* Like R_V850_32 PCREL, but referring to the GOT table entry for
1483      the symbol.  */
1484   HOWTO (R_V850_32_GOTPCREL,		/* type.  */
1485 	 0,				/* rightshift.  */
1486 	 2,				/* size (0 = byte, 1 = short, 2 = long).  */
1487 	 32,				/* bitsize.  */
1488 	 TRUE,				/* pc_relative.  */
1489 	 0,				/* bitpos.  */
1490 	 complain_overflow_unsigned,	/* complain_on_overflow.  */
1491 	 v850_elf_reloc,		/* special_function.  */
1492 	 "R_V850_32_GOTPCREL",		/* name.  */
1493 	 FALSE,				/* partial_inplace.  */
1494 	 0xffffffff,			/* src_mask.  */
1495 	 0xffffffff,			/* dst_mask.  */
1496 	 TRUE),				/* pcrel_offset.  */
1497 
1498   /* Like R_V850_SDA_, but referring to the GOT table entry for
1499      the symbol.  */
1500   HOWTO (R_V850_16_GOT,			/* type.  */
1501 	 0,				/* rightshift.  */
1502 	 2,				/* size (0 = byte, 1 = short, 2 = long).  */
1503 	 16,				/* bitsize.  */
1504 	 FALSE,				/* pc_relative.  */
1505 	 0,				/* bitpos.  */
1506 	 complain_overflow_unsigned,	/* complain_on_overflow.  */
1507 	 bfd_elf_generic_reloc,		/* special_function.  */
1508 	 "R_V850_16_GOT",		/* name.  */
1509 	 FALSE,				/* partial_inplace.  */
1510 	 0xffff,			/* src_mask.  */
1511 	 0xffff,			/* dst_mask.  */
1512 	 FALSE),			/* pcrel_offset.  */
1513 
1514   HOWTO (R_V850_32_GOT,			/* type.  */
1515 	 0,				/* rightshift.  */
1516 	 2,				/* size (0 = byte, 1 = short, 2 = long).  */
1517 	 32,				/* bitsize.  */
1518 	 FALSE,				/* pc_relative.  */
1519 	 0,				/* bitpos.  */
1520 	 complain_overflow_unsigned,	/* complain_on_overflow.  */
1521 	 bfd_elf_generic_reloc,		/* special_function.  */
1522 	 "R_V850_32_GOT",		/* name.  */
1523 	 FALSE,				/* partial_inplace.  */
1524 	 0xffffffff,			/* src_mask.  */
1525 	 0xffffffff,			/* dst_mask.  */
1526 	 FALSE),			/* pcrel_offset.  */
1527 
1528   /* Like R_V850_22_PCREL, but referring to the procedure linkage table
1529      entry for the symbol.  */
1530   HOWTO (R_V850_22_PLT,			/* type.  */
1531 	 1,				/* rightshift.  */
1532 	 2,				/* size (0 = byte, 1 = short, 2 = long).  */
1533 	 22,				/* bitsize.  */
1534 	 TRUE,				/* pc_relative.  */
1535 	 7,				/* bitpos.  */
1536 	 complain_overflow_signed,	/* complain_on_overflow.  */
1537 	 bfd_elf_generic_reloc,		/* special_function.  */
1538 	 "R_V850_22_PLT",		/* name.  */
1539 	 FALSE,				/* partial_inplace.  */
1540 	 0x07ffff80,			/* src_mask.  */
1541 	 0x07ffff80,			/* dst_mask.  */
1542 	 TRUE),				/* pcrel_offset.  */
1543 
1544   HOWTO (R_V850_32_PLT,			/* type.  */
1545 	 1,				/* rightshift.  */
1546 	 2,				/* size (0 = byte, 1 = short, 2 = long).  */
1547 	 32,				/* bitsize.  */
1548 	 TRUE,				/* pc_relative.  */
1549 	 1,				/* bitpos.  */
1550 	 complain_overflow_signed,	/* complain_on_overflow.  */
1551 	 bfd_elf_generic_reloc,		/* special_function.  */
1552 	 "R_V850_32_PLT",		/* name.  */
1553 	 FALSE,				/* partial_inplace.  */
1554 	 0xffffffff,			/* src_mask.  */
1555 	 0xffffffff,			/* dst_mask.  */
1556 	 TRUE),				/* pcrel_offset.  */
1557 
1558   /* This is used only by the dynamic linker.  The symbol should exist
1559      both in the object being run and in some shared library.  The
1560      dynamic linker copies the data addressed by the symbol from the
1561      shared library into the object, because the object being
1562      run has to have the data at some particular address.  */
1563   HOWTO (R_V850_COPY,			/* type.  */
1564 	 0,				/* rightshift.  */
1565 	 2,				/* size (0 = byte, 1 = short, 2 = long).  */
1566 	 32,				/* bitsize.  */
1567 	 FALSE,				/* pc_relative.  */
1568 	 0,				/* bitpos.  */
1569 	 complain_overflow_bitfield,	/* complain_on_overflow.  */
1570 	 bfd_elf_generic_reloc,		/* special_function.  */
1571 	 "R_V850_COPY",			/* name.  */
1572 	 FALSE,				/* partial_inplace.  */
1573 	 0xffffffff,			/* src_mask.  */
1574 	 0xffffffff,			/* dst_mask.  */
1575 	 FALSE),			/* pcrel_offset.  */
1576 
1577   /* Like R_M32R_24, but used when setting global offset table
1578      entries.  */
1579   HOWTO (R_V850_GLOB_DAT,		/* type.  */
1580 	 0,				/* rightshift.  */
1581 	 2,				/* size (0 = byte, 1 = short, 2 = long) */
1582 	 32,				/* bitsize.  */
1583 	 FALSE,				/* pc_relative.  */
1584 	 0,				/* bitpos.  */
1585 	 complain_overflow_bitfield,	/* complain_on_overflow.  */
1586 	 bfd_elf_generic_reloc,		/* special_function.  */
1587 	 "R_V850_GLOB_DAT",		/* name.  */
1588 	 FALSE,				/* partial_inplace.  */
1589 	 0xffffffff,			/* src_mask.  */
1590 	 0xffffffff,			/* dst_mask.  */
1591 	 FALSE),			/* pcrel_offset.  */
1592 
1593   /* Marks a procedure linkage table entry for a symbol.  */
1594   HOWTO (R_V850_JMP_SLOT,		/* type.  */
1595 	 0,				/* rightshift.  */
1596 	 2,				/* size (0 = byte, 1 = short, 2 = long) */
1597 	 32,				/* bitsize.  */
1598 	 FALSE,				/* pc_relative.  */
1599 	 0,				/* bitpos.  */
1600 	 complain_overflow_bitfield,	/* complain_on_overflow.  */
1601 	 bfd_elf_generic_reloc,		/* special_function.  */
1602 	 "R_V850_JMP_SLOT",		/* name.  */
1603 	 FALSE,				/* partial_inplace.  */
1604 	 0xffffffff,			/* src_mask.  */
1605 	 0xffffffff,			/* dst_mask.  */
1606 	 FALSE),			/* pcrel_offset.  */
1607 
1608   /* Used only by the dynamic linker.  When the object is run, this
1609      longword is set to the load address of the object, plus the
1610      addend.  */
1611   HOWTO (R_V850_RELATIVE,		/* type.  */
1612 	 0,				/* rightshift.  */
1613 	 2,				/* size (0 = byte, 1 = short, 2 = long) */
1614 	 32,				/* bitsize.  */
1615 	 FALSE,				/* pc_relative.  */
1616 	 0,				/* bitpos.  */
1617 	 complain_overflow_bitfield,	/* complain_on_overflow.  */
1618 	 bfd_elf_generic_reloc,		/* special_function.  */
1619 	 "R_V850_RELATIVE",		/* name.  */
1620 	 FALSE,				/* partial_inplace.  */
1621 	 0xffffffff,			/* src_mask.  */
1622 	 0xffffffff,			/* dst_mask.  */
1623 	 FALSE),			/* pcrel_offset.  */
1624 
1625   HOWTO (R_V850_16_GOTOFF,		/* type.  */
1626 	 0,				/* rightshift.  */
1627 	 2,				/* size (0 = byte, 1 = short, 2 = long) */
1628 	 16,				/* bitsize.  */
1629 	 FALSE,				/* pc_relative.  */
1630 	 0,				/* bitpos.  */
1631 	 complain_overflow_bitfield,	/* complain_on_overflow.  */
1632 	 bfd_elf_generic_reloc,		/* special_function.  */
1633 	 "R_V850_16_GOTOFF",		/* name.  */
1634 	 FALSE,				/* partial_inplace.  */
1635 	 0xffff,			/* src_mask.  */
1636 	 0xffff,			/* dst_mask.  */
1637 	 FALSE),			/* pcrel_offset.  */
1638 
1639   HOWTO (R_V850_32_GOTOFF,		/* type.  */
1640 	 0,				/* rightshift.  */
1641 	 2,				/* size (0 = byte, 1 = short, 2 = long) */
1642 	 32,				/* bitsize.  */
1643 	 FALSE,				/* pc_relative.  */
1644 	 0,				/* bitpos.  */
1645 	 complain_overflow_bitfield,	/* complain_on_overflow.  */
1646 	 bfd_elf_generic_reloc,		/* special_function.  */
1647 	 "R_V850_32_GOTOFF",		/* name.  */
1648 	 FALSE,				/* partial_inplace.  */
1649 	 0xffffffff,			/* src_mask.  */
1650 	 0xffffffff,			/* dst_mask.  */
1651 	 FALSE),			/* pcrel_offset.  */
1652 
1653   HOWTO (R_V850_CODE,			/* type.  */
1654 	 0,				/* rightshift.  */
1655 	 1,				/* size (0 = byte, 1 = short, 2 = long) */
1656 	 0,				/* bitsize.  */
1657 	 FALSE,				/* pc_relative.  */
1658 	 0,				/* bitpos.  */
1659 	 complain_overflow_unsigned,	/* complain_on_overflow.  */
1660 	 v850_elf_ignore_reloc,		/* special_function.  */
1661 	 "R_V850_CODE",			/* name.  */
1662 	 FALSE,				/* partial_inplace.  */
1663 	 0,				/* src_mask.  */
1664 	 0,				/* dst_mask.  */
1665 	 TRUE),				/* pcrel_offset.  */
1666 
1667   HOWTO (R_V850_DATA,			/* type.  */
1668 	 0,				/* rightshift.  */
1669 	 1,				/* size (0 = byte, 1 = short, 2 = long) */
1670 	 0,				/* bitsize.  */
1671 	 FALSE,				/* pc_relative.  */
1672 	 0,				/* bitpos.  */
1673 	 complain_overflow_unsigned,	/* complain_on_overflow.  */
1674 	 v850_elf_ignore_reloc,		/* special_function.  */
1675 	 "R_V850_DATA",			/* name.  */
1676 	 FALSE,				/* partial_inplace.  */
1677 	 0,				/* src_mask.  */
1678 	 0,				/* dst_mask.  */
1679 	 TRUE),				/* pcrel_offset.  */
1680 
1681 };
1682 
1683 /* Map BFD reloc types to V850 ELF reloc types.  */
1684 
1685 struct v850_elf_reloc_map
1686 {
1687   /* BFD_RELOC_V850_CALLT_16_16_OFFSET is 258, which will not fix in an
1688      unsigned char.  */
1689   bfd_reloc_code_real_type bfd_reloc_val;
1690   unsigned int elf_reloc_val;
1691 };
1692 
1693 static const struct v850_elf_reloc_map v850_elf_reloc_map[] =
1694 {
1695   { BFD_RELOC_NONE,                        R_V850_NONE                   },
1696   { BFD_RELOC_V850_9_PCREL,                R_V850_9_PCREL                },
1697   { BFD_RELOC_V850_22_PCREL,               R_V850_22_PCREL               },
1698   { BFD_RELOC_HI16_S,                      R_V850_HI16_S                 },
1699   { BFD_RELOC_HI16,                        R_V850_HI16                   },
1700   { BFD_RELOC_LO16,                        R_V850_LO16                   },
1701   { BFD_RELOC_32,                          R_V850_ABS32                  },
1702   { BFD_RELOC_32_PCREL,                    R_V850_REL32                  },
1703   { BFD_RELOC_16,                          R_V850_16                     },
1704   { BFD_RELOC_8,                           R_V850_8                      },
1705   { BFD_RELOC_V850_SDA_16_16_OFFSET,       R_V850_SDA_16_16_OFFSET       },
1706   { BFD_RELOC_V850_SDA_15_16_OFFSET,       R_V850_SDA_15_16_OFFSET       },
1707   { BFD_RELOC_V850_ZDA_16_16_OFFSET,       R_V850_ZDA_16_16_OFFSET       },
1708   { BFD_RELOC_V850_ZDA_15_16_OFFSET,       R_V850_ZDA_15_16_OFFSET       },
1709   { BFD_RELOC_V850_TDA_6_8_OFFSET,         R_V850_TDA_6_8_OFFSET         },
1710   { BFD_RELOC_V850_TDA_7_8_OFFSET,         R_V850_TDA_7_8_OFFSET         },
1711   { BFD_RELOC_V850_TDA_7_7_OFFSET,         R_V850_TDA_7_7_OFFSET         },
1712   { BFD_RELOC_V850_TDA_16_16_OFFSET,       R_V850_TDA_16_16_OFFSET       },
1713   { BFD_RELOC_V850_TDA_4_5_OFFSET,         R_V850_TDA_4_5_OFFSET         },
1714   { BFD_RELOC_V850_TDA_4_4_OFFSET,         R_V850_TDA_4_4_OFFSET         },
1715   { BFD_RELOC_V850_LO16_SPLIT_OFFSET,      R_V850_LO16_SPLIT_OFFSET      },
1716   { BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET, R_V850_SDA_16_16_SPLIT_OFFSET },
1717   { BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET, R_V850_ZDA_16_16_SPLIT_OFFSET },
1718   { BFD_RELOC_V850_CALLT_6_7_OFFSET,       R_V850_CALLT_6_7_OFFSET       },
1719   { BFD_RELOC_V850_CALLT_16_16_OFFSET,     R_V850_CALLT_16_16_OFFSET     },
1720   { BFD_RELOC_VTABLE_INHERIT,              R_V850_GNU_VTINHERIT          },
1721   { BFD_RELOC_VTABLE_ENTRY,                R_V850_GNU_VTENTRY            },
1722   { BFD_RELOC_V850_LONGCALL,               R_V850_LONGCALL               },
1723   { BFD_RELOC_V850_LONGJUMP,               R_V850_LONGJUMP               },
1724   { BFD_RELOC_V850_ALIGN,                  R_V850_ALIGN                  },
1725   { BFD_RELOC_V850_16_PCREL,               R_V850_16_PCREL               },
1726   { BFD_RELOC_V850_17_PCREL,               R_V850_17_PCREL               },
1727   { BFD_RELOC_V850_23,                     R_V850_23                     },
1728   { BFD_RELOC_V850_32_PCREL,               R_V850_32_PCREL               },
1729   { BFD_RELOC_V850_32_ABS,                 R_V850_32_ABS                 },
1730   { BFD_RELOC_V850_16_SPLIT_OFFSET,        R_V850_HI16                   },
1731   { BFD_RELOC_V850_16_S1,                  R_V850_16_S1                  },
1732   { BFD_RELOC_V850_LO16_S1,                R_V850_LO16_S1                },
1733   { BFD_RELOC_V850_CALLT_15_16_OFFSET,     R_V850_CALLT_15_16_OFFSET     },
1734   { BFD_RELOC_V850_32_GOTPCREL,            R_V850_32_GOTPCREL            },
1735   { BFD_RELOC_V850_16_GOT,                 R_V850_16_GOT                 },
1736   { BFD_RELOC_V850_32_GOT,                 R_V850_32_GOT                 },
1737   { BFD_RELOC_V850_22_PLT_PCREL,           R_V850_22_PLT                 },
1738   { BFD_RELOC_V850_32_PLT_PCREL,           R_V850_32_PLT                 },
1739   { BFD_RELOC_V850_COPY,                   R_V850_COPY                   },
1740   { BFD_RELOC_V850_GLOB_DAT,               R_V850_GLOB_DAT               },
1741   { BFD_RELOC_V850_JMP_SLOT,               R_V850_JMP_SLOT               },
1742   { BFD_RELOC_V850_RELATIVE,               R_V850_RELATIVE               },
1743   { BFD_RELOC_V850_16_GOTOFF,              R_V850_16_GOTOFF              },
1744   { BFD_RELOC_V850_32_GOTOFF,              R_V850_32_GOTOFF              },
1745   { BFD_RELOC_V850_CODE,                   R_V850_CODE                   },
1746   { BFD_RELOC_V850_DATA,                   R_V850_DATA                   },
1747 };
1748 
1749 #define V800_RELOC(name,sz,bit,shift,complain,pcrel,resolver)		 \
1750   HOWTO (name, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
1751 	 bfd_elf_ ## resolver ## _reloc, #name, FALSE, 0, ~0, FALSE)
1752 
1753 #define V800_EMPTY(name) EMPTY_HOWTO (name - R_V810_NONE)
1754 
1755 #define bfd_elf_v850_reloc v850_elf_reloc
1756 
1757 /* Note: It is REQUIRED that the 'type' value (R_V810_...) of each entry
1758    in this array match the index of the entry in the array minus 0x30.
1759    See: bfd_elf_v850_relocate_section(), v800_elf_reloc_type_lookup()
1760    and v800_elf_info_to_howto().  */
1761 
1762 static reloc_howto_type v800_elf_howto_table[] =
1763 {
1764   V800_RELOC (R_V810_NONE,      0,  0, 0, dont,     FALSE, generic),	/* Type = 0x30 */
1765   V800_RELOC (R_V810_BYTE,      0,  8, 0, dont,     FALSE, generic),
1766   V800_RELOC (R_V810_HWORD,     1, 16, 0, dont,     FALSE, generic),
1767   V800_RELOC (R_V810_WORD,      2, 32, 0, dont,     FALSE, generic),
1768   V800_RELOC (R_V810_WLO,       1, 16, 0, dont,     FALSE, generic),
1769   V800_RELOC (R_V810_WHI,       1, 16, 0, dont,     FALSE, generic),
1770   V800_RELOC (R_V810_WHI1,      1, 16, 0, dont,     FALSE, generic),
1771   V800_RELOC (R_V810_GPBYTE,    0,  8, 0, dont,     FALSE, v850),
1772   V800_RELOC (R_V810_GPHWORD,   1, 16, 0, dont,     FALSE, v850),
1773   V800_RELOC (R_V810_GPWORD,    2, 32, 0, dont,     FALSE, v850),
1774   V800_RELOC (R_V810_GPWLO,     1, 16, 0, dont,     FALSE, v850),
1775   V800_RELOC (R_V810_GPWHI,     1, 16, 0, dont,     FALSE, v850),
1776   V800_RELOC (R_V810_GPWHI1,    1, 16, 0, dont,     FALSE, v850),
1777   V800_RELOC (R_V850_HWLO,      1, 16, 0, dont,     FALSE, generic),
1778   V800_EMPTY (R_V810_reserved1),
1779   V800_RELOC (R_V850_EP7BIT,    0,  7, 0, unsigned, FALSE, v850),
1780   V800_RELOC (R_V850_EPHBYTE,   0,  8, 1, unsigned, FALSE, v850),
1781   V800_RELOC (R_V850_EPWBYTE,   0,  8, 2, unsigned, FALSE, v850),
1782   V800_RELOC (R_V850_REGHWLO,   1, 16, 0, dont,     FALSE, v850),
1783   V800_EMPTY (R_V810_reserved2),
1784   V800_RELOC (R_V850_GPHWLO,    1, 16, 0, dont,     FALSE, v850),
1785   V800_EMPTY (R_V810_reserved3),
1786   V800_RELOC (R_V850_PCR22,     2, 22, 0, signed,   TRUE,  generic),
1787   V800_RELOC (R_V850_BLO,       2, 24, 0, dont,     FALSE, v850),
1788   V800_RELOC (R_V850_EP4BIT,    0,  4, 0, unsigned, FALSE, v850),
1789   V800_RELOC (R_V850_EP5BIT,    0,  5, 0, unsigned, FALSE, v850),
1790   V800_RELOC (R_V850_REGBLO,    2, 24, 0, dont,     FALSE, v850),
1791   V800_RELOC (R_V850_GPBLO,     2, 24, 0, dont,     FALSE, v850),
1792   V800_RELOC (R_V810_WLO_1,     1, 16, 0, dont,     FALSE, v850),
1793   V800_RELOC (R_V810_GPWLO_1,   1, 16, 0, signed,   FALSE, v850),
1794   V800_RELOC (R_V850_BLO_1,     2, 16, 0, signed,   FALSE, v850),
1795   V800_RELOC (R_V850_HWLO_1,    1, 16, 0, signed,   FALSE, v850),
1796   V800_EMPTY  (R_V810_reserved4),
1797   V800_RELOC (R_V850_GPBLO_1,   2, 16, 1, signed,   FALSE, v850),
1798   V800_RELOC (R_V850_GPHWLO_1,  1, 16, 1, signed,   FALSE, v850),
1799   V800_EMPTY (R_V810_reserved5),
1800   V800_RELOC (R_V850_EPBLO,     2, 16, 1, signed,   FALSE, v850),
1801   V800_RELOC (R_V850_EPHWLO,    1, 16, 1, signed,   FALSE, v850),
1802   V800_EMPTY (R_V810_reserved6),
1803   V800_RELOC (R_V850_EPWLO_N,   1, 16, 1, signed,   FALSE, v850),
1804   V800_RELOC (R_V850_PC32,      2, 32, 1, signed,   TRUE,  v850),
1805   V800_RELOC (R_V850_W23BIT,    2, 23, 1, signed,   FALSE, v850),
1806   V800_RELOC (R_V850_GPW23BIT,  2, 23, 1, signed,   FALSE, v850),
1807   V800_RELOC (R_V850_EPW23BIT,  2, 23, 1, signed,   FALSE, v850),
1808   V800_RELOC (R_V850_B23BIT,    2, 23, 1, signed,   FALSE, v850),
1809   V800_RELOC (R_V850_GPB23BIT,  2, 23, 1, signed,   FALSE, v850),
1810   V800_RELOC (R_V850_EPB23BIT,  2, 23, 1, signed,   FALSE, v850),
1811   V800_RELOC (R_V850_PC16U,     1, 16, 1, unsigned, TRUE,  generic),
1812   V800_RELOC (R_V850_PC17,      2, 17, 1, signed,   TRUE,  generic),
1813   V800_RELOC (R_V850_DW8,       2,  8, 2, signed,   FALSE, v850),
1814   V800_RELOC (R_V850_GPDW8,     2,  8, 2, signed,   FALSE, v850),
1815   V800_RELOC (R_V850_EPDW8,     2,  8, 2, signed,   FALSE, v850),
1816   V800_RELOC (R_V850_PC9,       1,  9, 3, signed,   TRUE,  v850),
1817   V800_RELOC (R_V810_REGBYTE,   0,  8, 0, dont,     FALSE, v850),
1818   V800_RELOC (R_V810_REGHWORD,  1, 16, 0, dont,     FALSE, v850),
1819   V800_RELOC (R_V810_REGWORD,   2, 32, 0, dont,     FALSE, v850),
1820   V800_RELOC (R_V810_REGWLO,    1, 16, 0, dont,     FALSE, v850),
1821   V800_RELOC (R_V810_REGWHI,    1, 16, 0, dont,     FALSE, v850),
1822   V800_RELOC (R_V810_REGWHI1,   1, 16, 0, dont,     FALSE, v850),
1823   V800_RELOC (R_V850_REGW23BIT, 2, 23, 1, signed,   FALSE, v850),
1824   V800_RELOC (R_V850_REGB23BIT, 2, 23, 1, signed,   FALSE, v850),
1825   V800_RELOC (R_V850_REGDW8,    2,  8, 2, signed,   FALSE, v850),
1826   V800_RELOC (R_V810_EPBYTE,    0,  8, 0, dont,     FALSE, v850),
1827   V800_RELOC (R_V810_EPHWORD,   1, 16, 0, dont,     FALSE, v850),
1828   V800_RELOC (R_V810_EPWORD,    2, 32, 0, dont,     FALSE, v850),
1829   V800_RELOC (R_V850_WLO23,     2, 32, 1, dont,     FALSE, v850),
1830   V800_RELOC (R_V850_WORD_E,    2, 32, 1, dont,     FALSE, v850),
1831   V800_RELOC (R_V850_REGWORD_E, 2, 32, 1, dont,     FALSE, v850),
1832   V800_RELOC (R_V850_WORD,      2, 32, 0, dont,     FALSE, v850),
1833   V800_RELOC (R_V850_GPWORD,    2, 32, 0, dont,     FALSE, v850),
1834   V800_RELOC (R_V850_REGWORD,   2, 32, 0, dont,     FALSE, v850),
1835   V800_RELOC (R_V850_EPWORD,    2, 32, 0, dont,     FALSE, v850),
1836   V800_RELOC (R_V810_TPBYTE,    0,  8, 0, dont,     FALSE, v850),
1837   V800_RELOC (R_V810_TPHWORD,   1, 16, 0, dont,     FALSE, v850),
1838   V800_RELOC (R_V810_TPWORD,    2, 32, 0, dont,     FALSE, v850),
1839   V800_RELOC (R_V810_TPWLO,     1, 16, 0, dont,     FALSE, v850),
1840   V800_RELOC (R_V810_TPWHI,     1, 16, 0, dont,     FALSE, v850),
1841   V800_RELOC (R_V810_TPWHI1,    1, 16, 0, dont,     FALSE, v850),
1842   V800_RELOC (R_V850_TPHWLO,    1, 16, 1, dont,     FALSE, v850),
1843   V800_RELOC (R_V850_TPBLO,     2, 24, 0, dont,     FALSE, v850),
1844   V800_RELOC (R_V810_TPWLO_1,   1, 16, 0, signed,   FALSE, v850),
1845   V800_RELOC (R_V850_TPBLO_1,   2, 16, 0, signed,   FALSE, v850),
1846   V800_RELOC (R_V850_TPHWLO_1,  1, 16, 0, signed,   FALSE, v850),
1847   V800_RELOC (R_V850_TP23BIT,   2, 23, 0, signed,   FALSE, v850),
1848   V800_RELOC (R_V850_TPW23BIT,  2, 23, 0, signed,   FALSE, v850),
1849   V800_RELOC (R_V850_TPDW8,     2,  8, 0, signed,   FALSE, v850)
1850 };
1851 
1852 /* Map a bfd relocation into the appropriate howto structure.  */
1853 
1854 static reloc_howto_type *
v850_elf_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)1855 v850_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1856 			    bfd_reloc_code_real_type code)
1857 {
1858   unsigned int i;
1859 
1860   for (i = ARRAY_SIZE (v850_elf_reloc_map); i --;)
1861     if (v850_elf_reloc_map[i].bfd_reloc_val == code)
1862       {
1863 	unsigned int elf_reloc_val = v850_elf_reloc_map[i].elf_reloc_val;
1864 
1865 	BFD_ASSERT (v850_elf_howto_table[elf_reloc_val].type == elf_reloc_val);
1866 
1867 	return v850_elf_howto_table + elf_reloc_val;
1868       }
1869 
1870   return NULL;
1871 }
1872 
1873 static reloc_howto_type *
v850_elf_reloc_name_lookup(bfd * abfd ATTRIBUTE_UNUSED,const char * r_name)1874 v850_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1875 			    const char *r_name)
1876 {
1877   unsigned int i;
1878 
1879   for (i = 0;
1880        i < sizeof (v850_elf_howto_table) / sizeof (v850_elf_howto_table[0]);
1881        i++)
1882     if (v850_elf_howto_table[i].name != NULL
1883 	&& strcasecmp (v850_elf_howto_table[i].name, r_name) == 0)
1884       return &v850_elf_howto_table[i];
1885 
1886   return NULL;
1887 }
1888 
1889 /* Set the howto pointer for an V850 ELF reloc.  */
1890 
1891 static void
v850_elf_info_to_howto_rel(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr,Elf_Internal_Rela * dst)1892 v850_elf_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
1893 			    arelent *cache_ptr,
1894 			    Elf_Internal_Rela *dst)
1895 {
1896   unsigned int r_type;
1897 
1898   r_type = ELF32_R_TYPE (dst->r_info);
1899   BFD_ASSERT (r_type < (unsigned int) R_V850_max);
1900   cache_ptr->howto = &v850_elf_howto_table[r_type];
1901 }
1902 
1903 /* Set the howto pointer for a V850 ELF reloc (type RELA).  */
1904 
1905 static void
v850_elf_info_to_howto_rela(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr,Elf_Internal_Rela * dst)1906 v850_elf_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
1907 			     arelent * cache_ptr,
1908 			     Elf_Internal_Rela *dst)
1909 {
1910   unsigned int r_type;
1911 
1912   r_type = ELF32_R_TYPE (dst->r_info);
1913   BFD_ASSERT (r_type < (unsigned int) R_V850_max);
1914   cache_ptr->howto = &v850_elf_howto_table[r_type];
1915 }
1916 
1917 static bfd_boolean
v850_elf_is_local_label_name(bfd * abfd ATTRIBUTE_UNUSED,const char * name)1918 v850_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
1919 {
1920   return (   (name[0] == '.' && (name[1] == 'L' || name[1] == '.'))
1921 	  || (name[0] == '_' &&  name[1] == '.' && name[2] == 'L' && name[3] == '_'));
1922 }
1923 
1924 static bfd_boolean
v850_elf_is_target_special_symbol(bfd * abfd,asymbol * sym)1925 v850_elf_is_target_special_symbol (bfd *abfd, asymbol *sym)
1926 {
1927   return v850_elf_is_local_label_name (abfd, sym->name);
1928 }
1929 
1930 /* We overload some of the bfd_reloc error codes for own purposes.  */
1931 #define bfd_reloc_gp_not_found		bfd_reloc_other
1932 #define bfd_reloc_ep_not_found		bfd_reloc_continue
1933 #define bfd_reloc_ctbp_not_found	(bfd_reloc_dangerous + 1)
1934 
1935 /* Perform a relocation as part of a final link.  */
1936 
1937 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)1938 v850_elf_final_link_relocate (reloc_howto_type *howto,
1939 			      bfd *input_bfd,
1940 			      bfd *output_bfd ATTRIBUTE_UNUSED,
1941 			      asection *input_section,
1942 			      bfd_byte *contents,
1943 			      bfd_vma offset,
1944 			      bfd_vma value,
1945 			      bfd_vma addend,
1946 			      struct bfd_link_info *info,
1947 			      asection *sym_sec,
1948 			      int is_local ATTRIBUTE_UNUSED)
1949 {
1950   unsigned int r_type = howto->type;
1951   bfd_byte *hit_data = contents + offset;
1952 
1953   /* Adjust the value according to the relocation.  */
1954   switch (r_type)
1955     {
1956     case R_V850_PC9:
1957     case R_V850_9_PCREL:
1958       value -= (input_section->output_section->vma
1959 		+ input_section->output_offset);
1960       value -= offset;
1961       break;
1962 
1963     case R_V850_PC16U:
1964     case R_V850_16_PCREL:
1965       value -= (input_section->output_section->vma
1966 		+ input_section->output_offset
1967 		+ offset);
1968 
1969       /* If the sign extension will corrupt the value then we have overflowed.  */
1970       if ((value & 0xffff0000) != 0xffff0000)
1971 	return bfd_reloc_overflow;
1972 
1973       break;
1974 
1975     case R_V850_PC17:
1976     case R_V850_17_PCREL:
1977       value -= (input_section->output_section->vma
1978 		+ input_section->output_offset
1979 		+ offset);
1980 
1981       /* If the sign extension will corrupt the value then we have overflowed.  */
1982       if (((value & 0xffff0000) != 0x0) && ((value & 0xffff0000) != 0xffff0000))
1983 	return bfd_reloc_overflow;
1984 
1985       value = SEXT17 (value);
1986       break;
1987 
1988     case R_V850_PCR22:
1989     case R_V850_22_PCREL:
1990       value -= (input_section->output_section->vma
1991 		+ input_section->output_offset
1992 		+ offset);
1993 
1994       /* If the sign extension will corrupt the value then we have overflowed.  */
1995       if (((value & 0xffe00000) != 0x0) && ((value & 0xffe00000) != 0xffe00000))
1996 	return bfd_reloc_overflow;
1997 
1998       /* Only the bottom 22 bits of the PC are valid.  */
1999       value = SEXT22 (value);
2000       break;
2001 
2002     case R_V850_PC32:
2003     case R_V850_32_PCREL:
2004       value -= (input_section->output_section->vma
2005 		+ input_section->output_offset
2006 		+ offset);
2007       break;
2008 
2009     case R_V850_32_ABS:
2010     case R_V850_23:
2011     case R_V850_HI16_S:
2012     case R_V850_HI16:
2013     case R_V850_LO16:
2014     case R_V850_LO16_S1:
2015     case R_V850_LO16_SPLIT_OFFSET:
2016     case R_V850_16:
2017     case R_V850_ABS32:
2018     case R_V850_8:
2019     case R_V810_BYTE:
2020     case R_V810_HWORD:
2021     case R_V810_WORD:
2022     case R_V810_WLO:
2023     case R_V810_WHI:
2024     case R_V810_WHI1:
2025     case R_V810_WLO_1:
2026     case R_V850_WLO23:
2027     case R_V850_BLO:
2028       break;
2029 
2030     case R_V850_ZDA_15_16_OFFSET:
2031     case R_V850_ZDA_16_16_OFFSET:
2032     case R_V850_ZDA_16_16_SPLIT_OFFSET:
2033       if (sym_sec == NULL)
2034 	return bfd_reloc_undefined;
2035 
2036       value -= sym_sec->output_section->vma;
2037       break;
2038 
2039     case R_V850_SDA_15_16_OFFSET:
2040     case R_V850_SDA_16_16_OFFSET:
2041     case R_V850_SDA_16_16_SPLIT_OFFSET:
2042     case R_V810_GPWLO_1:
2043       {
2044 	unsigned long                gp;
2045 	struct bfd_link_hash_entry * h;
2046 
2047 	if (sym_sec == NULL)
2048 	  return bfd_reloc_undefined;
2049 
2050 	/* Get the value of __gp.  */
2051 	h = bfd_link_hash_lookup (info->hash, "__gp", FALSE, FALSE, TRUE);
2052 	if (h == NULL
2053 	    || h->type != bfd_link_hash_defined)
2054 	  return bfd_reloc_gp_not_found;
2055 
2056 	gp = (h->u.def.value
2057 	      + h->u.def.section->output_section->vma
2058 	      + h->u.def.section->output_offset);
2059 
2060 	value -= sym_sec->output_section->vma;
2061 	value -= (gp - sym_sec->output_section->vma);
2062       }
2063     break;
2064 
2065     case R_V850_TDA_4_4_OFFSET:
2066     case R_V850_TDA_4_5_OFFSET:
2067     case R_V850_TDA_7_7_OFFSET:
2068     case R_V850_TDA_7_8_OFFSET:
2069     case R_V850_TDA_6_8_OFFSET:
2070     case R_V850_TDA_16_16_OFFSET:
2071       {
2072 	unsigned long                ep;
2073 	struct bfd_link_hash_entry * h;
2074 
2075 	/* Get the value of __ep.  */
2076 	h = bfd_link_hash_lookup (info->hash, "__ep", FALSE, FALSE, TRUE);
2077 	if (h == NULL
2078 	    || h->type != bfd_link_hash_defined)
2079 	  return bfd_reloc_ep_not_found;
2080 
2081 	ep = (h->u.def.value
2082 	      + h->u.def.section->output_section->vma
2083 	      + h->u.def.section->output_offset);
2084 
2085 	value -= ep;
2086       }
2087     break;
2088 
2089     case R_V850_CALLT_6_7_OFFSET:
2090       {
2091 	unsigned long                ctbp;
2092 	struct bfd_link_hash_entry * h;
2093 
2094 	/* Get the value of __ctbp.  */
2095 	h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
2096 	if (h == NULL
2097 	    || h->type != bfd_link_hash_defined)
2098 	  return bfd_reloc_ctbp_not_found;
2099 
2100 	ctbp = (h->u.def.value
2101 	      + h->u.def.section->output_section->vma
2102 	      + h->u.def.section->output_offset);
2103 	value -= ctbp;
2104       }
2105     break;
2106 
2107     case R_V850_CALLT_15_16_OFFSET:
2108     case R_V850_CALLT_16_16_OFFSET:
2109       {
2110 	unsigned long                ctbp;
2111 	struct bfd_link_hash_entry * h;
2112 
2113 	if (sym_sec == NULL)
2114 	  return bfd_reloc_undefined;
2115 
2116 	/* Get the value of __ctbp.  */
2117 	h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
2118 	if (h == NULL
2119 	    || h->type != bfd_link_hash_defined)
2120 	  return bfd_reloc_ctbp_not_found;
2121 
2122 	ctbp = (h->u.def.value
2123 	      + h->u.def.section->output_section->vma
2124 	      + h->u.def.section->output_offset);
2125 
2126 	value -= sym_sec->output_section->vma;
2127 	value -= (ctbp - sym_sec->output_section->vma);
2128       }
2129     break;
2130 
2131     case R_V850_NONE:
2132     case R_V810_NONE:
2133     case R_V850_GNU_VTINHERIT:
2134     case R_V850_GNU_VTENTRY:
2135     case R_V850_LONGCALL:
2136     case R_V850_LONGJUMP:
2137     case R_V850_ALIGN:
2138       return bfd_reloc_ok;
2139 
2140     default:
2141 #ifdef DEBUG
2142       fprintf (stderr, "reloc number %d not recognised\n", r_type);
2143 #endif
2144       return bfd_reloc_notsupported;
2145     }
2146 
2147   /* Perform the relocation.  */
2148   return v850_elf_perform_relocation (input_bfd, r_type, value + addend, hit_data);
2149 }
2150 
2151 /* Relocate an V850 ELF section.  */
2152 
2153 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)2154 v850_elf_relocate_section (bfd *output_bfd,
2155 			   struct bfd_link_info *info,
2156 			   bfd *input_bfd,
2157 			   asection *input_section,
2158 			   bfd_byte *contents,
2159 			   Elf_Internal_Rela *relocs,
2160 			   Elf_Internal_Sym *local_syms,
2161 			   asection **local_sections)
2162 {
2163   Elf_Internal_Shdr *symtab_hdr;
2164   struct elf_link_hash_entry **sym_hashes;
2165   Elf_Internal_Rela *rel;
2166   Elf_Internal_Rela *relend;
2167 
2168   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
2169   sym_hashes = elf_sym_hashes (input_bfd);
2170 
2171   /* Reset the list of remembered HI16S relocs to empty.  */
2172   free_hi16s     = previous_hi16s;
2173   previous_hi16s = NULL;
2174   hi16s_counter  = 0;
2175 
2176   rel    = relocs;
2177   relend = relocs + input_section->reloc_count;
2178   for (; rel < relend; rel++)
2179     {
2180       unsigned int r_type;
2181       reloc_howto_type *howto;
2182       unsigned long r_symndx;
2183       Elf_Internal_Sym *sym;
2184       asection *sec;
2185       struct elf_link_hash_entry *h;
2186       bfd_vma relocation;
2187       bfd_reloc_status_type r;
2188 
2189       r_symndx = ELF32_R_SYM (rel->r_info);
2190       r_type   = ELF32_R_TYPE (rel->r_info);
2191 
2192       if (r_type == R_V850_GNU_VTENTRY
2193           || r_type == R_V850_GNU_VTINHERIT)
2194         continue;
2195 
2196       if (bfd_get_arch (input_bfd) == bfd_arch_v850_rh850)
2197 	howto = v800_elf_howto_table + (r_type - R_V810_NONE);
2198       else
2199 	howto = v850_elf_howto_table + r_type;
2200 
2201       BFD_ASSERT (r_type == howto->type);
2202 
2203       h = NULL;
2204       sym = NULL;
2205       sec = NULL;
2206       if (r_symndx < symtab_hdr->sh_info)
2207 	{
2208 	  sym = local_syms + r_symndx;
2209 	  sec = local_sections[r_symndx];
2210 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2211 	}
2212       else
2213 	{
2214 	  bfd_boolean unresolved_reloc, warned, ignored;
2215 
2216 	  /* Note - this check is delayed until now as it is possible and
2217 	     valid to have a file without any symbols but with relocs that
2218 	     can be processed.  */
2219 	  if (sym_hashes == NULL)
2220 	    {
2221 	      info->callbacks->warning
2222 		(info, "no hash table available",
2223 		 NULL, input_bfd, input_section, (bfd_vma) 0);
2224 
2225 	      return FALSE;
2226 	    }
2227 
2228 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2229 				   r_symndx, symtab_hdr, sym_hashes,
2230 				   h, sec, relocation,
2231 				   unresolved_reloc, warned, ignored);
2232 	}
2233 
2234       if (sec != NULL && discarded_section (sec))
2235 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2236 					 rel, 1, relend, howto, 0, contents);
2237 
2238       if (info->relocatable)
2239 	continue;
2240 
2241       /* FIXME: We should use the addend, but the COFF relocations don't.  */
2242       r = v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
2243 					input_section,
2244 					contents, rel->r_offset,
2245 					relocation, rel->r_addend,
2246 					info, sec, h == NULL);
2247 
2248       if (r != bfd_reloc_ok)
2249 	{
2250 	  const char * name;
2251 	  const char * msg = NULL;
2252 
2253 	  if (h != NULL)
2254 	    name = h->root.root.string;
2255 	  else
2256 	    {
2257 	      name = (bfd_elf_string_from_elf_section
2258 		      (input_bfd, symtab_hdr->sh_link, sym->st_name));
2259 	      if (name == NULL || *name == '\0')
2260 		name = bfd_section_name (input_bfd, sec);
2261 	    }
2262 
2263 	  switch ((int) r)
2264 	    {
2265 	    case bfd_reloc_overflow:
2266 	      if (! ((*info->callbacks->reloc_overflow)
2267 		     (info, (h ? &h->root : NULL), name, howto->name,
2268 		      (bfd_vma) 0, input_bfd, input_section,
2269 		      rel->r_offset)))
2270 		return FALSE;
2271 	      break;
2272 
2273 	    case bfd_reloc_undefined:
2274 	      if (! ((*info->callbacks->undefined_symbol)
2275 		     (info, name, input_bfd, input_section,
2276 		      rel->r_offset, TRUE)))
2277 		return FALSE;
2278 	      break;
2279 
2280 	    case bfd_reloc_outofrange:
2281 	      msg = _("internal error: out of range error");
2282 	      goto common_error;
2283 
2284 	    case bfd_reloc_notsupported:
2285 	      msg = _("internal error: unsupported relocation error");
2286 	      goto common_error;
2287 
2288 	    case bfd_reloc_dangerous:
2289 	      msg = _("internal error: dangerous relocation");
2290 	      goto common_error;
2291 
2292 	    case bfd_reloc_gp_not_found:
2293 	      msg = _("could not locate special linker symbol __gp");
2294 	      goto common_error;
2295 
2296 	    case bfd_reloc_ep_not_found:
2297 	      msg = _("could not locate special linker symbol __ep");
2298 	      goto common_error;
2299 
2300 	    case bfd_reloc_ctbp_not_found:
2301 	      msg = _("could not locate special linker symbol __ctbp");
2302 	      goto common_error;
2303 
2304 	    default:
2305 	      msg = _("internal error: unknown error");
2306 	      /* fall through */
2307 
2308 	    common_error:
2309 	      if (!((*info->callbacks->warning)
2310 		    (info, msg, name, input_bfd, input_section,
2311 		     rel->r_offset)))
2312 		return FALSE;
2313 	      break;
2314 	    }
2315 	}
2316     }
2317 
2318   return TRUE;
2319 }
2320 
2321 static asection *
v850_elf_gc_mark_hook(asection * sec,struct bfd_link_info * info,Elf_Internal_Rela * rel,struct elf_link_hash_entry * h,Elf_Internal_Sym * sym)2322 v850_elf_gc_mark_hook (asection *sec,
2323 		       struct bfd_link_info *info,
2324 		       Elf_Internal_Rela *rel,
2325 		       struct elf_link_hash_entry *h,
2326 		       Elf_Internal_Sym *sym)
2327 {
2328   if (h != NULL)
2329     switch (ELF32_R_TYPE (rel->r_info))
2330       {
2331       case R_V850_GNU_VTINHERIT:
2332       case R_V850_GNU_VTENTRY:
2333 	return NULL;
2334       }
2335 
2336   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2337 }
2338 
2339 /* Set the right machine number and architecture.  */
2340 
2341 static bfd_boolean
v850_elf_object_p(bfd * abfd)2342 v850_elf_object_p (bfd *abfd)
2343 {
2344   enum bfd_architecture arch;
2345   unsigned long mach;
2346 
2347   switch (elf_elfheader (abfd)->e_machine)
2348     {
2349     case EM_V800:
2350       arch = bfd_arch_v850_rh850;
2351       mach = (elf_elfheader (abfd)->e_flags & EF_V800_850E3)
2352 	? bfd_mach_v850e3v5 : bfd_mach_v850e2v3;
2353       break;
2354 
2355     case EM_CYGNUS_V850:
2356     case EM_V850:
2357       arch = bfd_arch_v850;
2358       switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
2359 	{
2360 	default:
2361 	case E_V850_ARCH:     mach = bfd_mach_v850; break;
2362 	case E_V850E_ARCH:    mach = bfd_mach_v850e; break;
2363 	case E_V850E1_ARCH:   mach = bfd_mach_v850e1; break;
2364 	case E_V850E2_ARCH:   mach = bfd_mach_v850e2; break;
2365 	case E_V850E2V3_ARCH: mach = bfd_mach_v850e2v3; break;
2366 	case E_V850E3V5_ARCH: mach = bfd_mach_v850e3v5; break;
2367 	}
2368       break;
2369 
2370     default:
2371       return FALSE;
2372     }
2373 
2374   return bfd_default_set_arch_mach (abfd, arch, mach);
2375 }
2376 
2377 /* Store the machine number in the flags field.  */
2378 
2379 static void
v850_elf_final_write_processing(bfd * abfd,bfd_boolean linker ATTRIBUTE_UNUSED)2380 v850_elf_final_write_processing (bfd *abfd,
2381 				 bfd_boolean linker ATTRIBUTE_UNUSED)
2382 {
2383   unsigned long val;
2384 
2385   switch (bfd_get_arch (abfd))
2386     {
2387     case bfd_arch_v850_rh850:
2388       val = EF_RH850_ABI;
2389       if (bfd_get_mach (abfd) == bfd_mach_v850e3v5)
2390 	val |= EF_V800_850E3;
2391       elf_elfheader (abfd)->e_flags |= val;
2392       break;
2393 
2394     case bfd_arch_v850:
2395       switch (bfd_get_mach (abfd))
2396 	{
2397 	default:
2398 	case bfd_mach_v850:     val = E_V850_ARCH; break;
2399 	case bfd_mach_v850e:    val = E_V850E_ARCH; break;
2400 	case bfd_mach_v850e1:   val = E_V850E1_ARCH; break;
2401 	case bfd_mach_v850e2:   val = E_V850E2_ARCH; break;
2402 	case bfd_mach_v850e2v3: val = E_V850E2V3_ARCH; break;
2403 	case bfd_mach_v850e3v5: val = E_V850E3V5_ARCH; break;
2404 	}
2405       elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
2406       elf_elfheader (abfd)->e_flags |= val;
2407       break;
2408     default:
2409       break;
2410     }
2411 }
2412 
2413 /* Function to keep V850 specific file flags.  */
2414 
2415 static bfd_boolean
v850_elf_set_private_flags(bfd * abfd,flagword flags)2416 v850_elf_set_private_flags (bfd *abfd, flagword flags)
2417 {
2418   BFD_ASSERT (!elf_flags_init (abfd)
2419 	      || elf_elfheader (abfd)->e_flags == flags);
2420 
2421   elf_elfheader (abfd)->e_flags = flags;
2422   elf_flags_init (abfd) = TRUE;
2423   return TRUE;
2424 }
2425 
2426 /* Merge backend specific data from an object file
2427    to the output object file when linking.  */
2428 
2429 static bfd_boolean
v850_elf_merge_private_bfd_data(bfd * ibfd,bfd * obfd)2430 v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
2431 {
2432   flagword out_flags;
2433   flagword in_flags;
2434 
2435   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2436       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2437     return TRUE;
2438 
2439   in_flags = elf_elfheader (ibfd)->e_flags;
2440   out_flags = elf_elfheader (obfd)->e_flags;
2441 
2442   if (! elf_flags_init (obfd))
2443     {
2444       /* If the input is the default architecture then do not
2445 	 bother setting the flags for the output architecture,
2446 	 instead allow future merges to do this.  If no future
2447 	 merges ever set these flags then they will retain their
2448 	 unitialised values, which surprise surprise, correspond
2449 	 to the default values.  */
2450       if (bfd_get_arch_info (ibfd)->the_default)
2451 	return TRUE;
2452 
2453       elf_flags_init (obfd) = TRUE;
2454       elf_elfheader (obfd)->e_flags = in_flags;
2455 
2456       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2457 	  && bfd_get_arch_info (obfd)->the_default)
2458 	return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
2459 
2460       return TRUE;
2461     }
2462 
2463   /* Check flag compatibility.  */
2464   if (in_flags == out_flags)
2465     return TRUE;
2466 
2467   if (bfd_get_arch (obfd) == bfd_arch_v850_rh850)
2468     {
2469       if ((in_flags & EF_V800_850E3) != (out_flags & EF_V800_850E3))
2470 	{
2471 	  _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
2472 			      ibfd);
2473 	  elf_elfheader (obfd)->e_flags |= EF_V800_850E3;
2474 	}
2475 
2476       if ((in_flags & EF_RH850_DATA_ALIGN8) != (out_flags & EF_RH850_DATA_ALIGN8))
2477 	{
2478 	  _bfd_error_handler (_("%B: Alignment mismatch with previous modules"),
2479 			      ibfd);
2480 	  elf_elfheader (obfd)->e_flags |= EF_RH850_DATA_ALIGN8;
2481 	}
2482 
2483       return TRUE;
2484     }
2485 
2486   if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
2487       && (in_flags & EF_V850_ARCH) != E_V850_ARCH)
2488     {
2489       /* Allow earlier architecture binaries to be linked with later binaries.
2490          Set the output binary to the later architecture, except for v850e1,
2491          which we set to v850e.  */
2492       if (   (in_flags  & EF_V850_ARCH) == E_V850E1_ARCH
2493           && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
2494         return TRUE;
2495 
2496       if (   (in_flags  & EF_V850_ARCH) == E_V850_ARCH
2497 	  && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
2498 	{
2499 	  elf_elfheader (obfd)->e_flags =
2500 	    ((out_flags & ~ EF_V850_ARCH) | E_V850E_ARCH);
2501 	  return TRUE;
2502 	}
2503 
2504       if ((   (in_flags & EF_V850_ARCH) == E_V850_ARCH
2505 	   || (in_flags & EF_V850_ARCH) == E_V850E_ARCH)
2506 	  && (out_flags & EF_V850_ARCH) == E_V850E2_ARCH)
2507 	{
2508 	  elf_elfheader (obfd)->e_flags =
2509 	    ((out_flags & ~ EF_V850_ARCH) | E_V850E2_ARCH);
2510 	  return TRUE;
2511 	}
2512 
2513       if ((   (in_flags & EF_V850_ARCH) == E_V850_ARCH
2514 	   || (in_flags & EF_V850_ARCH) == E_V850E_ARCH
2515 	   || (in_flags & EF_V850_ARCH) == E_V850E2_ARCH)
2516 	  && (out_flags & EF_V850_ARCH) == E_V850E2V3_ARCH)
2517 	{
2518 	  elf_elfheader (obfd)->e_flags =
2519 	    ((out_flags & ~ EF_V850_ARCH) | E_V850E2V3_ARCH);
2520 	  return TRUE;
2521 	}
2522 
2523       if ((   (in_flags & EF_V850_ARCH) == E_V850_ARCH
2524 	   || (in_flags & EF_V850_ARCH) == E_V850E_ARCH
2525 	   || (in_flags & EF_V850_ARCH) == E_V850E2_ARCH
2526            || (in_flags & EF_V850_ARCH) == E_V850E2V3_ARCH)
2527 	  && (out_flags & EF_V850_ARCH) == E_V850E3V5_ARCH)
2528 	{
2529 	  elf_elfheader (obfd)->e_flags =
2530 	    ((out_flags & ~ EF_V850_ARCH) | E_V850E3V5_ARCH);
2531 	  return TRUE;
2532 	}
2533 
2534       _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
2535 			  ibfd);
2536     }
2537 
2538   return TRUE;
2539 }
2540 
2541 /* Display the flags field.  */
2542 
2543 static bfd_boolean
v850_elf_print_private_bfd_data(bfd * abfd,void * ptr)2544 v850_elf_print_private_bfd_data (bfd *abfd, void * ptr)
2545 {
2546   FILE * file = (FILE *) ptr;
2547 
2548   BFD_ASSERT (abfd != NULL && ptr != NULL);
2549 
2550   _bfd_elf_print_private_bfd_data (abfd, ptr);
2551 
2552   /* xgettext:c-format.  */
2553   fprintf (file, _("private flags = %lx: "), elf_elfheader (abfd)->e_flags);
2554 
2555   if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
2556     {
2557       if ((elf_elfheader (abfd)->e_flags & EF_RH850_ABI) != EF_RH850_ABI)
2558 	fprintf (file, _("unknown v850 architecture"));
2559       else if (elf_elfheader (abfd)->e_flags & EF_V800_850E3)
2560 	fprintf (file, _("v850 E3 architecture"));
2561       else
2562 	fprintf (file, _("v850 architecture"));
2563 
2564       if (elf_elfheader (abfd)->e_flags & EF_RH850_DATA_ALIGN8)
2565 	fprintf (file, _(", 8-byte data alignment"));
2566     }
2567   else
2568     {
2569       switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
2570 	{
2571 	default:
2572 	case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
2573 	case E_V850E_ARCH: fprintf (file, _("v850e architecture")); break;
2574 	case E_V850E1_ARCH: fprintf (file, _("v850e1 architecture")); break;
2575 	case E_V850E2_ARCH: fprintf (file, _("v850e2 architecture")); break;
2576 	case E_V850E2V3_ARCH: fprintf (file, _("v850e2v3 architecture")); break;
2577 	case E_V850E3V5_ARCH: fprintf (file, _("v850e3v5 architecture")); break;
2578 	}
2579     }
2580 
2581   fputc ('\n', file);
2582 
2583   return TRUE;
2584 }
2585 
2586 /* V850 ELF uses four common sections.  One is the usual one, and the
2587    others are for (small) objects in one of the special data areas:
2588    small, tiny and zero.  All the objects are kept together, and then
2589    referenced via the gp register, the ep register or the r0 register
2590    respectively, which yields smaller, faster assembler code.  This
2591    approach is copied from elf32-mips.c.  */
2592 
2593 static asection  v850_elf_scom_section;
2594 static asymbol   v850_elf_scom_symbol;
2595 static asymbol * v850_elf_scom_symbol_ptr;
2596 static asection  v850_elf_tcom_section;
2597 static asymbol   v850_elf_tcom_symbol;
2598 static asymbol * v850_elf_tcom_symbol_ptr;
2599 static asection  v850_elf_zcom_section;
2600 static asymbol   v850_elf_zcom_symbol;
2601 static asymbol * v850_elf_zcom_symbol_ptr;
2602 
2603 /* Given a BFD section, try to locate the
2604    corresponding ELF section index.  */
2605 
2606 static bfd_boolean
v850_elf_section_from_bfd_section(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,int * retval)2607 v850_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
2608 				   asection *sec,
2609 				   int *retval)
2610 {
2611   if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
2612     *retval = SHN_V850_SCOMMON;
2613   else if (strcmp (bfd_get_section_name (abfd, sec), ".tcommon") == 0)
2614     *retval = SHN_V850_TCOMMON;
2615   else if (strcmp (bfd_get_section_name (abfd, sec), ".zcommon") == 0)
2616     *retval = SHN_V850_ZCOMMON;
2617   else
2618     return FALSE;
2619 
2620   return TRUE;
2621 }
2622 
2623 /* Handle the special V850 section numbers that a symbol may use.  */
2624 
2625 static void
v850_elf_symbol_processing(bfd * abfd,asymbol * asym)2626 v850_elf_symbol_processing (bfd *abfd, asymbol *asym)
2627 {
2628   elf_symbol_type * elfsym = (elf_symbol_type *) asym;
2629   unsigned int indx;
2630 
2631   indx = elfsym->internal_elf_sym.st_shndx;
2632 
2633   /* If the section index is an "ordinary" index, then it may
2634      refer to a v850 specific section created by the assembler.
2635      Check the section's type and change the index it matches.
2636 
2637      FIXME: Should we alter the st_shndx field as well ?  */
2638 
2639   if (indx < elf_numsections (abfd))
2640     switch (elf_elfsections (abfd)[indx]->sh_type)
2641       {
2642       case SHT_V850_SCOMMON:
2643 	indx = SHN_V850_SCOMMON;
2644 	break;
2645 
2646       case SHT_V850_TCOMMON:
2647 	indx = SHN_V850_TCOMMON;
2648 	break;
2649 
2650       case SHT_V850_ZCOMMON:
2651 	indx = SHN_V850_ZCOMMON;
2652 	break;
2653 
2654       default:
2655 	break;
2656       }
2657 
2658   switch (indx)
2659     {
2660     case SHN_V850_SCOMMON:
2661       if (v850_elf_scom_section.name == NULL)
2662 	{
2663 	  /* Initialize the small common section.  */
2664 	  v850_elf_scom_section.name           = ".scommon";
2665 	  v850_elf_scom_section.flags          = SEC_IS_COMMON | SEC_ALLOC | SEC_DATA;
2666 	  v850_elf_scom_section.output_section = & v850_elf_scom_section;
2667 	  v850_elf_scom_section.symbol         = & v850_elf_scom_symbol;
2668 	  v850_elf_scom_section.symbol_ptr_ptr = & v850_elf_scom_symbol_ptr;
2669 	  v850_elf_scom_symbol.name            = ".scommon";
2670 	  v850_elf_scom_symbol.flags           = BSF_SECTION_SYM;
2671 	  v850_elf_scom_symbol.section         = & v850_elf_scom_section;
2672 	  v850_elf_scom_symbol_ptr             = & v850_elf_scom_symbol;
2673 	}
2674       asym->section = & v850_elf_scom_section;
2675       asym->value = elfsym->internal_elf_sym.st_size;
2676       break;
2677 
2678     case SHN_V850_TCOMMON:
2679       if (v850_elf_tcom_section.name == NULL)
2680 	{
2681 	  /* Initialize the tcommon section.  */
2682 	  v850_elf_tcom_section.name           = ".tcommon";
2683 	  v850_elf_tcom_section.flags          = SEC_IS_COMMON;
2684 	  v850_elf_tcom_section.output_section = & v850_elf_tcom_section;
2685 	  v850_elf_tcom_section.symbol         = & v850_elf_tcom_symbol;
2686 	  v850_elf_tcom_section.symbol_ptr_ptr = & v850_elf_tcom_symbol_ptr;
2687 	  v850_elf_tcom_symbol.name            = ".tcommon";
2688 	  v850_elf_tcom_symbol.flags           = BSF_SECTION_SYM;
2689 	  v850_elf_tcom_symbol.section         = & v850_elf_tcom_section;
2690 	  v850_elf_tcom_symbol_ptr             = & v850_elf_tcom_symbol;
2691 	}
2692       asym->section = & v850_elf_tcom_section;
2693       asym->value = elfsym->internal_elf_sym.st_size;
2694       break;
2695 
2696     case SHN_V850_ZCOMMON:
2697       if (v850_elf_zcom_section.name == NULL)
2698 	{
2699 	  /* Initialize the zcommon section.  */
2700 	  v850_elf_zcom_section.name           = ".zcommon";
2701 	  v850_elf_zcom_section.flags          = SEC_IS_COMMON;
2702 	  v850_elf_zcom_section.output_section = & v850_elf_zcom_section;
2703 	  v850_elf_zcom_section.symbol         = & v850_elf_zcom_symbol;
2704 	  v850_elf_zcom_section.symbol_ptr_ptr = & v850_elf_zcom_symbol_ptr;
2705 	  v850_elf_zcom_symbol.name            = ".zcommon";
2706 	  v850_elf_zcom_symbol.flags           = BSF_SECTION_SYM;
2707 	  v850_elf_zcom_symbol.section         = & v850_elf_zcom_section;
2708 	  v850_elf_zcom_symbol_ptr             = & v850_elf_zcom_symbol;
2709 	}
2710       asym->section = & v850_elf_zcom_section;
2711       asym->value = elfsym->internal_elf_sym.st_size;
2712       break;
2713     }
2714 }
2715 
2716 /* Hook called by the linker routine which adds symbols from an object
2717    file.  We must handle the special v850 section numbers here.  */
2718 
2719 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)2720 v850_elf_add_symbol_hook (bfd *abfd,
2721 			  struct bfd_link_info *info ATTRIBUTE_UNUSED,
2722 			  Elf_Internal_Sym *sym,
2723 			  const char **namep ATTRIBUTE_UNUSED,
2724 			  flagword *flagsp ATTRIBUTE_UNUSED,
2725 			  asection **secp,
2726 			  bfd_vma *valp)
2727 {
2728   unsigned int indx = sym->st_shndx;
2729 
2730   /* If the section index is an "ordinary" index, then it may
2731      refer to a v850 specific section created by the assembler.
2732      Check the section's type and change the index it matches.
2733 
2734      FIXME: Should we alter the st_shndx field as well ?  */
2735 
2736   if (indx < elf_numsections (abfd))
2737     switch (elf_elfsections (abfd)[indx]->sh_type)
2738       {
2739       case SHT_V850_SCOMMON:
2740 	indx = SHN_V850_SCOMMON;
2741 	break;
2742 
2743       case SHT_V850_TCOMMON:
2744 	indx = SHN_V850_TCOMMON;
2745 	break;
2746 
2747       case SHT_V850_ZCOMMON:
2748 	indx = SHN_V850_ZCOMMON;
2749 	break;
2750 
2751       default:
2752 	break;
2753       }
2754 
2755   switch (indx)
2756     {
2757     case SHN_V850_SCOMMON:
2758       *secp = bfd_make_section_old_way (abfd, ".scommon");
2759       (*secp)->flags |= SEC_IS_COMMON;
2760       *valp = sym->st_size;
2761       break;
2762 
2763     case SHN_V850_TCOMMON:
2764       *secp = bfd_make_section_old_way (abfd, ".tcommon");
2765       (*secp)->flags |= SEC_IS_COMMON;
2766       *valp = sym->st_size;
2767       break;
2768 
2769     case SHN_V850_ZCOMMON:
2770       *secp = bfd_make_section_old_way (abfd, ".zcommon");
2771       (*secp)->flags |= SEC_IS_COMMON;
2772       *valp = sym->st_size;
2773       break;
2774     }
2775 
2776   return TRUE;
2777 }
2778 
2779 static int
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)2780 v850_elf_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
2781 				  const char *name ATTRIBUTE_UNUSED,
2782 				  Elf_Internal_Sym *sym,
2783 				  asection *input_sec,
2784 				  struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
2785 {
2786   /* If we see a common symbol, which implies a relocatable link, then
2787      if a symbol was in a special common section in an input file, mark
2788      it as a special common in the output file.  */
2789 
2790   if (sym->st_shndx == SHN_COMMON)
2791     {
2792       if (strcmp (input_sec->name, ".scommon") == 0)
2793 	sym->st_shndx = SHN_V850_SCOMMON;
2794       else if (strcmp (input_sec->name, ".tcommon") == 0)
2795 	sym->st_shndx = SHN_V850_TCOMMON;
2796       else if (strcmp (input_sec->name, ".zcommon") == 0)
2797 	sym->st_shndx = SHN_V850_ZCOMMON;
2798     }
2799 
2800   /* The price we pay for using h->other unused bits as flags in the
2801      linker is cleaning up after ourselves.  */
2802 
2803   sym->st_other &= ~(V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA
2804 		     | V850_OTHER_ERROR);
2805 
2806   return 1;
2807 }
2808 
2809 static bfd_boolean
v850_elf_section_from_shdr(bfd * abfd,Elf_Internal_Shdr * hdr,const char * name,int shindex)2810 v850_elf_section_from_shdr (bfd *abfd,
2811 			    Elf_Internal_Shdr *hdr,
2812 			    const char *name,
2813 			    int shindex)
2814 {
2815   /* There ought to be a place to keep ELF backend specific flags, but
2816      at the moment there isn't one.  We just keep track of the
2817      sections by their name, instead.  */
2818 
2819   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
2820     return FALSE;
2821 
2822   switch (hdr->sh_type)
2823     {
2824     case SHT_V850_SCOMMON:
2825     case SHT_V850_TCOMMON:
2826     case SHT_V850_ZCOMMON:
2827       if (! bfd_set_section_flags (abfd, hdr->bfd_section,
2828 				   (bfd_get_section_flags (abfd,
2829 							   hdr->bfd_section)
2830 				    | SEC_IS_COMMON)))
2831 	return FALSE;
2832     }
2833 
2834   return TRUE;
2835 }
2836 
2837 /* Set the correct type for a V850 ELF section.  We do this
2838    by the section name, which is a hack, but ought to work.  */
2839 
2840 static bfd_boolean
v850_elf_fake_sections(bfd * abfd ATTRIBUTE_UNUSED,Elf_Internal_Shdr * hdr,asection * sec)2841 v850_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
2842 			Elf_Internal_Shdr *hdr,
2843 			asection *sec)
2844 {
2845   const char * name;
2846 
2847   name = bfd_get_section_name (abfd, sec);
2848 
2849   if (strcmp (name, ".scommon") == 0)
2850     hdr->sh_type = SHT_V850_SCOMMON;
2851   else if (strcmp (name, ".tcommon") == 0)
2852     hdr->sh_type = SHT_V850_TCOMMON;
2853   else if (strcmp (name, ".zcommon") == 0)
2854     hdr->sh_type = SHT_V850_ZCOMMON;
2855 
2856   return TRUE;
2857 }
2858 
2859 /* Delete some bytes from a section while relaxing.  */
2860 
2861 static bfd_boolean
v850_elf_relax_delete_bytes(bfd * abfd,asection * sec,bfd_vma addr,bfd_vma toaddr,int count)2862 v850_elf_relax_delete_bytes (bfd *abfd,
2863 			     asection *sec,
2864 			     bfd_vma addr,
2865 			     bfd_vma toaddr,
2866 			     int count)
2867 {
2868   Elf_Internal_Shdr *symtab_hdr;
2869   Elf32_External_Sym *extsyms;
2870   Elf32_External_Sym *esym;
2871   Elf32_External_Sym *esymend;
2872   int sym_index;
2873   unsigned int sec_shndx;
2874   bfd_byte *contents;
2875   Elf_Internal_Rela *irel;
2876   Elf_Internal_Rela *irelend;
2877   struct elf_link_hash_entry *sym_hash;
2878   Elf_Internal_Shdr *shndx_hdr;
2879   Elf_External_Sym_Shndx *shndx;
2880 
2881   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2882   extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
2883 
2884   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2885 
2886   contents = elf_section_data (sec)->this_hdr.contents;
2887 
2888   /* The deletion must stop at the next ALIGN reloc for an alignment
2889      power larger than the number of bytes we are deleting.  */
2890 
2891   /* Actually delete the bytes.  */
2892 #if (DEBUG_RELAX & 2)
2893   fprintf (stderr, "relax_delete: contents: sec: %s  %p .. %p %x\n",
2894 	   sec->name, addr, toaddr, count );
2895 #endif
2896   memmove (contents + addr, contents + addr + count,
2897 	   toaddr - addr - count);
2898   memset (contents + toaddr-count, 0, count);
2899 
2900   /* Adjust all the relocs.  */
2901   irel = elf_section_data (sec)->relocs;
2902   irelend = irel + sec->reloc_count;
2903   shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
2904   shndx = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
2905 
2906   for (; irel < irelend; irel++)
2907     {
2908       bfd_vma raddr, paddr, symval;
2909       Elf_Internal_Sym isym;
2910 
2911       /* Get the new reloc address.  */
2912       raddr = irel->r_offset;
2913       if ((raddr >= (addr + count) && raddr < toaddr))
2914 	irel->r_offset -= count;
2915 
2916       if (raddr >= addr && raddr < addr + count)
2917 	{
2918 	  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2919 				       (int) R_V850_NONE);
2920 	  continue;
2921 	}
2922 
2923       if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN)
2924 	continue;
2925 
2926       bfd_elf32_swap_symbol_in (abfd,
2927 				extsyms + ELF32_R_SYM (irel->r_info),
2928 				shndx ? shndx + ELF32_R_SYM (irel->r_info) : NULL,
2929 				& isym);
2930 
2931       if (isym.st_shndx != sec_shndx)
2932 	continue;
2933 
2934       /* Get the value of the symbol referred to by the reloc.  */
2935       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
2936 	{
2937 	  symval = isym.st_value;
2938 #if (DEBUG_RELAX & 2)
2939 	  {
2940 	    char * name = bfd_elf_string_from_elf_section
2941 	                   (abfd, symtab_hdr->sh_link, isym.st_name);
2942 	    fprintf (stderr,
2943 	       "relax_delete: local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
2944 	       sec->name, name, isym.st_name,
2945 	       sec->output_section->vma, sec->output_offset,
2946 	       isym.st_value, irel->r_addend);
2947 	  }
2948 #endif
2949 	}
2950       else
2951 	{
2952 	  unsigned long indx;
2953 	  struct elf_link_hash_entry * h;
2954 
2955 	  /* An external symbol.  */
2956 	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2957 
2958 	  h = elf_sym_hashes (abfd) [indx];
2959 	  BFD_ASSERT (h != NULL);
2960 
2961 	  symval = h->root.u.def.value;
2962 #if (DEBUG_RELAX & 2)
2963 	  fprintf (stderr,
2964 		   "relax_delete: defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
2965 		   sec->name, h->root.root.string, h->root.u.def.value,
2966 		   sec->output_section->vma, sec->output_offset, irel->r_addend);
2967 #endif
2968 	}
2969 
2970       paddr = symval + irel->r_addend;
2971 
2972       if ( (symval >= addr + count && symval < toaddr)
2973 	  && (paddr < addr + count || paddr >= toaddr))
2974 	irel->r_addend += count;
2975       else if (    (symval < addr + count || symval >= toaddr)
2976 	        && (paddr >= addr + count && paddr < toaddr))
2977 	irel->r_addend -= count;
2978     }
2979 
2980   /* Adjust the local symbols defined in this section.  */
2981   esym = extsyms;
2982   esymend = esym + symtab_hdr->sh_info;
2983 
2984   for (; esym < esymend; esym++, shndx = (shndx ? shndx + 1 : NULL))
2985     {
2986       Elf_Internal_Sym isym;
2987 
2988       bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
2989 
2990       if (isym.st_shndx == sec_shndx
2991 	  && isym.st_value >= addr + count
2992 	  && isym.st_value < toaddr)
2993 	{
2994 	  isym.st_value -= count;
2995 
2996 	  if (isym.st_value + isym.st_size >= toaddr)
2997 	    isym.st_size += count;
2998 
2999 	  bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
3000 	}
3001       else if (isym.st_shndx == sec_shndx
3002 	       && isym.st_value < addr + count)
3003 	{
3004 	  if (isym.st_value+isym.st_size >= addr + count
3005 	      && isym.st_value+isym.st_size < toaddr)
3006 	    isym.st_size -= count;
3007 
3008 	  if (isym.st_value >= addr
3009 	      && isym.st_value <  addr + count)
3010 	    isym.st_value = addr;
3011 
3012 	  bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
3013 	}
3014     }
3015 
3016   /* Now adjust the global symbols defined in this section.  */
3017   esym = extsyms + symtab_hdr->sh_info;
3018   esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
3019 
3020   for (sym_index = 0; esym < esymend; esym ++, sym_index ++)
3021     {
3022       Elf_Internal_Sym isym;
3023 
3024       bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
3025       sym_hash = elf_sym_hashes (abfd) [sym_index];
3026 
3027       if (isym.st_shndx == sec_shndx
3028 	  && ((sym_hash)->root.type == bfd_link_hash_defined
3029 	      || (sym_hash)->root.type == bfd_link_hash_defweak)
3030 	  && (sym_hash)->root.u.def.section == sec
3031 	  && (sym_hash)->root.u.def.value >= addr + count
3032 	  && (sym_hash)->root.u.def.value < toaddr)
3033 	{
3034 	  if ((sym_hash)->root.u.def.value + isym.st_size >= toaddr)
3035 	    {
3036 	      isym.st_size += count;
3037 	      bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
3038 	    }
3039 
3040 	  (sym_hash)->root.u.def.value -= count;
3041 	}
3042       else if (isym.st_shndx == sec_shndx
3043 	       && ((sym_hash)->root.type == bfd_link_hash_defined
3044 		   || (sym_hash)->root.type == bfd_link_hash_defweak)
3045 	       && (sym_hash)->root.u.def.section == sec
3046 	       && (sym_hash)->root.u.def.value < addr + count)
3047 	{
3048 	  if ((sym_hash)->root.u.def.value+isym.st_size >= addr + count
3049 	      && (sym_hash)->root.u.def.value+isym.st_size < toaddr)
3050 	    isym.st_size -= count;
3051 
3052 	  if ((sym_hash)->root.u.def.value >= addr
3053 	      && (sym_hash)->root.u.def.value < addr + count)
3054 	    (sym_hash)->root.u.def.value = addr;
3055 
3056 	  bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
3057 	}
3058 
3059       if (shndx)
3060 	++ shndx;
3061     }
3062 
3063   return TRUE;
3064 }
3065 
3066 #define NOP_OPCODE 	(0x0000)
3067 #define MOVHI	    	0x0640				/* 4byte.  */
3068 #define MOVHI_MASK  	0x07e0
3069 #define MOVHI_R1(insn)	((insn) & 0x1f)			/* 4byte.  */
3070 #define MOVHI_R2(insn)	((insn) >> 11)
3071 #define MOVEA	    	0x0620				/* 2byte.  */
3072 #define MOVEA_MASK  	0x07e0
3073 #define MOVEA_R1(insn)	((insn) & 0x1f)
3074 #define MOVEA_R2(insn)	((insn) >> 11)
3075 #define JARL_4	    	0x00040780				/* 4byte.  */
3076 #define JARL_4_MASK 	0xFFFF07FF
3077 #define JARL_R2(insn)	(int)(((insn) & (~JARL_4_MASK)) >> 11)
3078 #define ADD_I       	0x0240					/* 2byte.  */
3079 #define ADD_I_MASK  	0x07e0
3080 #define ADD_I5(insn)	((((insn) & 0x001f) << 11) >> 11)	/* 2byte.  */
3081 #define ADD_R2(insn)	((insn) >> 11)
3082 #define JMP_R	    	0x0060					/* 2byte.  */
3083 #define JMP_R_MASK 	0xFFE0
3084 #define JMP_R1(insn)	((insn) & 0x1f)
3085 
3086 static bfd_boolean
v850_elf_relax_section(bfd * abfd,asection * sec,struct bfd_link_info * link_info,bfd_boolean * again)3087 v850_elf_relax_section (bfd *abfd,
3088 			asection *sec,
3089 			struct bfd_link_info *link_info,
3090 			bfd_boolean *again)
3091 {
3092   Elf_Internal_Shdr *symtab_hdr;
3093   Elf_Internal_Rela *internal_relocs;
3094   Elf_Internal_Rela *irel;
3095   Elf_Internal_Rela *irelend;
3096   Elf_Internal_Rela *irelalign = NULL;
3097   Elf_Internal_Sym *isymbuf = NULL;
3098   bfd_byte *contents = NULL;
3099   bfd_vma addr = 0;
3100   bfd_vma toaddr;
3101   int align_pad_size = 0;
3102   bfd_boolean result = TRUE;
3103 
3104   *again = FALSE;
3105 
3106   if (link_info->relocatable
3107       || (sec->flags & SEC_RELOC) == 0
3108       || sec->reloc_count == 0)
3109     return TRUE;
3110 
3111   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
3112 
3113   internal_relocs = (_bfd_elf_link_read_relocs
3114 		     (abfd, sec, NULL, NULL, link_info->keep_memory));
3115   if (internal_relocs == NULL)
3116     goto error_return;
3117 
3118   irelend = internal_relocs + sec->reloc_count;
3119 
3120   while (addr < sec->size)
3121     {
3122       toaddr = sec->size;
3123 
3124       for (irel = internal_relocs; irel < irelend; irel ++)
3125 	if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
3126 	    && irel->r_offset > addr
3127 	    && irel->r_offset < toaddr)
3128 	  toaddr = irel->r_offset;
3129 
3130 #ifdef DEBUG_RELAX
3131       fprintf (stderr, "relax region 0x%x to 0x%x align pad %d\n",
3132 	       addr, toaddr, align_pad_size);
3133 #endif
3134       if (irelalign)
3135 	{
3136 	  bfd_vma alignto;
3137 	  bfd_vma alignmoveto;
3138 
3139 	  alignmoveto = BFD_ALIGN (addr - align_pad_size, 1 << irelalign->r_addend);
3140 	  alignto = BFD_ALIGN (addr, 1 << irelalign->r_addend);
3141 
3142 	  if (alignmoveto < alignto)
3143 	    {
3144 	      bfd_vma i;
3145 
3146 	      align_pad_size = alignto - alignmoveto;
3147 #ifdef DEBUG_RELAX
3148 	      fprintf (stderr, "relax move region 0x%x to 0x%x delete size 0x%x\n",
3149 		       alignmoveto, toaddr, align_pad_size);
3150 #endif
3151 	      if (!v850_elf_relax_delete_bytes (abfd, sec, alignmoveto,
3152 						toaddr, align_pad_size))
3153 		goto error_return;
3154 
3155 	      for (i  = BFD_ALIGN (toaddr - align_pad_size, 1);
3156 		   (i + 1) < toaddr; i += 2)
3157 		bfd_put_16 (abfd, NOP_OPCODE, contents + i);
3158 
3159 	      addr = alignmoveto;
3160 	    }
3161 	  else
3162 	    align_pad_size = 0;
3163 	}
3164 
3165       for (irel = internal_relocs; irel < irelend; irel++)
3166 	{
3167 	  bfd_vma laddr;
3168 	  bfd_vma addend;
3169 	  bfd_vma symval;
3170 	  int insn[5];
3171 	  int no_match = -1;
3172 	  Elf_Internal_Rela *hi_irelfn;
3173 	  Elf_Internal_Rela *lo_irelfn;
3174 	  Elf_Internal_Rela *irelcall;
3175 	  bfd_signed_vma foff;
3176 	  unsigned int r_type;
3177 
3178 	  if (! (irel->r_offset >= addr && irel->r_offset < toaddr
3179 		 && (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL
3180 		     || ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)))
3181 	    continue;
3182 
3183 #ifdef DEBUG_RELAX
3184 	  fprintf (stderr, "relax check r_info 0x%x r_offset 0x%x r_addend 0x%x\n",
3185 		   irel->r_info,
3186 		   irel->r_offset,
3187 		   irel->r_addend );
3188 #endif
3189 
3190 	  /* Get the section contents.  */
3191 	  if (contents == NULL)
3192 	    {
3193 	      if (elf_section_data (sec)->this_hdr.contents != NULL)
3194 		contents = elf_section_data (sec)->this_hdr.contents;
3195 	      else
3196 		{
3197 		  if (! bfd_malloc_and_get_section (abfd, sec, &contents))
3198 		    goto error_return;
3199 		}
3200 	    }
3201 
3202 	  /* Read this BFD's local symbols if we haven't done so already.  */
3203 	  if (isymbuf == NULL && symtab_hdr->sh_info != 0)
3204 	    {
3205 	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
3206 	      if (isymbuf == NULL)
3207 		isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3208 						symtab_hdr->sh_info, 0,
3209 						NULL, NULL, NULL);
3210 	      if (isymbuf == NULL)
3211 		goto error_return;
3212 	    }
3213 
3214 	  laddr = irel->r_offset;
3215 
3216 	  if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL)
3217 	    {
3218 	      /* Check code for -mlong-calls output. */
3219 	      if (laddr + 16 <= (bfd_vma) sec->size)
3220 		{
3221 		  insn[0] = bfd_get_16 (abfd, contents + laddr);
3222 		  insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
3223 		  insn[2] = bfd_get_32 (abfd, contents + laddr + 8);
3224 		  insn[3] = bfd_get_16 (abfd, contents + laddr + 12);
3225 		  insn[4] = bfd_get_16 (abfd, contents + laddr + 14);
3226 
3227 		  if ((insn[0] & MOVHI_MASK) != MOVHI
3228 		       || MOVHI_R1 (insn[0]) != 0)
3229 		    no_match = 0;
3230 
3231 		  if (no_match < 0
3232 		      && ((insn[1] & MOVEA_MASK) != MOVEA
3233 			   || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
3234 		    no_match = 1;
3235 
3236 		  if (no_match < 0
3237 		      && (insn[2] & JARL_4_MASK) != JARL_4)
3238 		    no_match = 2;
3239 
3240 		  if (no_match < 0
3241 		      && ((insn[3] & ADD_I_MASK) != ADD_I
3242 			   || ADD_I5 (insn[3]) != 4
3243 			   || JARL_R2 (insn[2]) != ADD_R2 (insn[3])))
3244 		    no_match = 3;
3245 
3246 		  if (no_match < 0
3247 		      && ((insn[4] & JMP_R_MASK) != JMP_R
3248 			   || MOVEA_R2 (insn[1]) != JMP_R1 (insn[4])))
3249 		    no_match = 4;
3250 		}
3251 	      else
3252 		{
3253 		  ((*_bfd_error_handler)
3254 		   ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insns",
3255 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset));
3256 
3257 		  continue;
3258 		}
3259 
3260 	      if (no_match >= 0)
3261 		{
3262 		  ((*_bfd_error_handler)
3263 		   ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insn 0x%x",
3264 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
3265 
3266 		  continue;
3267 		}
3268 
3269 	      /* Get the reloc for the address from which the register is
3270 	         being loaded.  This reloc will tell us which function is
3271 	         actually being called.  */
3272 
3273 	      for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
3274 		{
3275 		  r_type = ELF32_R_TYPE (hi_irelfn->r_info);
3276 
3277 		  if (hi_irelfn->r_offset == laddr + 2
3278 		      && (r_type == (int) R_V850_HI16_S || r_type == (int) R_V810_WHI1))
3279 		    break;
3280 		}
3281 
3282 	      for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
3283 		{
3284 		  r_type = ELF32_R_TYPE (lo_irelfn->r_info);
3285 
3286 		  if (lo_irelfn->r_offset == laddr + 6
3287 		      && (r_type == (int) R_V850_LO16 || r_type == (int) R_V810_WLO))
3288 		    break;
3289 		}
3290 
3291 	      for (irelcall = internal_relocs; irelcall < irelend; irelcall ++)
3292 		{
3293 		  r_type = ELF32_R_TYPE (irelcall->r_info);
3294 
3295 		  if (irelcall->r_offset == laddr + 8
3296 		      && (r_type == (int) R_V850_22_PCREL || r_type == (int) R_V850_PCR22))
3297 		    break;
3298 		}
3299 
3300 	      if (   hi_irelfn == irelend
3301 		  || lo_irelfn == irelend
3302 		  || irelcall  == irelend)
3303 		{
3304 		  ((*_bfd_error_handler)
3305 		   ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc",
3306 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
3307 
3308 		  continue;
3309 		}
3310 
3311 	      if (ELF32_R_SYM (irelcall->r_info) < symtab_hdr->sh_info)
3312 		{
3313 		  Elf_Internal_Sym *  isym;
3314 
3315 		  /* A local symbol.  */
3316 		  isym = isymbuf + ELF32_R_SYM (irelcall->r_info);
3317 
3318 		  symval = isym->st_value;
3319 		}
3320 	      else
3321 		{
3322 		  unsigned long indx;
3323 		  struct elf_link_hash_entry * h;
3324 
3325 		  /* An external symbol.  */
3326 		  indx = ELF32_R_SYM (irelcall->r_info) - symtab_hdr->sh_info;
3327 		  h = elf_sym_hashes (abfd)[indx];
3328 		  BFD_ASSERT (h != NULL);
3329 
3330 		  if (   h->root.type != bfd_link_hash_defined
3331 		      && h->root.type != bfd_link_hash_defweak)
3332 		    /* This appears to be a reference to an undefined
3333 		       symbol.  Just ignore it--it will be caught by the
3334 		       regular reloc processing.  */
3335 		    continue;
3336 
3337 		  symval = h->root.u.def.value;
3338 		}
3339 
3340 	      if (symval + irelcall->r_addend != irelcall->r_offset + 4)
3341 		{
3342 		  ((*_bfd_error_handler)
3343 		   ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc 0x%lx",
3344 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset, irelcall->r_offset ));
3345 
3346 		  continue;
3347 		}
3348 
3349 	      /* Get the value of the symbol referred to by the reloc.  */
3350 	      if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
3351 		{
3352 		  Elf_Internal_Sym *isym;
3353 		  asection *sym_sec;
3354 
3355 		  /* A local symbol.  */
3356 		  isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
3357 
3358 		  if (isym->st_shndx == SHN_UNDEF)
3359 		    sym_sec = bfd_und_section_ptr;
3360 		  else if (isym->st_shndx == SHN_ABS)
3361 		    sym_sec = bfd_abs_section_ptr;
3362 		  else if (isym->st_shndx == SHN_COMMON)
3363 		    sym_sec = bfd_com_section_ptr;
3364 		  else
3365 		    sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
3366 		  symval = (isym->st_value
3367 			    + sym_sec->output_section->vma
3368 			    + sym_sec->output_offset);
3369 		}
3370 	      else
3371 		{
3372 		  unsigned long indx;
3373 		  struct elf_link_hash_entry *h;
3374 
3375 		  /* An external symbol.  */
3376 		  indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
3377 		  h = elf_sym_hashes (abfd)[indx];
3378 		  BFD_ASSERT (h != NULL);
3379 
3380 		  if (   h->root.type != bfd_link_hash_defined
3381 		      && h->root.type != bfd_link_hash_defweak)
3382 		    /* This appears to be a reference to an undefined
3383 		       symbol.  Just ignore it--it will be caught by the
3384 		       regular reloc processing.  */
3385 		    continue;
3386 
3387 		  symval = (h->root.u.def.value
3388 			    + h->root.u.def.section->output_section->vma
3389 			    + h->root.u.def.section->output_offset);
3390 		}
3391 
3392 	      addend = irel->r_addend;
3393 
3394 	      foff = (symval + addend
3395 		      - (irel->r_offset
3396 			 + sec->output_section->vma
3397 			 + sec->output_offset
3398 			 + 4));
3399 #ifdef DEBUG_RELAX
3400 	      fprintf (stderr, "relax longcall r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
3401 		       irel->r_offset,
3402 		       (irel->r_offset
3403 			+ sec->output_section->vma
3404 			+ sec->output_offset),
3405 		       symval, addend, foff);
3406 #endif
3407 
3408 	      if (foff < -0x100000 || foff >= 0x100000)
3409 		/* After all that work, we can't shorten this function call.  */
3410 		continue;
3411 
3412 	      /* For simplicity of coding, we are going to modify the section
3413 	         contents, the section relocs, and the BFD symbol table.  We
3414 	         must tell the rest of the code not to free up this
3415 	         information.  It would be possible to instead create a table
3416 	         of changes which have to be made, as is done in coff-mips.c;
3417 	         that would be more work, but would require less memory when
3418 	         the linker is run.  */
3419 	      elf_section_data (sec)->relocs = internal_relocs;
3420 	      elf_section_data (sec)->this_hdr.contents = contents;
3421 	      symtab_hdr->contents = (bfd_byte *) isymbuf;
3422 
3423 	      /* Replace the long call with a jarl.  */
3424 	      if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
3425 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_PCR22);
3426 	      else
3427 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_22_PCREL);
3428 
3429 	      addend = 0;
3430 
3431 	      if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
3432 		/* If this needs to be changed because of future relaxing,
3433 		   it will be handled here like other internal IND12W
3434 		   relocs.  */
3435 		bfd_put_32 (abfd,
3436 			    0x00000780 | (JARL_R2 (insn[2])<<11) | ((addend << 16) & 0xffff) | ((addend >> 16) & 0xf),
3437 			    contents + irel->r_offset);
3438 	      else
3439 		/* We can't fully resolve this yet, because the external
3440 		   symbol value may be changed by future relaxing.
3441 		   We let the final link phase handle it.  */
3442 		bfd_put_32 (abfd, 0x00000780 | (JARL_R2 (insn[2])<<11),
3443 			    contents + irel->r_offset);
3444 
3445 	      hi_irelfn->r_info =
3446 		ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
3447 	      lo_irelfn->r_info =
3448 		ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
3449 	      irelcall->r_info =
3450 		ELF32_R_INFO (ELF32_R_SYM (irelcall->r_info), R_V850_NONE);
3451 
3452 	      if (! v850_elf_relax_delete_bytes (abfd, sec,
3453 						 irel->r_offset + 4, toaddr, 12))
3454 		goto error_return;
3455 
3456 	      align_pad_size += 12;
3457 	    }
3458 	  else if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)
3459 	    {
3460 	      /* Check code for -mlong-jumps output.  */
3461 	      if (laddr + 10 <= (bfd_vma) sec->size)
3462 		{
3463 		  insn[0] = bfd_get_16 (abfd, contents + laddr);
3464 		  insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
3465 		  insn[2] = bfd_get_16 (abfd, contents + laddr + 8);
3466 
3467 		  if ((insn[0] & MOVHI_MASK) != MOVHI
3468 		       || MOVHI_R1 (insn[0]) != 0)
3469 		    no_match = 0;
3470 
3471 		  if (no_match < 0
3472 		      && ((insn[1] & MOVEA_MASK) != MOVEA
3473 			   || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
3474 		    no_match = 1;
3475 
3476 		  if (no_match < 0
3477 		      && ((insn[2] & JMP_R_MASK) != JMP_R
3478 			   || MOVEA_R2 (insn[1]) != JMP_R1 (insn[2])))
3479 		    no_match = 4;
3480 		}
3481 	      else
3482 		{
3483 		  ((*_bfd_error_handler)
3484 		   ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insns",
3485 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset));
3486 
3487 		  continue;
3488 		}
3489 
3490 	      if (no_match >= 0)
3491 		{
3492 		  ((*_bfd_error_handler)
3493 		   ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insn 0x%x",
3494 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
3495 
3496 		  continue;
3497 		}
3498 
3499 	      /* Get the reloc for the address from which the register is
3500 	         being loaded.  This reloc will tell us which function is
3501 	         actually being called.  */
3502 	      for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
3503 		{
3504 		  r_type = ELF32_R_TYPE (hi_irelfn->r_info);
3505 
3506 		  if (hi_irelfn->r_offset == laddr + 2
3507 		      && ((r_type == (int) R_V850_HI16_S) || r_type == (int) R_V810_WHI1))
3508 		    break;
3509 		}
3510 
3511 	      for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
3512 		{
3513 		  r_type = ELF32_R_TYPE (lo_irelfn->r_info);
3514 
3515 		  if (lo_irelfn->r_offset == laddr + 6
3516 		      && (r_type == (int) R_V850_LO16 || r_type == (int) R_V810_WLO))
3517 		    break;
3518 		}
3519 
3520 	      if (   hi_irelfn == irelend
3521 		  || lo_irelfn == irelend)
3522 		{
3523 		  ((*_bfd_error_handler)
3524 		   ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized reloc",
3525 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
3526 
3527 		  continue;
3528 		}
3529 
3530 	      /* Get the value of the symbol referred to by the reloc.  */
3531 	      if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
3532 		{
3533 		  Elf_Internal_Sym *  isym;
3534 		  asection *          sym_sec;
3535 
3536 		  /* A local symbol.  */
3537 		  isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
3538 
3539 		  if (isym->st_shndx == SHN_UNDEF)
3540 		    sym_sec = bfd_und_section_ptr;
3541 		  else if (isym->st_shndx == SHN_ABS)
3542 		    sym_sec = bfd_abs_section_ptr;
3543 		  else if (isym->st_shndx == SHN_COMMON)
3544 		    sym_sec = bfd_com_section_ptr;
3545 		  else
3546 		    sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
3547 		  symval = (isym->st_value
3548 			    + sym_sec->output_section->vma
3549 			    + sym_sec->output_offset);
3550 #ifdef DEBUG_RELAX
3551 		  {
3552 		    char * name = bfd_elf_string_from_elf_section
3553 		      (abfd, symtab_hdr->sh_link, isym->st_name);
3554 
3555 		    fprintf (stderr, "relax long jump local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
3556 			     sym_sec->name, name, isym->st_name,
3557 			     sym_sec->output_section->vma,
3558 			     sym_sec->output_offset,
3559 			     isym->st_value, irel->r_addend);
3560 		  }
3561 #endif
3562 		}
3563 	      else
3564 		{
3565 		  unsigned long indx;
3566 		  struct elf_link_hash_entry * h;
3567 
3568 		  /* An external symbol.  */
3569 		  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
3570 		  h = elf_sym_hashes (abfd)[indx];
3571 		  BFD_ASSERT (h != NULL);
3572 
3573 		  if (   h->root.type != bfd_link_hash_defined
3574 		      && h->root.type != bfd_link_hash_defweak)
3575 		    /* This appears to be a reference to an undefined
3576 		       symbol.  Just ignore it--it will be caught by the
3577 		       regular reloc processing.  */
3578 		    continue;
3579 
3580 		  symval = (h->root.u.def.value
3581 			    + h->root.u.def.section->output_section->vma
3582 			    + h->root.u.def.section->output_offset);
3583 #ifdef DEBUG_RELAX
3584 		  fprintf (stderr,
3585 			   "relax longjump defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
3586 			   sec->name, h->root.root.string, h->root.u.def.value,
3587 			   sec->output_section->vma, sec->output_offset, irel->r_addend);
3588 #endif
3589 		}
3590 
3591 	      addend = irel->r_addend;
3592 
3593 	      foff = (symval + addend
3594 		      - (irel->r_offset
3595 			 + sec->output_section->vma
3596 			 + sec->output_offset
3597 			 + 4));
3598 #ifdef DEBUG_RELAX
3599 	      fprintf (stderr, "relax longjump r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
3600 		       irel->r_offset,
3601 		       (irel->r_offset
3602 			+ sec->output_section->vma
3603 			+ sec->output_offset),
3604 		       symval, addend, foff);
3605 #endif
3606 	      if (foff < -0x100000 || foff >= 0x100000)
3607 		/* After all that work, we can't shorten this function call.  */
3608 		continue;
3609 
3610 	      /* For simplicity of coding, we are going to modify the section
3611 	         contents, the section relocs, and the BFD symbol table.  We
3612 	         must tell the rest of the code not to free up this
3613 	         information.  It would be possible to instead create a table
3614 	         of changes which have to be made, as is done in coff-mips.c;
3615 	         that would be more work, but would require less memory when
3616 	         the linker is run.  */
3617 	      elf_section_data (sec)->relocs = internal_relocs;
3618 	      elf_section_data (sec)->this_hdr.contents = contents;
3619 	      symtab_hdr->contents = (bfd_byte *) isymbuf;
3620 
3621 	      if (foff < -0x100 || foff >= 0x100)
3622 		{
3623 		  /* Replace the long jump with a jr.  */
3624 
3625 		  if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
3626 		    irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_PCR22);
3627 		  else
3628 		    irel->r_info =
3629 		      ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_22_PCREL);
3630 
3631 		  irel->r_addend = addend;
3632 		  addend = 0;
3633 
3634 		  if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
3635 		    /* If this needs to be changed because of future relaxing,
3636 		       it will be handled here like other internal IND12W
3637 		       relocs.  */
3638 		    bfd_put_32 (abfd,
3639 				0x00000780 | ((addend << 15) & 0xffff0000) | ((addend >> 17) & 0xf),
3640 				contents + irel->r_offset);
3641 		  else
3642 		    /* We can't fully resolve this yet, because the external
3643 		       symbol value may be changed by future relaxing.
3644 		       We let the final link phase handle it.  */
3645 		    bfd_put_32 (abfd, 0x00000780, contents + irel->r_offset);
3646 
3647 		  hi_irelfn->r_info =
3648 			ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
3649 		  lo_irelfn->r_info =
3650 			ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
3651 		  if (!v850_elf_relax_delete_bytes (abfd, sec,
3652 						    irel->r_offset + 4, toaddr, 6))
3653 		    goto error_return;
3654 
3655 		  align_pad_size += 6;
3656 		}
3657 	      else
3658 		{
3659 		  /* Replace the long jump with a br.  */
3660 
3661 		  if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
3662 		    irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_PC9);
3663 		  else
3664 		    irel->r_info =
3665 		      ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_9_PCREL);
3666 
3667 		  irel->r_addend = addend;
3668 		  addend = 0;
3669 
3670 		  if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
3671 		    /* If this needs to be changed because of future relaxing,
3672 		       it will be handled here like other internal IND12W
3673 		       relocs.  */
3674 		    bfd_put_16 (abfd,
3675 				0x0585 | ((addend << 10) & 0xf800) | ((addend << 3) & 0x0070),
3676 				contents + irel->r_offset);
3677 		  else
3678 		    /* We can't fully resolve this yet, because the external
3679 		       symbol value may be changed by future relaxing.
3680 		       We let the final link phase handle it.  */
3681 		    bfd_put_16 (abfd, 0x0585, contents + irel->r_offset);
3682 
3683 		  hi_irelfn->r_info =
3684 			ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
3685 		  lo_irelfn->r_info =
3686 			ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
3687 		  if (!v850_elf_relax_delete_bytes (abfd, sec,
3688 						    irel->r_offset + 2, toaddr, 8))
3689 		    goto error_return;
3690 
3691 		  align_pad_size += 8;
3692 		}
3693 	    }
3694 	}
3695 
3696       irelalign = NULL;
3697       for (irel = internal_relocs; irel < irelend; irel++)
3698 	{
3699 	  if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
3700 	      && irel->r_offset == toaddr)
3701 	    {
3702 	      irel->r_offset -= align_pad_size;
3703 
3704 	      if (irelalign == NULL || irelalign->r_addend > irel->r_addend)
3705 		irelalign = irel;
3706 	    }
3707 	}
3708 
3709       addr = toaddr;
3710     }
3711 
3712   if (!irelalign)
3713     {
3714 #ifdef DEBUG_RELAX
3715       fprintf (stderr, "relax pad %d shorten %d -> %d\n",
3716 	       align_pad_size,
3717 	       sec->size,
3718 	       sec->size - align_pad_size);
3719 #endif
3720       sec->size -= align_pad_size;
3721     }
3722 
3723  finish:
3724   if (internal_relocs != NULL
3725       && elf_section_data (sec)->relocs != internal_relocs)
3726     free (internal_relocs);
3727 
3728   if (contents != NULL
3729       && elf_section_data (sec)->this_hdr.contents != (unsigned char *) contents)
3730     free (contents);
3731 
3732   if (isymbuf != NULL
3733       && symtab_hdr->contents != (bfd_byte *) isymbuf)
3734     free (isymbuf);
3735 
3736   return result;
3737 
3738  error_return:
3739   result = FALSE;
3740   goto finish;
3741 }
3742 
3743 static const struct bfd_elf_special_section v850_elf_special_sections[] =
3744 {
3745   { STRING_COMMA_LEN (".call_table_data"), 0, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE) },
3746   { STRING_COMMA_LEN (".call_table_text"), 0, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3747 								 + SHF_EXECINSTR) },
3748   { STRING_COMMA_LEN (".rosdata"),        -2, SHT_PROGBITS,     (SHF_ALLOC
3749 								 + SHF_V850_GPREL) },
3750   { STRING_COMMA_LEN (".rozdata"),        -2, SHT_PROGBITS,     (SHF_ALLOC
3751 								 + SHF_V850_R0REL) },
3752   { STRING_COMMA_LEN (".sbss"),           -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
3753 								 + SHF_V850_GPREL) },
3754   { STRING_COMMA_LEN (".scommon"),        -2, SHT_V850_SCOMMON, (SHF_ALLOC + SHF_WRITE
3755 								 + SHF_V850_GPREL) },
3756   { STRING_COMMA_LEN (".sdata"),          -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3757 								 + SHF_V850_GPREL) },
3758   { STRING_COMMA_LEN (".tbss"),           -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
3759 								 + SHF_V850_EPREL) },
3760   { STRING_COMMA_LEN (".tcommon"),        -2, SHT_V850_TCOMMON, (SHF_ALLOC + SHF_WRITE
3761 								 + SHF_V850_R0REL) },
3762   { STRING_COMMA_LEN (".tdata"),          -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3763 								 + SHF_V850_EPREL) },
3764   { STRING_COMMA_LEN (".zbss"),           -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
3765 								 + SHF_V850_R0REL) },
3766   { STRING_COMMA_LEN (".zcommon"),        -2, SHT_V850_ZCOMMON, (SHF_ALLOC + SHF_WRITE
3767 								 + SHF_V850_R0REL) },
3768   { STRING_COMMA_LEN (".zdata"),          -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
3769 								 + SHF_V850_R0REL) },
3770   { NULL,                     0,           0, 0,                0 }
3771 };
3772 
3773 #define TARGET_LITTLE_SYM			v850_elf32_vec
3774 #define TARGET_LITTLE_NAME			"elf32-v850"
3775 #define ELF_ARCH				bfd_arch_v850
3776 #define ELF_MACHINE_CODE			EM_V850
3777 #define ELF_MACHINE_ALT1			EM_CYGNUS_V850
3778 #define ELF_MAXPAGESIZE				0x1000
3779 
3780 #define elf_info_to_howto			v850_elf_info_to_howto_rela
3781 #define elf_info_to_howto_rel			v850_elf_info_to_howto_rel
3782 
3783 #define elf_backend_check_relocs		v850_elf_check_relocs
3784 #define elf_backend_relocate_section    	v850_elf_relocate_section
3785 #define elf_backend_object_p			v850_elf_object_p
3786 #define elf_backend_final_write_processing 	v850_elf_final_write_processing
3787 #define elf_backend_section_from_bfd_section 	v850_elf_section_from_bfd_section
3788 #define elf_backend_symbol_processing		v850_elf_symbol_processing
3789 #define elf_backend_add_symbol_hook		v850_elf_add_symbol_hook
3790 #define elf_backend_link_output_symbol_hook 	v850_elf_link_output_symbol_hook
3791 #define elf_backend_section_from_shdr		v850_elf_section_from_shdr
3792 #define elf_backend_fake_sections		v850_elf_fake_sections
3793 #define elf_backend_gc_mark_hook                v850_elf_gc_mark_hook
3794 #define elf_backend_special_sections		v850_elf_special_sections
3795 
3796 #define elf_backend_can_gc_sections 1
3797 #define elf_backend_rela_normal 1
3798 
3799 #define bfd_elf32_bfd_is_local_label_name	v850_elf_is_local_label_name
3800 #define bfd_elf32_bfd_is_target_special_symbol	v850_elf_is_target_special_symbol
3801 
3802 #define bfd_elf32_bfd_reloc_type_lookup		v850_elf_reloc_type_lookup
3803 #define bfd_elf32_bfd_reloc_name_lookup	        v850_elf_reloc_name_lookup
3804 #define bfd_elf32_bfd_merge_private_bfd_data 	v850_elf_merge_private_bfd_data
3805 #define bfd_elf32_bfd_set_private_flags		v850_elf_set_private_flags
3806 #define bfd_elf32_bfd_print_private_bfd_data	v850_elf_print_private_bfd_data
3807 #define bfd_elf32_bfd_relax_section		v850_elf_relax_section
3808 
3809 #define elf_symbol_leading_char			'_'
3810 
3811 #undef  elf32_bed
3812 #define elf32_bed elf32_v850_bed
3813 
3814 #include "elf32-target.h"
3815 
3816 /* Map BFD reloc types to V800 ELF reloc types.  */
3817 
3818 static const struct v850_elf_reloc_map v800_elf_reloc_map[] =
3819 {
3820   { BFD_RELOC_NONE,                   R_V810_NONE    },
3821   { BFD_RELOC_8,                      R_V810_BYTE    },
3822   { BFD_RELOC_16,                     R_V810_HWORD   },
3823   { BFD_RELOC_32,                     R_V810_WORD    },
3824   { BFD_RELOC_LO16,                   R_V810_WLO     },
3825   { BFD_RELOC_HI16,                   R_V810_WHI     },
3826   { BFD_RELOC_HI16_S,                 R_V810_WHI1    },
3827   { BFD_RELOC_V850_32_PCREL,          R_V850_PC32    },
3828   { BFD_RELOC_V850_22_PCREL,          R_V850_PCR22   },
3829   { BFD_RELOC_V850_17_PCREL,          R_V850_PC17    },
3830   { BFD_RELOC_V850_16_PCREL,          R_V850_PC16U   },
3831   { BFD_RELOC_V850_9_PCREL,	      R_V850_PC9     },
3832   { BFD_RELOC_V850_LO16_S1,           R_V810_WLO_1   }, /* Or R_V850_HWLO or R_V850_HWLO_1.  */
3833   { BFD_RELOC_V850_23,                R_V850_WLO23   },
3834   { BFD_RELOC_V850_LO16_SPLIT_OFFSET, R_V850_BLO     },
3835   { BFD_RELOC_V850_ZDA_16_16_OFFSET,  R_V810_HWORD   },
3836   { BFD_RELOC_V850_TDA_16_16_OFFSET,  R_V810_HWORD   },
3837   { BFD_RELOC_V850_SDA_16_16_OFFSET,  R_V810_HWORD   },
3838   { BFD_RELOC_V850_SDA_15_16_OFFSET,  R_V810_GPWLO_1 }
3839 };
3840 
3841 /* Map a bfd relocation into the appropriate howto structure.  */
3842 
3843 static reloc_howto_type *
v800_elf_reloc_type_lookup(bfd * abfd,bfd_reloc_code_real_type code)3844 v800_elf_reloc_type_lookup (bfd * abfd, bfd_reloc_code_real_type code)
3845 {
3846   unsigned int i;
3847 
3848   BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_v850_rh850);
3849 
3850   for (i = ARRAY_SIZE (v800_elf_reloc_map); i --;)
3851     if (v800_elf_reloc_map[i].bfd_reloc_val == code)
3852       {
3853 	unsigned int elf_reloc_val = v800_elf_reloc_map[i].elf_reloc_val;
3854 	unsigned int idx = elf_reloc_val - R_V810_NONE;
3855 
3856 	BFD_ASSERT (v800_elf_howto_table[idx].type == elf_reloc_val);
3857 
3858 	return v800_elf_howto_table + idx;
3859       }
3860 
3861 #ifdef DEBUG
3862   fprintf (stderr, "failed to find v800 equiv of bfd reloc code %d\n", code);
3863 #endif
3864   return NULL;
3865 }
3866 
3867 static reloc_howto_type *
v800_elf_reloc_name_lookup(bfd * abfd,const char * r_name)3868 v800_elf_reloc_name_lookup (bfd * abfd, const char * r_name)
3869 {
3870   unsigned int i;
3871 
3872   BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_v850_rh850);
3873 
3874   for (i = ARRAY_SIZE (v800_elf_howto_table); i--;)
3875     if (v800_elf_howto_table[i].name != NULL
3876 	&& strcasecmp (v800_elf_howto_table[i].name, r_name) == 0)
3877       return v800_elf_howto_table + i;
3878 
3879   return NULL;
3880 }
3881 
3882 
3883 /* Set the howto pointer in CACHE_PTR for a V800 ELF reloc.  */
3884 
3885 static void
v800_elf_info_to_howto(bfd * abfd,arelent * cache_ptr,Elf_Internal_Rela * dst)3886 v800_elf_info_to_howto (bfd *               abfd,
3887 			arelent *           cache_ptr,
3888 			Elf_Internal_Rela * dst)
3889 {
3890   unsigned int r_type = ELF32_R_TYPE (dst->r_info);
3891 
3892   BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_v850_rh850);
3893 
3894   BFD_ASSERT (r_type < (unsigned int) R_V800_max);
3895 
3896   if (r_type == R_V800_NONE)
3897     r_type = R_V810_NONE;
3898 
3899   BFD_ASSERT (r_type >= (unsigned int) R_V810_NONE);
3900   r_type -= R_V810_NONE;
3901   BFD_ASSERT (r_type < ARRAY_SIZE (v800_elf_howto_table));
3902 
3903   cache_ptr->howto = v800_elf_howto_table + r_type;
3904 }
3905 
3906 
3907 #undef  TARGET_LITTLE_SYM
3908 #define TARGET_LITTLE_SYM			v800_elf32_vec
3909 #undef  TARGET_LITTLE_NAME
3910 #define TARGET_LITTLE_NAME			"elf32-v850-rh850"
3911 #undef  ELF_ARCH
3912 #define ELF_ARCH				bfd_arch_v850_rh850
3913 #undef  ELF_MACHINE_CODE
3914 #define ELF_MACHINE_CODE			EM_V800
3915 #undef  ELF_MACHINE_ALT1
3916 
3917 #undef  elf32_bed
3918 #define elf32_bed elf32_v850_rh850_bed
3919 
3920 #undef  elf_info_to_howto
3921 #define elf_info_to_howto			v800_elf_info_to_howto
3922 #undef  elf_info_to_howto_rel
3923 #define elf_info_to_howto_rel			NULL
3924 #undef  bfd_elf32_bfd_reloc_type_lookup
3925 #define bfd_elf32_bfd_reloc_type_lookup		v800_elf_reloc_type_lookup
3926 #undef  bfd_elf32_bfd_reloc_name_lookup
3927 #define bfd_elf32_bfd_reloc_name_lookup		v800_elf_reloc_name_lookup
3928 
3929 #include "elf32-target.h"
3930