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