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