Home | History | Annotate | Line # | Download | only in bfd
elf32-v850.c revision 1.1.1.4
      1 /* V850-specific support for 32-bit ELF
      2    Copyright (C) 1996-2015 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 	      if (! ((*info->callbacks->reloc_overflow)
   2281 		     (info, (h ? &h->root : NULL), name, howto->name,
   2282 		      (bfd_vma) 0, input_bfd, input_section,
   2283 		      rel->r_offset)))
   2284 		return FALSE;
   2285 	      break;
   2286 
   2287 	    case bfd_reloc_undefined:
   2288 	      if (! ((*info->callbacks->undefined_symbol)
   2289 		     (info, name, input_bfd, input_section,
   2290 		      rel->r_offset, TRUE)))
   2291 		return FALSE;
   2292 	      break;
   2293 
   2294 	    case bfd_reloc_outofrange:
   2295 	      msg = _("internal error: out of range error");
   2296 	      goto common_error;
   2297 
   2298 	    case bfd_reloc_notsupported:
   2299 	      msg = _("internal error: unsupported relocation error");
   2300 	      goto common_error;
   2301 
   2302 	    case bfd_reloc_dangerous:
   2303 	      msg = _("internal error: dangerous relocation");
   2304 	      goto common_error;
   2305 
   2306 	    case bfd_reloc_gp_not_found:
   2307 	      msg = _("could not locate special linker symbol __gp");
   2308 	      goto common_error;
   2309 
   2310 	    case bfd_reloc_ep_not_found:
   2311 	      msg = _("could not locate special linker symbol __ep");
   2312 	      goto common_error;
   2313 
   2314 	    case bfd_reloc_ctbp_not_found:
   2315 	      msg = _("could not locate special linker symbol __ctbp");
   2316 	      goto common_error;
   2317 
   2318 	    default:
   2319 	      msg = _("internal error: unknown error");
   2320 	      /* fall through */
   2321 
   2322 	    common_error:
   2323 	      if (!((*info->callbacks->warning)
   2324 		    (info, msg, name, input_bfd, input_section,
   2325 		     rel->r_offset)))
   2326 		return FALSE;
   2327 	      break;
   2328 	    }
   2329 	}
   2330     }
   2331 
   2332   return TRUE;
   2333 }
   2334 
   2335 static asection *
   2336 v850_elf_gc_mark_hook (asection *sec,
   2337 		       struct bfd_link_info *info,
   2338 		       Elf_Internal_Rela *rel,
   2339 		       struct elf_link_hash_entry *h,
   2340 		       Elf_Internal_Sym *sym)
   2341 {
   2342   if (h != NULL)
   2343     switch (ELF32_R_TYPE (rel->r_info))
   2344       {
   2345       case R_V850_GNU_VTINHERIT:
   2346       case R_V850_GNU_VTENTRY:
   2347 	return NULL;
   2348       }
   2349 
   2350   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
   2351 }
   2352 
   2353 static void
   2354 v850_set_note (bfd * abfd, asection * s, enum v850_notes note, unsigned int val)
   2355 {
   2356   bfd_byte * data = s->contents + ((note - 1) * SIZEOF_V850_NOTE);
   2357 
   2358   bfd_put_32 (abfd, 4, data + 0);
   2359   bfd_put_32 (abfd, 4, data + 4);
   2360   bfd_put_32 (abfd, note, data + 8);
   2361   memcpy (data + 12, V850_NOTE_NAME, 4);
   2362   bfd_put_32 (abfd, val, data + 16);
   2363 }
   2364 
   2365 /* Create the note section if not already present.  This is done early so
   2366    that the linker maps the sections to the right place in the output.  */
   2367 
   2368 static asection *
   2369 v850_elf_make_note_section (bfd * abfd)
   2370 {
   2371   asection *s;
   2372   bfd_byte *data;
   2373   flagword flags;
   2374   enum v850_notes id;
   2375 
   2376   /* Make the note section.  */
   2377   flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_MERGE;
   2378 
   2379   s = bfd_make_section_anyway_with_flags (abfd, V850_NOTE_SECNAME, flags);
   2380   if (s == NULL)
   2381     return NULL;
   2382 
   2383   if (!bfd_set_section_alignment (abfd, s, 2))
   2384     return NULL;
   2385 
   2386   /* Allocate space for all known notes.  */
   2387   if (!bfd_set_section_size (abfd, s, NUM_V850_NOTES * SIZEOF_V850_NOTE))
   2388     return NULL;
   2389 
   2390   data = bfd_zalloc (abfd, NUM_V850_NOTES * SIZEOF_V850_NOTE);
   2391   if (data == NULL)
   2392     return NULL;
   2393 
   2394   s->contents = data;
   2395 
   2396   /* Provide default (= uninitilaised) values for all of the notes.  */
   2397   for (id = V850_NOTE_ALIGNMENT; id <= NUM_V850_NOTES; id++)
   2398     v850_set_note (abfd, s, id,  0);
   2399 
   2400   return s;
   2401 }
   2402 
   2403 /* Create the note section if not already present.  This is done early so
   2404    that the linker maps the sections to the right place in the output.  */
   2405 
   2406 bfd_boolean
   2407 v850_elf_create_sections (struct bfd_link_info * info)
   2408 {
   2409   bfd * ibfd;
   2410 
   2411   /* If we already have a note section, do not make another.  */
   2412   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
   2413     if (bfd_get_section_by_name (ibfd, V850_NOTE_SECNAME) != NULL)
   2414       return TRUE;
   2415 
   2416   return v850_elf_make_note_section (info->input_bfds) != NULL;
   2417 }
   2418 
   2419 bfd_boolean
   2420 v850_elf_set_note (bfd * abfd, enum v850_notes note, unsigned int val)
   2421 {
   2422   asection * notes = bfd_get_section_by_name (abfd, V850_NOTE_SECNAME);
   2423 
   2424   if (val > 2)
   2425     /* At the moment, no known note has a value over 2.  */
   2426     return FALSE;
   2427 
   2428   if (notes == NULL)
   2429     notes = v850_elf_make_note_section (abfd);
   2430   if (notes == NULL)
   2431     return FALSE;
   2432 
   2433   v850_set_note (abfd, notes, note, val);
   2434   return TRUE;
   2435 }
   2436 
   2437 /* Copy backend specific data from one object module to another.  */
   2438 
   2439 static bfd_boolean
   2440 v850_elf_copy_private_bfd_data (bfd * ibfd, bfd * obfd)
   2441 {
   2442   asection * onotes;
   2443   asection * inotes;
   2444 
   2445   /* If the output bfd does not have a note section, then
   2446      skip the merge.  The normal input to output section
   2447      copying will take care of everythng for us.  */
   2448   if ((onotes = bfd_get_section_by_name (obfd, V850_NOTE_SECNAME)) == NULL)
   2449     return TRUE;
   2450 
   2451   if ((inotes = bfd_get_section_by_name (ibfd, V850_NOTE_SECNAME)) == NULL)
   2452     return TRUE;
   2453 
   2454   if (bfd_section_size (ibfd, inotes) == bfd_section_size (obfd, onotes))
   2455     {
   2456       bfd_byte * icont;
   2457       bfd_byte * ocont;
   2458 
   2459       if ((icont = elf_section_data (inotes)->this_hdr.contents) == NULL)
   2460 	BFD_ASSERT (bfd_malloc_and_get_section (ibfd, inotes, & icont));
   2461 
   2462       if ((ocont = elf_section_data (onotes)->this_hdr.contents) == NULL)
   2463 	BFD_ASSERT (bfd_malloc_and_get_section (obfd, onotes, & ocont));
   2464 
   2465       /* Copy/overwrite notes from the input to the output.  */
   2466       memcpy (ocont, icont, bfd_section_size (obfd, onotes));
   2467     }
   2468 
   2469   return TRUE;
   2470 }
   2471 #define bfd_elf32_bfd_copy_private_bfd_data	v850_elf_copy_private_bfd_data
   2472 
   2473 static bfd_boolean
   2474 v850_elf_merge_notes (bfd * ibfd, bfd *obfd)
   2475 {
   2476   asection * onotes;
   2477   asection * inotes;
   2478   bfd_boolean result = TRUE;
   2479 
   2480   /* If the output bfd does not have a note section, then
   2481      skip the merge.  The normal input to output section
   2482      copying will take care of everythng for us.  */
   2483   if ((onotes = bfd_get_section_by_name (obfd, V850_NOTE_SECNAME)) == NULL)
   2484     return TRUE;
   2485 
   2486   if ((inotes = bfd_get_section_by_name (ibfd, V850_NOTE_SECNAME)) != NULL)
   2487     {
   2488       enum v850_notes id;
   2489       bfd_byte * icont;
   2490       bfd_byte * ocont;
   2491 
   2492       BFD_ASSERT (bfd_section_size (ibfd, inotes) == bfd_section_size (obfd, onotes));
   2493 
   2494       if ((icont = elf_section_data (inotes)->this_hdr.contents) == NULL)
   2495 	BFD_ASSERT (bfd_malloc_and_get_section (ibfd, inotes, & icont));
   2496 
   2497       if ((ocont = elf_section_data (onotes)->this_hdr.contents) == NULL)
   2498 	BFD_ASSERT (bfd_malloc_and_get_section (obfd, onotes, & ocont));
   2499 
   2500       for (id = V850_NOTE_ALIGNMENT; id <= NUM_V850_NOTES; id++)
   2501 	{
   2502 	  unsigned int ival;
   2503 	  unsigned int oval;
   2504 	  bfd_byte * idata = icont + ((id - 1) * SIZEOF_V850_NOTE) + 16;
   2505 	  bfd_byte * odata = ocont + ((id - 1) * SIZEOF_V850_NOTE) + 16;
   2506 
   2507 	  ival = bfd_get_32 (ibfd, idata);
   2508 	  oval = bfd_get_32 (obfd, odata);
   2509 
   2510 	  if (ival == 0 || ival == oval)
   2511 	    continue;
   2512 
   2513 	  if (oval == 0)
   2514 	    {
   2515 	      bfd_put_32 (obfd, ival, odata);
   2516 	      v850_set_note (obfd, onotes, id, ival);
   2517 	      continue;
   2518 	    }
   2519 
   2520 	  /* We have a mismatch.  The ABI defines how to handle
   2521 	     this siutation on a per note type basis.  */
   2522 	  switch (id)
   2523 	    {
   2524 	    case V850_NOTE_ALIGNMENT:
   2525 	      if (oval == EF_RH850_DATA_ALIGN4)
   2526 		{
   2527 		  _bfd_error_handler
   2528 		    (_("error: %B needs 8-byte aligment but %B is set for 4-byte alignment"),
   2529 				      ibfd, obfd);
   2530 		  result = FALSE;
   2531 		}
   2532 	      else
   2533 		/* ibfd uses 4-byte alignment, obfd uses 8-byte alignment.
   2534 		   Leave the obfd alignment as it is.  */
   2535 		BFD_ASSERT (oval == EF_RH850_DATA_ALIGN8);
   2536 
   2537 	      break;
   2538 
   2539 	    case V850_NOTE_DATA_SIZE:
   2540 	      if (oval == EF_RH850_DOUBLE32)
   2541 		{
   2542 		  _bfd_error_handler (_("error: %B uses 64-bit doubles but %B uses 32-bit doubles"),
   2543 				      ibfd, obfd);
   2544 		  result = FALSE;
   2545 		}
   2546 	      else
   2547 		/* ibfd uses 32-bit doubles, obfd uses 64-bit doubles.
   2548 		   This is acceptable.  Honest, that is what the ABI says.  */
   2549 		BFD_ASSERT (oval == EF_RH850_DOUBLE64);
   2550 	      break;
   2551 
   2552 	    case V850_NOTE_FPU_INFO:
   2553 	      if (oval == EF_RH850_FPU20)
   2554 		{
   2555 		  _bfd_error_handler (_("error: %B uses FPU-3.0 but %B only supports FPU-2.0"),
   2556 				     ibfd, obfd);
   2557 		  result = FALSE;
   2558 		}
   2559 	      else
   2560 		/* ibfd uses FPU-2.0, obfd uses FPU-3.0.  Leave obfd as it is.  */
   2561 		BFD_ASSERT (oval == EF_RH850_FPU30);
   2562 
   2563 	      break;
   2564 
   2565 	    default:
   2566 	      /* None of the other conflicts matter.
   2567 		 Stick with the current output values.  */
   2568 	      break;
   2569 	    }
   2570 	}
   2571 
   2572       /* FIXME:  We should also check for conflicts between the notes
   2573 	 and the EF flags in the ELF header.  */
   2574     }
   2575 
   2576   return result;
   2577 }
   2578 
   2579 static void
   2580 print_v850_note (bfd * abfd, FILE * file, bfd_byte * data, enum v850_notes id)
   2581 {
   2582   unsigned int value = bfd_get_32 (abfd, data + ((id - 1) * SIZEOF_V850_NOTE) + 16);
   2583 
   2584   switch (id)
   2585     {
   2586     case V850_NOTE_ALIGNMENT:
   2587       fprintf (file, _(" alignment of 8-byte entities: "));
   2588       switch (value)
   2589 	{
   2590 	case EF_RH850_DATA_ALIGN4: fprintf (file, _("4-byte")); break;
   2591 	case EF_RH850_DATA_ALIGN8: fprintf (file, _("8-byte")); break;
   2592 	case 0:  fprintf (file, _("not set")); break;
   2593 	default: fprintf (file, _("unknown: %x"), value); break;
   2594 	}
   2595       fputc ('\n', file);
   2596       break;
   2597 
   2598     case V850_NOTE_DATA_SIZE:
   2599       fprintf (file, _(" size of doubles: "));
   2600       switch (value)
   2601 	{
   2602 	case EF_RH850_DOUBLE32: fprintf (file, _("4-bytes")); break;
   2603 	case EF_RH850_DOUBLE64: fprintf (file, _("8-bytes")); break;
   2604 	case 0:  fprintf (file, _("not set")); break;
   2605 	default: fprintf (file, _("unknown: %x"), value); break;
   2606 	}
   2607       fputc ('\n', file);
   2608       break;
   2609 
   2610     case V850_NOTE_FPU_INFO:
   2611       fprintf (file, _(" FPU support required: "));
   2612       switch (value)
   2613 	{
   2614 	case EF_RH850_FPU20: fprintf (file, _("FPU-2.0")); break;
   2615 	case EF_RH850_FPU30: fprintf (file, _("FPU-3.0")); break;
   2616 	case 0:  fprintf (file, _("none")); break;
   2617 	default: fprintf (file, _("unknown: %x"), value); break;
   2618 	}
   2619       fputc ('\n', file);
   2620       break;
   2621 
   2622     case V850_NOTE_SIMD_INFO:
   2623       fprintf (file, _("SIMD use: "));
   2624       switch (value)
   2625 	{
   2626 	case EF_RH850_SIMD: fprintf (file, _("yes")); break;
   2627 	case 0:  fprintf (file, _("no")); break;
   2628 	default: fprintf (file, _("unknown: %x"), value); break;
   2629 	}
   2630       fputc ('\n', file);
   2631       break;
   2632 
   2633     case V850_NOTE_CACHE_INFO:
   2634       fprintf (file, _("CACHE use: "));
   2635       switch (value)
   2636 	{
   2637 	case EF_RH850_CACHE: fprintf (file, _("yes")); break;
   2638 	case 0:  fprintf (file, _("no")); break;
   2639 	default: fprintf (file, _("unknown: %x"), value); break;
   2640 	}
   2641       fputc ('\n', file);
   2642       break;
   2643 
   2644     case V850_NOTE_MMU_INFO:
   2645       fprintf (file, _("MMU use: "));
   2646       switch (value)
   2647 	{
   2648 	case EF_RH850_MMU: fprintf (file, _("yes")); break;
   2649 	case 0:  fprintf (file, _("no")); break;
   2650 	default: fprintf (file, _("unknown: %x"), value); break;
   2651 	}
   2652       fputc ('\n', file);
   2653       break;
   2654 
   2655     default:
   2656       BFD_ASSERT (0);
   2657     }
   2658 }
   2659 
   2660 static void
   2661 v850_elf_print_notes (bfd * abfd, FILE * file)
   2662 {
   2663   asection * notes = bfd_get_section_by_name (abfd, V850_NOTE_SECNAME);
   2664   enum v850_notes id;
   2665 
   2666   if (notes == NULL || notes->contents == NULL)
   2667     return;
   2668 
   2669   BFD_ASSERT (bfd_section_size (abfd, notes) == NUM_V850_NOTES * SIZEOF_V850_NOTE);
   2670 
   2671   for (id = V850_NOTE_ALIGNMENT; id <= NUM_V850_NOTES; id++)
   2672     print_v850_note (abfd, file, notes->contents, id);
   2673 }
   2674 
   2675 /* Set the right machine number and architecture.  */
   2676 
   2677 static bfd_boolean
   2678 v850_elf_object_p (bfd *abfd)
   2679 {
   2680   enum bfd_architecture arch;
   2681   unsigned long mach;
   2682 
   2683   switch (elf_elfheader (abfd)->e_machine)
   2684     {
   2685     case EM_V800:
   2686       arch = bfd_arch_v850_rh850;
   2687       mach = (elf_elfheader (abfd)->e_flags & EF_V800_850E3)
   2688 	? bfd_mach_v850e3v5 : bfd_mach_v850e2v3;
   2689       break;
   2690 
   2691     case EM_CYGNUS_V850:
   2692     case EM_V850:
   2693       arch = bfd_arch_v850;
   2694       switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
   2695 	{
   2696 	default:
   2697 	case E_V850_ARCH:     mach = bfd_mach_v850; break;
   2698 	case E_V850E_ARCH:    mach = bfd_mach_v850e; break;
   2699 	case E_V850E1_ARCH:   mach = bfd_mach_v850e1; break;
   2700 	case E_V850E2_ARCH:   mach = bfd_mach_v850e2; break;
   2701 	case E_V850E2V3_ARCH: mach = bfd_mach_v850e2v3; break;
   2702 	case E_V850E3V5_ARCH: mach = bfd_mach_v850e3v5; break;
   2703 	}
   2704       break;
   2705 
   2706     default:
   2707       return FALSE;
   2708     }
   2709 
   2710   return bfd_default_set_arch_mach (abfd, arch, mach);
   2711 }
   2712 
   2713 /* Store the machine number in the flags field.  */
   2714 
   2715 static void
   2716 v850_elf_final_write_processing (bfd *abfd,
   2717 				 bfd_boolean linker ATTRIBUTE_UNUSED)
   2718 {
   2719   unsigned long val;
   2720 
   2721   switch (bfd_get_arch (abfd))
   2722     {
   2723     case bfd_arch_v850_rh850:
   2724       val = EF_RH850_ABI;
   2725       if (bfd_get_mach (abfd) == bfd_mach_v850e3v5)
   2726 	val |= EF_V800_850E3;
   2727       elf_elfheader (abfd)->e_flags |= val;
   2728       break;
   2729 
   2730     case bfd_arch_v850:
   2731       switch (bfd_get_mach (abfd))
   2732 	{
   2733 	default:
   2734 	case bfd_mach_v850:     val = E_V850_ARCH; break;
   2735 	case bfd_mach_v850e:    val = E_V850E_ARCH; break;
   2736 	case bfd_mach_v850e1:   val = E_V850E1_ARCH; break;
   2737 	case bfd_mach_v850e2:   val = E_V850E2_ARCH; break;
   2738 	case bfd_mach_v850e2v3: val = E_V850E2V3_ARCH; break;
   2739 	case bfd_mach_v850e3v5: val = E_V850E3V5_ARCH; break;
   2740 	}
   2741       elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
   2742       elf_elfheader (abfd)->e_flags |= val;
   2743       break;
   2744     default:
   2745       break;
   2746     }
   2747 }
   2748 
   2749 /* Function to keep V850 specific file flags.  */
   2750 
   2751 static bfd_boolean
   2752 v850_elf_set_private_flags (bfd *abfd, flagword flags)
   2753 {
   2754   BFD_ASSERT (!elf_flags_init (abfd)
   2755 	      || elf_elfheader (abfd)->e_flags == flags);
   2756 
   2757   elf_elfheader (abfd)->e_flags = flags;
   2758   elf_flags_init (abfd) = TRUE;
   2759   return TRUE;
   2760 }
   2761 
   2762 /* Merge backend specific data from an object file
   2763    to the output object file when linking.  */
   2764 
   2765 static bfd_boolean
   2766 v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   2767 {
   2768   flagword out_flags;
   2769   flagword in_flags;
   2770   bfd_boolean result = TRUE;
   2771 
   2772   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
   2773       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
   2774     return TRUE;
   2775 
   2776   result &= v850_elf_merge_notes (ibfd, obfd);
   2777 
   2778   in_flags = elf_elfheader (ibfd)->e_flags;
   2779   out_flags = elf_elfheader (obfd)->e_flags;
   2780 
   2781   if (! elf_flags_init (obfd))
   2782     {
   2783       /* If the input is the default architecture then do not
   2784 	 bother setting the flags for the output architecture,
   2785 	 instead allow future merges to do this.  If no future
   2786 	 merges ever set these flags then they will retain their
   2787 	 unitialised values, which surprise surprise, correspond
   2788 	 to the default values.  */
   2789       if (bfd_get_arch_info (ibfd)->the_default)
   2790 	return TRUE;
   2791 
   2792       elf_flags_init (obfd) = TRUE;
   2793       elf_elfheader (obfd)->e_flags = in_flags;
   2794 
   2795       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
   2796 	  && bfd_get_arch_info (obfd)->the_default)
   2797 	result &= bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
   2798 
   2799       return result;
   2800     }
   2801 
   2802   /* Check flag compatibility.  */
   2803   if (in_flags == out_flags)
   2804     return result;
   2805 
   2806   if (bfd_get_arch (obfd) == bfd_arch_v850_rh850)
   2807     {
   2808       if ((in_flags & EF_V800_850E3) != (out_flags & EF_V800_850E3))
   2809 	{
   2810 	  _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
   2811 			      ibfd);
   2812 	  elf_elfheader (obfd)->e_flags |= EF_V800_850E3;
   2813 	}
   2814 
   2815       return result;
   2816     }
   2817 
   2818   if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
   2819       && (in_flags & EF_V850_ARCH) != E_V850_ARCH)
   2820     {
   2821       /* Allow earlier architecture binaries to be linked with later binaries.
   2822          Set the output binary to the later architecture, except for v850e1,
   2823          which we set to v850e.  */
   2824       if (   (in_flags  & EF_V850_ARCH) == E_V850E1_ARCH
   2825           && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
   2826         return result;
   2827 
   2828       if (   (in_flags  & EF_V850_ARCH) == E_V850_ARCH
   2829 	  && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
   2830 	{
   2831 	  elf_elfheader (obfd)->e_flags =
   2832 	    ((out_flags & ~ EF_V850_ARCH) | E_V850E_ARCH);
   2833 	  return result;
   2834 	}
   2835 
   2836       if ((   (in_flags & EF_V850_ARCH) == E_V850_ARCH
   2837 	   || (in_flags & EF_V850_ARCH) == E_V850E_ARCH)
   2838 	  && (out_flags & EF_V850_ARCH) == E_V850E2_ARCH)
   2839 	{
   2840 	  elf_elfheader (obfd)->e_flags =
   2841 	    ((out_flags & ~ EF_V850_ARCH) | E_V850E2_ARCH);
   2842 	  return result;
   2843 	}
   2844 
   2845       if ((   (in_flags & EF_V850_ARCH) == E_V850_ARCH
   2846 	   || (in_flags & EF_V850_ARCH) == E_V850E_ARCH
   2847 	   || (in_flags & EF_V850_ARCH) == E_V850E2_ARCH)
   2848 	  && (out_flags & EF_V850_ARCH) == E_V850E2V3_ARCH)
   2849 	{
   2850 	  elf_elfheader (obfd)->e_flags =
   2851 	    ((out_flags & ~ EF_V850_ARCH) | E_V850E2V3_ARCH);
   2852 	  return result;
   2853 	}
   2854 
   2855       if ((   (in_flags & EF_V850_ARCH) == E_V850_ARCH
   2856 	   || (in_flags & EF_V850_ARCH) == E_V850E_ARCH
   2857 	   || (in_flags & EF_V850_ARCH) == E_V850E2_ARCH
   2858            || (in_flags & EF_V850_ARCH) == E_V850E2V3_ARCH)
   2859 	  && (out_flags & EF_V850_ARCH) == E_V850E3V5_ARCH)
   2860 	{
   2861 	  elf_elfheader (obfd)->e_flags =
   2862 	    ((out_flags & ~ EF_V850_ARCH) | E_V850E3V5_ARCH);
   2863 	  return result;
   2864 	}
   2865 
   2866       _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
   2867 			  ibfd);
   2868     }
   2869 
   2870   return result;
   2871 }
   2872 
   2873 /* Display the flags field.  */
   2874 
   2875 static bfd_boolean
   2876 v850_elf_print_private_bfd_data (bfd *abfd, void * ptr)
   2877 {
   2878   FILE * file = (FILE *) ptr;
   2879 
   2880   BFD_ASSERT (abfd != NULL && ptr != NULL);
   2881 
   2882   _bfd_elf_print_private_bfd_data (abfd, ptr);
   2883 
   2884   /* xgettext:c-format.  */
   2885   fprintf (file, _("private flags = %lx: "), elf_elfheader (abfd)->e_flags);
   2886 
   2887   if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
   2888     {
   2889       if ((elf_elfheader (abfd)->e_flags & EF_RH850_ABI) != EF_RH850_ABI)
   2890 	fprintf (file, _("unknown v850 architecture"));
   2891       else if (elf_elfheader (abfd)->e_flags & EF_V800_850E3)
   2892 	fprintf (file, _("v850 E3 architecture"));
   2893       else
   2894 	fprintf (file, _("v850 architecture"));
   2895     }
   2896   else
   2897     {
   2898       switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
   2899 	{
   2900 	default:
   2901 	case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
   2902 	case E_V850E_ARCH: fprintf (file, _("v850e architecture")); break;
   2903 	case E_V850E1_ARCH: fprintf (file, _("v850e1 architecture")); break;
   2904 	case E_V850E2_ARCH: fprintf (file, _("v850e2 architecture")); break;
   2905 	case E_V850E2V3_ARCH: fprintf (file, _("v850e2v3 architecture")); break;
   2906 	case E_V850E3V5_ARCH: fprintf (file, _("v850e3v5 architecture")); break;
   2907 	}
   2908     }
   2909 
   2910   fputc ('\n', file);
   2911 
   2912   v850_elf_print_notes (abfd, file);
   2913 
   2914   return TRUE;
   2915 }
   2916 
   2917 /* V850 ELF uses four common sections.  One is the usual one, and the
   2918    others are for (small) objects in one of the special data areas:
   2919    small, tiny and zero.  All the objects are kept together, and then
   2920    referenced via the gp register, the ep register or the r0 register
   2921    respectively, which yields smaller, faster assembler code.  This
   2922    approach is copied from elf32-mips.c.  */
   2923 
   2924 static asection  v850_elf_scom_section;
   2925 static asymbol   v850_elf_scom_symbol;
   2926 static asymbol * v850_elf_scom_symbol_ptr;
   2927 static asection  v850_elf_tcom_section;
   2928 static asymbol   v850_elf_tcom_symbol;
   2929 static asymbol * v850_elf_tcom_symbol_ptr;
   2930 static asection  v850_elf_zcom_section;
   2931 static asymbol   v850_elf_zcom_symbol;
   2932 static asymbol * v850_elf_zcom_symbol_ptr;
   2933 
   2934 /* Given a BFD section, try to locate the
   2935    corresponding ELF section index.  */
   2936 
   2937 static bfd_boolean
   2938 v850_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
   2939 				   asection *sec,
   2940 				   int *retval)
   2941 {
   2942   if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
   2943     *retval = SHN_V850_SCOMMON;
   2944   else if (strcmp (bfd_get_section_name (abfd, sec), ".tcommon") == 0)
   2945     *retval = SHN_V850_TCOMMON;
   2946   else if (strcmp (bfd_get_section_name (abfd, sec), ".zcommon") == 0)
   2947     *retval = SHN_V850_ZCOMMON;
   2948   else
   2949     return FALSE;
   2950 
   2951   return TRUE;
   2952 }
   2953 
   2954 /* Handle the special V850 section numbers that a symbol may use.  */
   2955 
   2956 static void
   2957 v850_elf_symbol_processing (bfd *abfd, asymbol *asym)
   2958 {
   2959   elf_symbol_type * elfsym = (elf_symbol_type *) asym;
   2960   unsigned int indx;
   2961 
   2962   indx = elfsym->internal_elf_sym.st_shndx;
   2963 
   2964   /* If the section index is an "ordinary" index, then it may
   2965      refer to a v850 specific section created by the assembler.
   2966      Check the section's type and change the index it matches.
   2967 
   2968      FIXME: Should we alter the st_shndx field as well ?  */
   2969 
   2970   if (indx < elf_numsections (abfd))
   2971     switch (elf_elfsections (abfd)[indx]->sh_type)
   2972       {
   2973       case SHT_V850_SCOMMON:
   2974 	indx = SHN_V850_SCOMMON;
   2975 	break;
   2976 
   2977       case SHT_V850_TCOMMON:
   2978 	indx = SHN_V850_TCOMMON;
   2979 	break;
   2980 
   2981       case SHT_V850_ZCOMMON:
   2982 	indx = SHN_V850_ZCOMMON;
   2983 	break;
   2984 
   2985       default:
   2986 	break;
   2987       }
   2988 
   2989   switch (indx)
   2990     {
   2991     case SHN_V850_SCOMMON:
   2992       if (v850_elf_scom_section.name == NULL)
   2993 	{
   2994 	  /* Initialize the small common section.  */
   2995 	  v850_elf_scom_section.name           = ".scommon";
   2996 	  v850_elf_scom_section.flags          = SEC_IS_COMMON | SEC_ALLOC | SEC_DATA;
   2997 	  v850_elf_scom_section.output_section = & v850_elf_scom_section;
   2998 	  v850_elf_scom_section.symbol         = & v850_elf_scom_symbol;
   2999 	  v850_elf_scom_section.symbol_ptr_ptr = & v850_elf_scom_symbol_ptr;
   3000 	  v850_elf_scom_symbol.name            = ".scommon";
   3001 	  v850_elf_scom_symbol.flags           = BSF_SECTION_SYM;
   3002 	  v850_elf_scom_symbol.section         = & v850_elf_scom_section;
   3003 	  v850_elf_scom_symbol_ptr             = & v850_elf_scom_symbol;
   3004 	}
   3005       asym->section = & v850_elf_scom_section;
   3006       asym->value = elfsym->internal_elf_sym.st_size;
   3007       break;
   3008 
   3009     case SHN_V850_TCOMMON:
   3010       if (v850_elf_tcom_section.name == NULL)
   3011 	{
   3012 	  /* Initialize the tcommon section.  */
   3013 	  v850_elf_tcom_section.name           = ".tcommon";
   3014 	  v850_elf_tcom_section.flags          = SEC_IS_COMMON;
   3015 	  v850_elf_tcom_section.output_section = & v850_elf_tcom_section;
   3016 	  v850_elf_tcom_section.symbol         = & v850_elf_tcom_symbol;
   3017 	  v850_elf_tcom_section.symbol_ptr_ptr = & v850_elf_tcom_symbol_ptr;
   3018 	  v850_elf_tcom_symbol.name            = ".tcommon";
   3019 	  v850_elf_tcom_symbol.flags           = BSF_SECTION_SYM;
   3020 	  v850_elf_tcom_symbol.section         = & v850_elf_tcom_section;
   3021 	  v850_elf_tcom_symbol_ptr             = & v850_elf_tcom_symbol;
   3022 	}
   3023       asym->section = & v850_elf_tcom_section;
   3024       asym->value = elfsym->internal_elf_sym.st_size;
   3025       break;
   3026 
   3027     case SHN_V850_ZCOMMON:
   3028       if (v850_elf_zcom_section.name == NULL)
   3029 	{
   3030 	  /* Initialize the zcommon section.  */
   3031 	  v850_elf_zcom_section.name           = ".zcommon";
   3032 	  v850_elf_zcom_section.flags          = SEC_IS_COMMON;
   3033 	  v850_elf_zcom_section.output_section = & v850_elf_zcom_section;
   3034 	  v850_elf_zcom_section.symbol         = & v850_elf_zcom_symbol;
   3035 	  v850_elf_zcom_section.symbol_ptr_ptr = & v850_elf_zcom_symbol_ptr;
   3036 	  v850_elf_zcom_symbol.name            = ".zcommon";
   3037 	  v850_elf_zcom_symbol.flags           = BSF_SECTION_SYM;
   3038 	  v850_elf_zcom_symbol.section         = & v850_elf_zcom_section;
   3039 	  v850_elf_zcom_symbol_ptr             = & v850_elf_zcom_symbol;
   3040 	}
   3041       asym->section = & v850_elf_zcom_section;
   3042       asym->value = elfsym->internal_elf_sym.st_size;
   3043       break;
   3044     }
   3045 }
   3046 
   3047 /* Hook called by the linker routine which adds symbols from an object
   3048    file.  We must handle the special v850 section numbers here.  */
   3049 
   3050 static bfd_boolean
   3051 v850_elf_add_symbol_hook (bfd *abfd,
   3052 			  struct bfd_link_info *info ATTRIBUTE_UNUSED,
   3053 			  Elf_Internal_Sym *sym,
   3054 			  const char **namep ATTRIBUTE_UNUSED,
   3055 			  flagword *flagsp ATTRIBUTE_UNUSED,
   3056 			  asection **secp,
   3057 			  bfd_vma *valp)
   3058 {
   3059   unsigned int indx = sym->st_shndx;
   3060 
   3061   /* If the section index is an "ordinary" index, then it may
   3062      refer to a v850 specific section created by the assembler.
   3063      Check the section's type and change the index it matches.
   3064 
   3065      FIXME: Should we alter the st_shndx field as well ?  */
   3066 
   3067   if (indx < elf_numsections (abfd))
   3068     switch (elf_elfsections (abfd)[indx]->sh_type)
   3069       {
   3070       case SHT_V850_SCOMMON:
   3071 	indx = SHN_V850_SCOMMON;
   3072 	break;
   3073 
   3074       case SHT_V850_TCOMMON:
   3075 	indx = SHN_V850_TCOMMON;
   3076 	break;
   3077 
   3078       case SHT_V850_ZCOMMON:
   3079 	indx = SHN_V850_ZCOMMON;
   3080 	break;
   3081 
   3082       default:
   3083 	break;
   3084       }
   3085 
   3086   switch (indx)
   3087     {
   3088     case SHN_V850_SCOMMON:
   3089       *secp = bfd_make_section_old_way (abfd, ".scommon");
   3090       (*secp)->flags |= SEC_IS_COMMON;
   3091       *valp = sym->st_size;
   3092       break;
   3093 
   3094     case SHN_V850_TCOMMON:
   3095       *secp = bfd_make_section_old_way (abfd, ".tcommon");
   3096       (*secp)->flags |= SEC_IS_COMMON;
   3097       *valp = sym->st_size;
   3098       break;
   3099 
   3100     case SHN_V850_ZCOMMON:
   3101       *secp = bfd_make_section_old_way (abfd, ".zcommon");
   3102       (*secp)->flags |= SEC_IS_COMMON;
   3103       *valp = sym->st_size;
   3104       break;
   3105     }
   3106 
   3107   return TRUE;
   3108 }
   3109 
   3110 static int
   3111 v850_elf_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
   3112 				  const char *name ATTRIBUTE_UNUSED,
   3113 				  Elf_Internal_Sym *sym,
   3114 				  asection *input_sec,
   3115 				  struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
   3116 {
   3117   /* If we see a common symbol, which implies a relocatable link, then
   3118      if a symbol was in a special common section in an input file, mark
   3119      it as a special common in the output file.  */
   3120 
   3121   if (sym->st_shndx == SHN_COMMON)
   3122     {
   3123       if (strcmp (input_sec->name, ".scommon") == 0)
   3124 	sym->st_shndx = SHN_V850_SCOMMON;
   3125       else if (strcmp (input_sec->name, ".tcommon") == 0)
   3126 	sym->st_shndx = SHN_V850_TCOMMON;
   3127       else if (strcmp (input_sec->name, ".zcommon") == 0)
   3128 	sym->st_shndx = SHN_V850_ZCOMMON;
   3129     }
   3130 
   3131   /* The price we pay for using h->other unused bits as flags in the
   3132      linker is cleaning up after ourselves.  */
   3133 
   3134   sym->st_other &= ~(V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA
   3135 		     | V850_OTHER_ERROR);
   3136 
   3137   return 1;
   3138 }
   3139 
   3140 static bfd_boolean
   3141 v850_elf_section_from_shdr (bfd *abfd,
   3142 			    Elf_Internal_Shdr *hdr,
   3143 			    const char *name,
   3144 			    int shindex)
   3145 {
   3146   /* There ought to be a place to keep ELF backend specific flags, but
   3147      at the moment there isn't one.  We just keep track of the
   3148      sections by their name, instead.  */
   3149 
   3150   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
   3151     return FALSE;
   3152 
   3153   switch (hdr->sh_type)
   3154     {
   3155     case SHT_V850_SCOMMON:
   3156     case SHT_V850_TCOMMON:
   3157     case SHT_V850_ZCOMMON:
   3158       if (! bfd_set_section_flags (abfd, hdr->bfd_section,
   3159 				   (bfd_get_section_flags (abfd,
   3160 							   hdr->bfd_section)
   3161 				    | SEC_IS_COMMON)))
   3162 	return FALSE;
   3163     }
   3164 
   3165   return TRUE;
   3166 }
   3167 
   3168 /* Set the correct type for a V850 ELF section.  We do this
   3169    by the section name, which is a hack, but ought to work.  */
   3170 
   3171 static bfd_boolean
   3172 v850_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
   3173 			Elf_Internal_Shdr *hdr,
   3174 			asection *sec)
   3175 {
   3176   const char * name;
   3177 
   3178   name = bfd_get_section_name (abfd, sec);
   3179 
   3180   if (strcmp (name, ".scommon") == 0)
   3181     hdr->sh_type = SHT_V850_SCOMMON;
   3182   else if (strcmp (name, ".tcommon") == 0)
   3183     hdr->sh_type = SHT_V850_TCOMMON;
   3184   else if (strcmp (name, ".zcommon") == 0)
   3185     hdr->sh_type = SHT_V850_ZCOMMON;
   3186   /* Tweak the section type of .note.renesas.  */
   3187   else if (strcmp (name, V850_NOTE_SECNAME) == 0)
   3188     {
   3189       hdr->sh_type = SHT_RENESAS_INFO;
   3190       hdr->sh_entsize = SIZEOF_V850_NOTE;
   3191     }
   3192 
   3193   return TRUE;
   3194 }
   3195 
   3196 /* Delete some bytes from a section while relaxing.  */
   3197 
   3198 static bfd_boolean
   3199 v850_elf_relax_delete_bytes (bfd *abfd,
   3200 			     asection *sec,
   3201 			     bfd_vma addr,
   3202 			     bfd_vma toaddr,
   3203 			     int count)
   3204 {
   3205   Elf_Internal_Shdr *symtab_hdr;
   3206   Elf32_External_Sym *extsyms;
   3207   Elf32_External_Sym *esym;
   3208   Elf32_External_Sym *esymend;
   3209   int sym_index;
   3210   unsigned int sec_shndx;
   3211   bfd_byte *contents;
   3212   Elf_Internal_Rela *irel;
   3213   Elf_Internal_Rela *irelend;
   3214   struct elf_link_hash_entry *sym_hash;
   3215   Elf_External_Sym_Shndx *shndx;
   3216 
   3217   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   3218   extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
   3219 
   3220   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
   3221 
   3222   contents = elf_section_data (sec)->this_hdr.contents;
   3223 
   3224   /* The deletion must stop at the next ALIGN reloc for an alignment
   3225      power larger than the number of bytes we are deleting.  */
   3226 
   3227   /* Actually delete the bytes.  */
   3228 #if (DEBUG_RELAX & 2)
   3229   fprintf (stderr, "relax_delete: contents: sec: %s  %p .. %p %x\n",
   3230 	   sec->name, addr, toaddr, count );
   3231 #endif
   3232   memmove (contents + addr, contents + addr + count,
   3233 	   toaddr - addr - count);
   3234   memset (contents + toaddr-count, 0, count);
   3235 
   3236   /* Adjust all the relocs.  */
   3237   irel = elf_section_data (sec)->relocs;
   3238   irelend = irel + sec->reloc_count;
   3239   if (elf_symtab_shndx_list (abfd))
   3240     {
   3241       Elf_Internal_Shdr *shndx_hdr;
   3242 
   3243       shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
   3244       shndx = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
   3245     }
   3246   else
   3247     {
   3248       shndx = NULL;
   3249     }
   3250 
   3251   for (; irel < irelend; irel++)
   3252     {
   3253       bfd_vma raddr, paddr, symval;
   3254       Elf_Internal_Sym isym;
   3255 
   3256       /* Get the new reloc address.  */
   3257       raddr = irel->r_offset;
   3258       if ((raddr >= (addr + count) && raddr < toaddr))
   3259 	irel->r_offset -= count;
   3260 
   3261       if (raddr >= addr && raddr < addr + count)
   3262 	{
   3263 	  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   3264 				       (int) R_V850_NONE);
   3265 	  continue;
   3266 	}
   3267 
   3268       if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN)
   3269 	continue;
   3270 
   3271       bfd_elf32_swap_symbol_in (abfd,
   3272 				extsyms + ELF32_R_SYM (irel->r_info),
   3273 				shndx ? shndx + ELF32_R_SYM (irel->r_info) : NULL,
   3274 				& isym);
   3275 
   3276       if (isym.st_shndx != sec_shndx)
   3277 	continue;
   3278 
   3279       /* Get the value of the symbol referred to by the reloc.  */
   3280       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
   3281 	{
   3282 	  symval = isym.st_value;
   3283 #if (DEBUG_RELAX & 2)
   3284 	  {
   3285 	    char * name = bfd_elf_string_from_elf_section
   3286 	                   (abfd, symtab_hdr->sh_link, isym.st_name);
   3287 	    fprintf (stderr,
   3288 	       "relax_delete: local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
   3289 	       sec->name, name, isym.st_name,
   3290 	       sec->output_section->vma, sec->output_offset,
   3291 	       isym.st_value, irel->r_addend);
   3292 	  }
   3293 #endif
   3294 	}
   3295       else
   3296 	{
   3297 	  unsigned long indx;
   3298 	  struct elf_link_hash_entry * h;
   3299 
   3300 	  /* An external symbol.  */
   3301 	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
   3302 
   3303 	  h = elf_sym_hashes (abfd) [indx];
   3304 	  BFD_ASSERT (h != NULL);
   3305 
   3306 	  symval = h->root.u.def.value;
   3307 #if (DEBUG_RELAX & 2)
   3308 	  fprintf (stderr,
   3309 		   "relax_delete: defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
   3310 		   sec->name, h->root.root.string, h->root.u.def.value,
   3311 		   sec->output_section->vma, sec->output_offset, irel->r_addend);
   3312 #endif
   3313 	}
   3314 
   3315       paddr = symval + irel->r_addend;
   3316 
   3317       if ( (symval >= addr + count && symval < toaddr)
   3318 	  && (paddr < addr + count || paddr >= toaddr))
   3319 	irel->r_addend += count;
   3320       else if (    (symval < addr + count || symval >= toaddr)
   3321 	        && (paddr >= addr + count && paddr < toaddr))
   3322 	irel->r_addend -= count;
   3323     }
   3324 
   3325   /* Adjust the local symbols defined in this section.  */
   3326   esym = extsyms;
   3327   esymend = esym + symtab_hdr->sh_info;
   3328 
   3329   for (; esym < esymend; esym++, shndx = (shndx ? shndx + 1 : NULL))
   3330     {
   3331       Elf_Internal_Sym isym;
   3332 
   3333       bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
   3334 
   3335       if (isym.st_shndx == sec_shndx
   3336 	  && isym.st_value >= addr + count
   3337 	  && isym.st_value < toaddr)
   3338 	{
   3339 	  isym.st_value -= count;
   3340 
   3341 	  if (isym.st_value + isym.st_size >= toaddr)
   3342 	    isym.st_size += count;
   3343 
   3344 	  bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
   3345 	}
   3346       else if (isym.st_shndx == sec_shndx
   3347 	       && isym.st_value < addr + count)
   3348 	{
   3349 	  if (isym.st_value+isym.st_size >= addr + count
   3350 	      && isym.st_value+isym.st_size < toaddr)
   3351 	    isym.st_size -= count;
   3352 
   3353 	  if (isym.st_value >= addr
   3354 	      && isym.st_value <  addr + count)
   3355 	    isym.st_value = addr;
   3356 
   3357 	  bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
   3358 	}
   3359     }
   3360 
   3361   /* Now adjust the global symbols defined in this section.  */
   3362   esym = extsyms + symtab_hdr->sh_info;
   3363   esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
   3364 
   3365   for (sym_index = 0; esym < esymend; esym ++, sym_index ++)
   3366     {
   3367       Elf_Internal_Sym isym;
   3368 
   3369       bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
   3370       sym_hash = elf_sym_hashes (abfd) [sym_index];
   3371 
   3372       if (isym.st_shndx == sec_shndx
   3373 	  && ((sym_hash)->root.type == bfd_link_hash_defined
   3374 	      || (sym_hash)->root.type == bfd_link_hash_defweak)
   3375 	  && (sym_hash)->root.u.def.section == sec
   3376 	  && (sym_hash)->root.u.def.value >= addr + count
   3377 	  && (sym_hash)->root.u.def.value < toaddr)
   3378 	{
   3379 	  if ((sym_hash)->root.u.def.value + isym.st_size >= toaddr)
   3380 	    {
   3381 	      isym.st_size += count;
   3382 	      bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
   3383 	    }
   3384 
   3385 	  (sym_hash)->root.u.def.value -= count;
   3386 	}
   3387       else if (isym.st_shndx == sec_shndx
   3388 	       && ((sym_hash)->root.type == bfd_link_hash_defined
   3389 		   || (sym_hash)->root.type == bfd_link_hash_defweak)
   3390 	       && (sym_hash)->root.u.def.section == sec
   3391 	       && (sym_hash)->root.u.def.value < addr + count)
   3392 	{
   3393 	  if ((sym_hash)->root.u.def.value+isym.st_size >= addr + count
   3394 	      && (sym_hash)->root.u.def.value+isym.st_size < toaddr)
   3395 	    isym.st_size -= count;
   3396 
   3397 	  if ((sym_hash)->root.u.def.value >= addr
   3398 	      && (sym_hash)->root.u.def.value < addr + count)
   3399 	    (sym_hash)->root.u.def.value = addr;
   3400 
   3401 	  bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
   3402 	}
   3403 
   3404       if (shndx)
   3405 	++ shndx;
   3406     }
   3407 
   3408   return TRUE;
   3409 }
   3410 
   3411 #define NOP_OPCODE 	(0x0000)
   3412 #define MOVHI	    	0x0640				/* 4byte.  */
   3413 #define MOVHI_MASK  	0x07e0
   3414 #define MOVHI_R1(insn)	((insn) & 0x1f)			/* 4byte.  */
   3415 #define MOVHI_R2(insn)	((insn) >> 11)
   3416 #define MOVEA	    	0x0620				/* 2byte.  */
   3417 #define MOVEA_MASK  	0x07e0
   3418 #define MOVEA_R1(insn)	((insn) & 0x1f)
   3419 #define MOVEA_R2(insn)	((insn) >> 11)
   3420 #define JARL_4	    	0x00040780				/* 4byte.  */
   3421 #define JARL_4_MASK 	0xFFFF07FF
   3422 #define JARL_R2(insn)	(int)(((insn) & (~JARL_4_MASK)) >> 11)
   3423 #define ADD_I       	0x0240					/* 2byte.  */
   3424 #define ADD_I_MASK  	0x07e0
   3425 #define ADD_I5(insn)	((((insn) & 0x001f) << 11) >> 11)	/* 2byte.  */
   3426 #define ADD_R2(insn)	((insn) >> 11)
   3427 #define JMP_R	    	0x0060					/* 2byte.  */
   3428 #define JMP_R_MASK 	0xFFE0
   3429 #define JMP_R1(insn)	((insn) & 0x1f)
   3430 
   3431 static bfd_boolean
   3432 v850_elf_relax_section (bfd *abfd,
   3433 			asection *sec,
   3434 			struct bfd_link_info *link_info,
   3435 			bfd_boolean *again)
   3436 {
   3437   Elf_Internal_Shdr *symtab_hdr;
   3438   Elf_Internal_Rela *internal_relocs;
   3439   Elf_Internal_Rela *irel;
   3440   Elf_Internal_Rela *irelend;
   3441   Elf_Internal_Rela *irelalign = NULL;
   3442   Elf_Internal_Sym *isymbuf = NULL;
   3443   bfd_byte *contents = NULL;
   3444   bfd_vma addr = 0;
   3445   bfd_vma toaddr;
   3446   int align_pad_size = 0;
   3447   bfd_boolean result = TRUE;
   3448 
   3449   *again = FALSE;
   3450 
   3451   if (bfd_link_relocatable (link_info)
   3452       || (sec->flags & SEC_RELOC) == 0
   3453       || sec->reloc_count == 0)
   3454     return TRUE;
   3455 
   3456   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
   3457 
   3458   internal_relocs = (_bfd_elf_link_read_relocs
   3459 		     (abfd, sec, NULL, NULL, link_info->keep_memory));
   3460   if (internal_relocs == NULL)
   3461     goto error_return;
   3462 
   3463   irelend = internal_relocs + sec->reloc_count;
   3464 
   3465   while (addr < sec->size)
   3466     {
   3467       toaddr = sec->size;
   3468 
   3469       for (irel = internal_relocs; irel < irelend; irel ++)
   3470 	if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
   3471 	    && irel->r_offset > addr
   3472 	    && irel->r_offset < toaddr)
   3473 	  toaddr = irel->r_offset;
   3474 
   3475 #ifdef DEBUG_RELAX
   3476       fprintf (stderr, "relax region 0x%x to 0x%x align pad %d\n",
   3477 	       addr, toaddr, align_pad_size);
   3478 #endif
   3479       if (irelalign)
   3480 	{
   3481 	  bfd_vma alignto;
   3482 	  bfd_vma alignmoveto;
   3483 
   3484 	  alignmoveto = BFD_ALIGN (addr - align_pad_size, 1 << irelalign->r_addend);
   3485 	  alignto = BFD_ALIGN (addr, 1 << irelalign->r_addend);
   3486 
   3487 	  if (alignmoveto < alignto)
   3488 	    {
   3489 	      bfd_vma i;
   3490 
   3491 	      align_pad_size = alignto - alignmoveto;
   3492 #ifdef DEBUG_RELAX
   3493 	      fprintf (stderr, "relax move region 0x%x to 0x%x delete size 0x%x\n",
   3494 		       alignmoveto, toaddr, align_pad_size);
   3495 #endif
   3496 	      if (!v850_elf_relax_delete_bytes (abfd, sec, alignmoveto,
   3497 						toaddr, align_pad_size))
   3498 		goto error_return;
   3499 
   3500 	      for (i  = BFD_ALIGN (toaddr - align_pad_size, 1);
   3501 		   (i + 1) < toaddr; i += 2)
   3502 		bfd_put_16 (abfd, NOP_OPCODE, contents + i);
   3503 
   3504 	      addr = alignmoveto;
   3505 	    }
   3506 	  else
   3507 	    align_pad_size = 0;
   3508 	}
   3509 
   3510       for (irel = internal_relocs; irel < irelend; irel++)
   3511 	{
   3512 	  bfd_vma laddr;
   3513 	  bfd_vma addend;
   3514 	  bfd_vma symval;
   3515 	  int insn[5];
   3516 	  int no_match = -1;
   3517 	  Elf_Internal_Rela *hi_irelfn;
   3518 	  Elf_Internal_Rela *lo_irelfn;
   3519 	  Elf_Internal_Rela *irelcall;
   3520 	  bfd_signed_vma foff;
   3521 	  unsigned int r_type;
   3522 
   3523 	  if (! (irel->r_offset >= addr && irel->r_offset < toaddr
   3524 		 && (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL
   3525 		     || ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)))
   3526 	    continue;
   3527 
   3528 #ifdef DEBUG_RELAX
   3529 	  fprintf (stderr, "relax check r_info 0x%x r_offset 0x%x r_addend 0x%x\n",
   3530 		   irel->r_info,
   3531 		   irel->r_offset,
   3532 		   irel->r_addend );
   3533 #endif
   3534 
   3535 	  /* Get the section contents.  */
   3536 	  if (contents == NULL)
   3537 	    {
   3538 	      if (elf_section_data (sec)->this_hdr.contents != NULL)
   3539 		contents = elf_section_data (sec)->this_hdr.contents;
   3540 	      else
   3541 		{
   3542 		  if (! bfd_malloc_and_get_section (abfd, sec, &contents))
   3543 		    goto error_return;
   3544 		}
   3545 	    }
   3546 
   3547 	  /* Read this BFD's local symbols if we haven't done so already.  */
   3548 	  if (isymbuf == NULL && symtab_hdr->sh_info != 0)
   3549 	    {
   3550 	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
   3551 	      if (isymbuf == NULL)
   3552 		isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
   3553 						symtab_hdr->sh_info, 0,
   3554 						NULL, NULL, NULL);
   3555 	      if (isymbuf == NULL)
   3556 		goto error_return;
   3557 	    }
   3558 
   3559 	  laddr = irel->r_offset;
   3560 
   3561 	  if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL)
   3562 	    {
   3563 	      /* Check code for -mlong-calls output. */
   3564 	      if (laddr + 16 <= (bfd_vma) sec->size)
   3565 		{
   3566 		  insn[0] = bfd_get_16 (abfd, contents + laddr);
   3567 		  insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
   3568 		  insn[2] = bfd_get_32 (abfd, contents + laddr + 8);
   3569 		  insn[3] = bfd_get_16 (abfd, contents + laddr + 12);
   3570 		  insn[4] = bfd_get_16 (abfd, contents + laddr + 14);
   3571 
   3572 		  if ((insn[0] & MOVHI_MASK) != MOVHI
   3573 		       || MOVHI_R1 (insn[0]) != 0)
   3574 		    no_match = 0;
   3575 
   3576 		  if (no_match < 0
   3577 		      && ((insn[1] & MOVEA_MASK) != MOVEA
   3578 			   || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
   3579 		    no_match = 1;
   3580 
   3581 		  if (no_match < 0
   3582 		      && (insn[2] & JARL_4_MASK) != JARL_4)
   3583 		    no_match = 2;
   3584 
   3585 		  if (no_match < 0
   3586 		      && ((insn[3] & ADD_I_MASK) != ADD_I
   3587 			   || ADD_I5 (insn[3]) != 4
   3588 			   || JARL_R2 (insn[2]) != ADD_R2 (insn[3])))
   3589 		    no_match = 3;
   3590 
   3591 		  if (no_match < 0
   3592 		      && ((insn[4] & JMP_R_MASK) != JMP_R
   3593 			   || MOVEA_R2 (insn[1]) != JMP_R1 (insn[4])))
   3594 		    no_match = 4;
   3595 		}
   3596 	      else
   3597 		{
   3598 		  ((*_bfd_error_handler)
   3599 		   ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insns",
   3600 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset));
   3601 
   3602 		  continue;
   3603 		}
   3604 
   3605 	      if (no_match >= 0)
   3606 		{
   3607 		  ((*_bfd_error_handler)
   3608 		   ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insn 0x%x",
   3609 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
   3610 
   3611 		  continue;
   3612 		}
   3613 
   3614 	      /* Get the reloc for the address from which the register is
   3615 	         being loaded.  This reloc will tell us which function is
   3616 	         actually being called.  */
   3617 
   3618 	      for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
   3619 		{
   3620 		  r_type = ELF32_R_TYPE (hi_irelfn->r_info);
   3621 
   3622 		  if (hi_irelfn->r_offset == laddr + 2
   3623 		      && (r_type == (int) R_V850_HI16_S || r_type == (int) R_V810_WHI1))
   3624 		    break;
   3625 		}
   3626 
   3627 	      for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
   3628 		{
   3629 		  r_type = ELF32_R_TYPE (lo_irelfn->r_info);
   3630 
   3631 		  if (lo_irelfn->r_offset == laddr + 6
   3632 		      && (r_type == (int) R_V850_LO16 || r_type == (int) R_V810_WLO))
   3633 		    break;
   3634 		}
   3635 
   3636 	      for (irelcall = internal_relocs; irelcall < irelend; irelcall ++)
   3637 		{
   3638 		  r_type = ELF32_R_TYPE (irelcall->r_info);
   3639 
   3640 		  if (irelcall->r_offset == laddr + 8
   3641 		      && (r_type == (int) R_V850_22_PCREL || r_type == (int) R_V850_PCR22))
   3642 		    break;
   3643 		}
   3644 
   3645 	      if (   hi_irelfn == irelend
   3646 		  || lo_irelfn == irelend
   3647 		  || irelcall  == irelend)
   3648 		{
   3649 		  ((*_bfd_error_handler)
   3650 		   ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc",
   3651 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
   3652 
   3653 		  continue;
   3654 		}
   3655 
   3656 	      if (ELF32_R_SYM (irelcall->r_info) < symtab_hdr->sh_info)
   3657 		{
   3658 		  Elf_Internal_Sym *  isym;
   3659 
   3660 		  /* A local symbol.  */
   3661 		  isym = isymbuf + ELF32_R_SYM (irelcall->r_info);
   3662 
   3663 		  symval = isym->st_value;
   3664 		}
   3665 	      else
   3666 		{
   3667 		  unsigned long indx;
   3668 		  struct elf_link_hash_entry * h;
   3669 
   3670 		  /* An external symbol.  */
   3671 		  indx = ELF32_R_SYM (irelcall->r_info) - symtab_hdr->sh_info;
   3672 		  h = elf_sym_hashes (abfd)[indx];
   3673 		  BFD_ASSERT (h != NULL);
   3674 
   3675 		  if (   h->root.type != bfd_link_hash_defined
   3676 		      && h->root.type != bfd_link_hash_defweak)
   3677 		    /* This appears to be a reference to an undefined
   3678 		       symbol.  Just ignore it--it will be caught by the
   3679 		       regular reloc processing.  */
   3680 		    continue;
   3681 
   3682 		  symval = h->root.u.def.value;
   3683 		}
   3684 
   3685 	      if (symval + irelcall->r_addend != irelcall->r_offset + 4)
   3686 		{
   3687 		  ((*_bfd_error_handler)
   3688 		   ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc 0x%lx",
   3689 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset, irelcall->r_offset ));
   3690 
   3691 		  continue;
   3692 		}
   3693 
   3694 	      /* Get the value of the symbol referred to by the reloc.  */
   3695 	      if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
   3696 		{
   3697 		  Elf_Internal_Sym *isym;
   3698 		  asection *sym_sec;
   3699 
   3700 		  /* A local symbol.  */
   3701 		  isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
   3702 
   3703 		  if (isym->st_shndx == SHN_UNDEF)
   3704 		    sym_sec = bfd_und_section_ptr;
   3705 		  else if (isym->st_shndx == SHN_ABS)
   3706 		    sym_sec = bfd_abs_section_ptr;
   3707 		  else if (isym->st_shndx == SHN_COMMON)
   3708 		    sym_sec = bfd_com_section_ptr;
   3709 		  else
   3710 		    sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
   3711 		  symval = (isym->st_value
   3712 			    + sym_sec->output_section->vma
   3713 			    + sym_sec->output_offset);
   3714 		}
   3715 	      else
   3716 		{
   3717 		  unsigned long indx;
   3718 		  struct elf_link_hash_entry *h;
   3719 
   3720 		  /* An external symbol.  */
   3721 		  indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
   3722 		  h = elf_sym_hashes (abfd)[indx];
   3723 		  BFD_ASSERT (h != NULL);
   3724 
   3725 		  if (   h->root.type != bfd_link_hash_defined
   3726 		      && h->root.type != bfd_link_hash_defweak)
   3727 		    /* This appears to be a reference to an undefined
   3728 		       symbol.  Just ignore it--it will be caught by the
   3729 		       regular reloc processing.  */
   3730 		    continue;
   3731 
   3732 		  symval = (h->root.u.def.value
   3733 			    + h->root.u.def.section->output_section->vma
   3734 			    + h->root.u.def.section->output_offset);
   3735 		}
   3736 
   3737 	      addend = irel->r_addend;
   3738 
   3739 	      foff = (symval + addend
   3740 		      - (irel->r_offset
   3741 			 + sec->output_section->vma
   3742 			 + sec->output_offset
   3743 			 + 4));
   3744 #ifdef DEBUG_RELAX
   3745 	      fprintf (stderr, "relax longcall r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
   3746 		       irel->r_offset,
   3747 		       (irel->r_offset
   3748 			+ sec->output_section->vma
   3749 			+ sec->output_offset),
   3750 		       symval, addend, foff);
   3751 #endif
   3752 
   3753 	      if (foff < -0x100000 || foff >= 0x100000)
   3754 		/* After all that work, we can't shorten this function call.  */
   3755 		continue;
   3756 
   3757 	      /* For simplicity of coding, we are going to modify the section
   3758 	         contents, the section relocs, and the BFD symbol table.  We
   3759 	         must tell the rest of the code not to free up this
   3760 	         information.  It would be possible to instead create a table
   3761 	         of changes which have to be made, as is done in coff-mips.c;
   3762 	         that would be more work, but would require less memory when
   3763 	         the linker is run.  */
   3764 	      elf_section_data (sec)->relocs = internal_relocs;
   3765 	      elf_section_data (sec)->this_hdr.contents = contents;
   3766 	      symtab_hdr->contents = (bfd_byte *) isymbuf;
   3767 
   3768 	      /* Replace the long call with a jarl.  */
   3769 	      if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
   3770 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_PCR22);
   3771 	      else
   3772 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_22_PCREL);
   3773 
   3774 	      addend = 0;
   3775 
   3776 	      if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
   3777 		/* If this needs to be changed because of future relaxing,
   3778 		   it will be handled here like other internal IND12W
   3779 		   relocs.  */
   3780 		bfd_put_32 (abfd,
   3781 			    0x00000780 | (JARL_R2 (insn[2])<<11) | ((addend << 16) & 0xffff) | ((addend >> 16) & 0xf),
   3782 			    contents + irel->r_offset);
   3783 	      else
   3784 		/* We can't fully resolve this yet, because the external
   3785 		   symbol value may be changed by future relaxing.
   3786 		   We let the final link phase handle it.  */
   3787 		bfd_put_32 (abfd, 0x00000780 | (JARL_R2 (insn[2])<<11),
   3788 			    contents + irel->r_offset);
   3789 
   3790 	      hi_irelfn->r_info =
   3791 		ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
   3792 	      lo_irelfn->r_info =
   3793 		ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
   3794 	      irelcall->r_info =
   3795 		ELF32_R_INFO (ELF32_R_SYM (irelcall->r_info), R_V850_NONE);
   3796 
   3797 	      if (! v850_elf_relax_delete_bytes (abfd, sec,
   3798 						 irel->r_offset + 4, toaddr, 12))
   3799 		goto error_return;
   3800 
   3801 	      align_pad_size += 12;
   3802 	    }
   3803 	  else if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)
   3804 	    {
   3805 	      /* Check code for -mlong-jumps output.  */
   3806 	      if (laddr + 10 <= (bfd_vma) sec->size)
   3807 		{
   3808 		  insn[0] = bfd_get_16 (abfd, contents + laddr);
   3809 		  insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
   3810 		  insn[2] = bfd_get_16 (abfd, contents + laddr + 8);
   3811 
   3812 		  if ((insn[0] & MOVHI_MASK) != MOVHI
   3813 		       || MOVHI_R1 (insn[0]) != 0)
   3814 		    no_match = 0;
   3815 
   3816 		  if (no_match < 0
   3817 		      && ((insn[1] & MOVEA_MASK) != MOVEA
   3818 			   || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
   3819 		    no_match = 1;
   3820 
   3821 		  if (no_match < 0
   3822 		      && ((insn[2] & JMP_R_MASK) != JMP_R
   3823 			   || MOVEA_R2 (insn[1]) != JMP_R1 (insn[2])))
   3824 		    no_match = 4;
   3825 		}
   3826 	      else
   3827 		{
   3828 		  ((*_bfd_error_handler)
   3829 		   ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insns",
   3830 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset));
   3831 
   3832 		  continue;
   3833 		}
   3834 
   3835 	      if (no_match >= 0)
   3836 		{
   3837 		  ((*_bfd_error_handler)
   3838 		   ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insn 0x%x",
   3839 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
   3840 
   3841 		  continue;
   3842 		}
   3843 
   3844 	      /* Get the reloc for the address from which the register is
   3845 	         being loaded.  This reloc will tell us which function is
   3846 	         actually being called.  */
   3847 	      for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
   3848 		{
   3849 		  r_type = ELF32_R_TYPE (hi_irelfn->r_info);
   3850 
   3851 		  if (hi_irelfn->r_offset == laddr + 2
   3852 		      && ((r_type == (int) R_V850_HI16_S) || r_type == (int) R_V810_WHI1))
   3853 		    break;
   3854 		}
   3855 
   3856 	      for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
   3857 		{
   3858 		  r_type = ELF32_R_TYPE (lo_irelfn->r_info);
   3859 
   3860 		  if (lo_irelfn->r_offset == laddr + 6
   3861 		      && (r_type == (int) R_V850_LO16 || r_type == (int) R_V810_WLO))
   3862 		    break;
   3863 		}
   3864 
   3865 	      if (   hi_irelfn == irelend
   3866 		  || lo_irelfn == irelend)
   3867 		{
   3868 		  ((*_bfd_error_handler)
   3869 		   ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized reloc",
   3870 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
   3871 
   3872 		  continue;
   3873 		}
   3874 
   3875 	      /* Get the value of the symbol referred to by the reloc.  */
   3876 	      if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
   3877 		{
   3878 		  Elf_Internal_Sym *  isym;
   3879 		  asection *          sym_sec;
   3880 
   3881 		  /* A local symbol.  */
   3882 		  isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
   3883 
   3884 		  if (isym->st_shndx == SHN_UNDEF)
   3885 		    sym_sec = bfd_und_section_ptr;
   3886 		  else if (isym->st_shndx == SHN_ABS)
   3887 		    sym_sec = bfd_abs_section_ptr;
   3888 		  else if (isym->st_shndx == SHN_COMMON)
   3889 		    sym_sec = bfd_com_section_ptr;
   3890 		  else
   3891 		    sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
   3892 		  symval = (isym->st_value
   3893 			    + sym_sec->output_section->vma
   3894 			    + sym_sec->output_offset);
   3895 #ifdef DEBUG_RELAX
   3896 		  {
   3897 		    char * name = bfd_elf_string_from_elf_section
   3898 		      (abfd, symtab_hdr->sh_link, isym->st_name);
   3899 
   3900 		    fprintf (stderr, "relax long jump local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
   3901 			     sym_sec->name, name, isym->st_name,
   3902 			     sym_sec->output_section->vma,
   3903 			     sym_sec->output_offset,
   3904 			     isym->st_value, irel->r_addend);
   3905 		  }
   3906 #endif
   3907 		}
   3908 	      else
   3909 		{
   3910 		  unsigned long indx;
   3911 		  struct elf_link_hash_entry * h;
   3912 
   3913 		  /* An external symbol.  */
   3914 		  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
   3915 		  h = elf_sym_hashes (abfd)[indx];
   3916 		  BFD_ASSERT (h != NULL);
   3917 
   3918 		  if (   h->root.type != bfd_link_hash_defined
   3919 		      && h->root.type != bfd_link_hash_defweak)
   3920 		    /* This appears to be a reference to an undefined
   3921 		       symbol.  Just ignore it--it will be caught by the
   3922 		       regular reloc processing.  */
   3923 		    continue;
   3924 
   3925 		  symval = (h->root.u.def.value
   3926 			    + h->root.u.def.section->output_section->vma
   3927 			    + h->root.u.def.section->output_offset);
   3928 #ifdef DEBUG_RELAX
   3929 		  fprintf (stderr,
   3930 			   "relax longjump defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
   3931 			   sec->name, h->root.root.string, h->root.u.def.value,
   3932 			   sec->output_section->vma, sec->output_offset, irel->r_addend);
   3933 #endif
   3934 		}
   3935 
   3936 	      addend = irel->r_addend;
   3937 
   3938 	      foff = (symval + addend
   3939 		      - (irel->r_offset
   3940 			 + sec->output_section->vma
   3941 			 + sec->output_offset
   3942 			 + 4));
   3943 #ifdef DEBUG_RELAX
   3944 	      fprintf (stderr, "relax longjump r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
   3945 		       irel->r_offset,
   3946 		       (irel->r_offset
   3947 			+ sec->output_section->vma
   3948 			+ sec->output_offset),
   3949 		       symval, addend, foff);
   3950 #endif
   3951 	      if (foff < -0x100000 || foff >= 0x100000)
   3952 		/* After all that work, we can't shorten this function call.  */
   3953 		continue;
   3954 
   3955 	      /* For simplicity of coding, we are going to modify the section
   3956 	         contents, the section relocs, and the BFD symbol table.  We
   3957 	         must tell the rest of the code not to free up this
   3958 	         information.  It would be possible to instead create a table
   3959 	         of changes which have to be made, as is done in coff-mips.c;
   3960 	         that would be more work, but would require less memory when
   3961 	         the linker is run.  */
   3962 	      elf_section_data (sec)->relocs = internal_relocs;
   3963 	      elf_section_data (sec)->this_hdr.contents = contents;
   3964 	      symtab_hdr->contents = (bfd_byte *) isymbuf;
   3965 
   3966 	      if (foff < -0x100 || foff >= 0x100)
   3967 		{
   3968 		  /* Replace the long jump with a jr.  */
   3969 
   3970 		  if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
   3971 		    irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_PCR22);
   3972 		  else
   3973 		    irel->r_info =
   3974 		      ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_22_PCREL);
   3975 
   3976 		  irel->r_addend = addend;
   3977 		  addend = 0;
   3978 
   3979 		  if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
   3980 		    /* If this needs to be changed because of future relaxing,
   3981 		       it will be handled here like other internal IND12W
   3982 		       relocs.  */
   3983 		    bfd_put_32 (abfd,
   3984 				0x00000780 | ((addend << 15) & 0xffff0000) | ((addend >> 17) & 0xf),
   3985 				contents + irel->r_offset);
   3986 		  else
   3987 		    /* We can't fully resolve this yet, because the external
   3988 		       symbol value may be changed by future relaxing.
   3989 		       We let the final link phase handle it.  */
   3990 		    bfd_put_32 (abfd, 0x00000780, contents + irel->r_offset);
   3991 
   3992 		  hi_irelfn->r_info =
   3993 			ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
   3994 		  lo_irelfn->r_info =
   3995 			ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
   3996 		  if (!v850_elf_relax_delete_bytes (abfd, sec,
   3997 						    irel->r_offset + 4, toaddr, 6))
   3998 		    goto error_return;
   3999 
   4000 		  align_pad_size += 6;
   4001 		}
   4002 	      else
   4003 		{
   4004 		  /* Replace the long jump with a br.  */
   4005 
   4006 		  if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
   4007 		    irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_PC9);
   4008 		  else
   4009 		    irel->r_info =
   4010 		      ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_9_PCREL);
   4011 
   4012 		  irel->r_addend = addend;
   4013 		  addend = 0;
   4014 
   4015 		  if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
   4016 		    /* If this needs to be changed because of future relaxing,
   4017 		       it will be handled here like other internal IND12W
   4018 		       relocs.  */
   4019 		    bfd_put_16 (abfd,
   4020 				0x0585 | ((addend << 10) & 0xf800) | ((addend << 3) & 0x0070),
   4021 				contents + irel->r_offset);
   4022 		  else
   4023 		    /* We can't fully resolve this yet, because the external
   4024 		       symbol value may be changed by future relaxing.
   4025 		       We let the final link phase handle it.  */
   4026 		    bfd_put_16 (abfd, 0x0585, contents + irel->r_offset);
   4027 
   4028 		  hi_irelfn->r_info =
   4029 			ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
   4030 		  lo_irelfn->r_info =
   4031 			ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
   4032 		  if (!v850_elf_relax_delete_bytes (abfd, sec,
   4033 						    irel->r_offset + 2, toaddr, 8))
   4034 		    goto error_return;
   4035 
   4036 		  align_pad_size += 8;
   4037 		}
   4038 	    }
   4039 	}
   4040 
   4041       irelalign = NULL;
   4042       for (irel = internal_relocs; irel < irelend; irel++)
   4043 	{
   4044 	  if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
   4045 	      && irel->r_offset == toaddr)
   4046 	    {
   4047 	      irel->r_offset -= align_pad_size;
   4048 
   4049 	      if (irelalign == NULL || irelalign->r_addend > irel->r_addend)
   4050 		irelalign = irel;
   4051 	    }
   4052 	}
   4053 
   4054       addr = toaddr;
   4055     }
   4056 
   4057   if (!irelalign)
   4058     {
   4059 #ifdef DEBUG_RELAX
   4060       fprintf (stderr, "relax pad %d shorten %d -> %d\n",
   4061 	       align_pad_size,
   4062 	       sec->size,
   4063 	       sec->size - align_pad_size);
   4064 #endif
   4065       sec->size -= align_pad_size;
   4066     }
   4067 
   4068  finish:
   4069   if (internal_relocs != NULL
   4070       && elf_section_data (sec)->relocs != internal_relocs)
   4071     free (internal_relocs);
   4072 
   4073   if (contents != NULL
   4074       && elf_section_data (sec)->this_hdr.contents != (unsigned char *) contents)
   4075     free (contents);
   4076 
   4077   if (isymbuf != NULL
   4078       && symtab_hdr->contents != (bfd_byte *) isymbuf)
   4079     free (isymbuf);
   4080 
   4081   return result;
   4082 
   4083  error_return:
   4084   result = FALSE;
   4085   goto finish;
   4086 }
   4087 
   4088 static const struct bfd_elf_special_section v850_elf_special_sections[] =
   4089 {
   4090   { STRING_COMMA_LEN (".call_table_data"), 0, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE) },
   4091   { STRING_COMMA_LEN (".call_table_text"), 0, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
   4092 								 + SHF_EXECINSTR) },
   4093   { STRING_COMMA_LEN (".rosdata"),        -2, SHT_PROGBITS,     (SHF_ALLOC
   4094 								 + SHF_V850_GPREL) },
   4095   { STRING_COMMA_LEN (".rozdata"),        -2, SHT_PROGBITS,     (SHF_ALLOC
   4096 								 + SHF_V850_R0REL) },
   4097   { STRING_COMMA_LEN (".sbss"),           -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
   4098 								 + SHF_V850_GPREL) },
   4099   { STRING_COMMA_LEN (".scommon"),        -2, SHT_V850_SCOMMON, (SHF_ALLOC + SHF_WRITE
   4100 								 + SHF_V850_GPREL) },
   4101   { STRING_COMMA_LEN (".sdata"),          -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
   4102 								 + SHF_V850_GPREL) },
   4103   { STRING_COMMA_LEN (".tbss"),           -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
   4104 								 + SHF_V850_EPREL) },
   4105   { STRING_COMMA_LEN (".tcommon"),        -2, SHT_V850_TCOMMON, (SHF_ALLOC + SHF_WRITE
   4106 								 + SHF_V850_R0REL) },
   4107   { STRING_COMMA_LEN (".tdata"),          -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
   4108 								 + SHF_V850_EPREL) },
   4109   { STRING_COMMA_LEN (".zbss"),           -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
   4110 								 + SHF_V850_R0REL) },
   4111   { STRING_COMMA_LEN (".zcommon"),        -2, SHT_V850_ZCOMMON, (SHF_ALLOC + SHF_WRITE
   4112 								 + SHF_V850_R0REL) },
   4113   { STRING_COMMA_LEN (".zdata"),          -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
   4114 								 + SHF_V850_R0REL) },
   4115   { NULL,                     0,           0, 0,                0 }
   4116 };
   4117 
   4118 #define TARGET_LITTLE_SYM			v850_elf32_vec
   4120 #define TARGET_LITTLE_NAME			"elf32-v850"
   4121 #define ELF_ARCH				bfd_arch_v850
   4122 #define ELF_MACHINE_CODE			EM_V850
   4123 #define ELF_MACHINE_ALT1			EM_CYGNUS_V850
   4124 #define ELF_MAXPAGESIZE				0x1000
   4125 
   4126 #define elf_info_to_howto			v850_elf_info_to_howto_rela
   4127 #define elf_info_to_howto_rel			v850_elf_info_to_howto_rel
   4128 
   4129 #define elf_backend_check_relocs		v850_elf_check_relocs
   4130 #define elf_backend_relocate_section    	v850_elf_relocate_section
   4131 #define elf_backend_object_p			v850_elf_object_p
   4132 #define elf_backend_final_write_processing 	v850_elf_final_write_processing
   4133 #define elf_backend_section_from_bfd_section 	v850_elf_section_from_bfd_section
   4134 #define elf_backend_symbol_processing		v850_elf_symbol_processing
   4135 #define elf_backend_add_symbol_hook		v850_elf_add_symbol_hook
   4136 #define elf_backend_link_output_symbol_hook 	v850_elf_link_output_symbol_hook
   4137 #define elf_backend_section_from_shdr		v850_elf_section_from_shdr
   4138 #define elf_backend_fake_sections		v850_elf_fake_sections
   4139 #define elf_backend_gc_mark_hook                v850_elf_gc_mark_hook
   4140 #define elf_backend_special_sections		v850_elf_special_sections
   4141 
   4142 #define elf_backend_can_gc_sections 		1
   4143 #define elf_backend_rela_normal			1
   4144 
   4145 #define bfd_elf32_bfd_is_local_label_name	v850_elf_is_local_label_name
   4146 #define bfd_elf32_bfd_is_target_special_symbol	v850_elf_is_target_special_symbol
   4147 
   4148 #define bfd_elf32_bfd_reloc_type_lookup		v850_elf_reloc_type_lookup
   4149 #define bfd_elf32_bfd_reloc_name_lookup	        v850_elf_reloc_name_lookup
   4150 #define bfd_elf32_bfd_merge_private_bfd_data 	v850_elf_merge_private_bfd_data
   4151 #define bfd_elf32_bfd_set_private_flags		v850_elf_set_private_flags
   4152 #define bfd_elf32_bfd_print_private_bfd_data	v850_elf_print_private_bfd_data
   4153 #define bfd_elf32_bfd_relax_section		v850_elf_relax_section
   4154 
   4155 #define elf_symbol_leading_char			'_'
   4156 
   4157 #undef  elf32_bed
   4158 #define elf32_bed elf32_v850_bed
   4159 
   4160 #include "elf32-target.h"
   4161 
   4162 /* Map BFD reloc types to V800 ELF reloc types.  */
   4163 
   4164 static const struct v850_elf_reloc_map v800_elf_reloc_map[] =
   4165 {
   4166   { BFD_RELOC_NONE,                   R_V810_NONE    },
   4167   { BFD_RELOC_8,                      R_V810_BYTE    },
   4168   { BFD_RELOC_16,                     R_V810_HWORD   },
   4169   { BFD_RELOC_32,                     R_V810_WORD    },
   4170   { BFD_RELOC_LO16,                   R_V810_WLO     },
   4171   { BFD_RELOC_HI16,                   R_V810_WHI     },
   4172   { BFD_RELOC_HI16_S,                 R_V810_WHI1    },
   4173   { BFD_RELOC_V850_32_PCREL,          R_V850_PC32    },
   4174   { BFD_RELOC_V850_22_PCREL,          R_V850_PCR22   },
   4175   { BFD_RELOC_V850_17_PCREL,          R_V850_PC17    },
   4176   { BFD_RELOC_V850_16_PCREL,          R_V850_PC16U   },
   4177   { BFD_RELOC_V850_9_PCREL,	      R_V850_PC9     },
   4178   { BFD_RELOC_V850_LO16_S1,           R_V810_WLO_1   }, /* Or R_V850_HWLO or R_V850_HWLO_1.  */
   4179   { BFD_RELOC_V850_23,                R_V850_WLO23   },
   4180   { BFD_RELOC_V850_LO16_SPLIT_OFFSET, R_V850_BLO     },
   4181   { BFD_RELOC_V850_ZDA_16_16_OFFSET,  R_V810_HWORD   },
   4182   { BFD_RELOC_V850_TDA_16_16_OFFSET,  R_V810_HWORD   },
   4183   { BFD_RELOC_V850_SDA_16_16_OFFSET,  R_V810_HWORD   },
   4184   { BFD_RELOC_V850_SDA_15_16_OFFSET,  R_V810_GPWLO_1 }
   4185 };
   4186 
   4187 /* Map a bfd relocation into the appropriate howto structure.  */
   4188 
   4189 static reloc_howto_type *
   4190 v800_elf_reloc_type_lookup (bfd * abfd, bfd_reloc_code_real_type code)
   4191 {
   4192   unsigned int i;
   4193 
   4194   BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_v850_rh850);
   4195 
   4196   for (i = ARRAY_SIZE (v800_elf_reloc_map); i --;)
   4197     if (v800_elf_reloc_map[i].bfd_reloc_val == code)
   4198       {
   4199 	unsigned int elf_reloc_val = v800_elf_reloc_map[i].elf_reloc_val;
   4200 	unsigned int idx = elf_reloc_val - R_V810_NONE;
   4201 
   4202 	BFD_ASSERT (v800_elf_howto_table[idx].type == elf_reloc_val);
   4203 
   4204 	return v800_elf_howto_table + idx;
   4205       }
   4206 
   4207 #ifdef DEBUG
   4208   fprintf (stderr, "failed to find v800 equiv of bfd reloc code %d\n", code);
   4209 #endif
   4210   return NULL;
   4211 }
   4212 
   4213 static reloc_howto_type *
   4214 v800_elf_reloc_name_lookup (bfd * abfd, const char * r_name)
   4215 {
   4216   unsigned int i;
   4217 
   4218   BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_v850_rh850);
   4219 
   4220   for (i = ARRAY_SIZE (v800_elf_howto_table); i--;)
   4221     if (v800_elf_howto_table[i].name != NULL
   4222 	&& strcasecmp (v800_elf_howto_table[i].name, r_name) == 0)
   4223       return v800_elf_howto_table + i;
   4224 
   4225   return NULL;
   4226 }
   4227 
   4228 
   4229 /* Set the howto pointer in CACHE_PTR for a V800 ELF reloc.  */
   4230 
   4231 static void
   4232 v800_elf_info_to_howto (bfd *               abfd,
   4233 			arelent *           cache_ptr,
   4234 			Elf_Internal_Rela * dst)
   4235 {
   4236   unsigned int r_type = ELF32_R_TYPE (dst->r_info);
   4237 
   4238   BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_v850_rh850);
   4239 
   4240   BFD_ASSERT (r_type < (unsigned int) R_V800_max);
   4241 
   4242   if (r_type == R_V800_NONE)
   4243     r_type = R_V810_NONE;
   4244 
   4245   BFD_ASSERT (r_type >= (unsigned int) R_V810_NONE);
   4246   r_type -= R_V810_NONE;
   4247   BFD_ASSERT (r_type < ARRAY_SIZE (v800_elf_howto_table));
   4248 
   4249   cache_ptr->howto = v800_elf_howto_table + r_type;
   4250 }
   4251 
   4252 #undef  TARGET_LITTLE_SYM
   4254 #define TARGET_LITTLE_SYM			v800_elf32_vec
   4255 #undef  TARGET_LITTLE_NAME
   4256 #define TARGET_LITTLE_NAME			"elf32-v850-rh850"
   4257 #undef  ELF_ARCH
   4258 #define ELF_ARCH				bfd_arch_v850_rh850
   4259 #undef  ELF_MACHINE_CODE
   4260 #define ELF_MACHINE_CODE			EM_V800
   4261 #undef  ELF_MACHINE_ALT1
   4262 
   4263 #undef  elf32_bed
   4264 #define elf32_bed elf32_v850_rh850_bed
   4265 
   4266 #undef  elf_info_to_howto
   4267 #define elf_info_to_howto			v800_elf_info_to_howto
   4268 #undef  elf_info_to_howto_rel
   4269 #define elf_info_to_howto_rel			NULL
   4270 #undef  bfd_elf32_bfd_reloc_type_lookup
   4271 #define bfd_elf32_bfd_reloc_type_lookup		v800_elf_reloc_type_lookup
   4272 #undef  bfd_elf32_bfd_reloc_name_lookup
   4273 #define bfd_elf32_bfd_reloc_name_lookup		v800_elf_reloc_name_lookup
   4274 
   4275 #include "elf32-target.h"
   4276