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