Home | History | Annotate | Download | only in bfd
      1 /* V850-specific support for 32-bit ELF
      2    Copyright (C) 1996-2014 Free Software Foundation, Inc.
      3 
      4    This file is part of BFD, the Binary File Descriptor library.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA.  */
     20 
     21 
     22 /* XXX FIXME: This code is littered with 32bit int, 16bit short, 8bit char
     23    dependencies.  As is the gas & simulator code for the v850.  */
     24 
     25 #include "sysdep.h"
     26 #include "bfd.h"
     27 #include "bfdlink.h"
     28 #include "libbfd.h"
     29 #include "elf-bfd.h"
     30 #include "elf/v850.h"
     31 #include "libiberty.h"
     32 
     33 /* Sign-extend a 17-bit number.  */
     34 #define SEXT17(x)	((((x) & 0x1ffff) ^ 0x10000) - 0x10000)
     35 
     36 /* Sign-extend a 22-bit number.  */
     37 #define SEXT22(x)	((((x) & 0x3fffff) ^ 0x200000) - 0x200000)
     38 
     39 static reloc_howto_type v850_elf_howto_table[];
     40 
     41 /* Look through the relocs for a section during the first phase, and
     42    allocate space in the global offset table or procedure linkage
     43    table.  */
     44 
     45 static bfd_boolean
     46 v850_elf_check_relocs (bfd *abfd,
     47 		       struct bfd_link_info *info,
     48 		       asection *sec,
     49 		       const Elf_Internal_Rela *relocs)
     50 {
     51   bfd_boolean ret = TRUE;
     52   Elf_Internal_Shdr *symtab_hdr;
     53   struct elf_link_hash_entry **sym_hashes;
     54   const Elf_Internal_Rela *rel;
     55   const Elf_Internal_Rela *rel_end;
     56   unsigned int r_type;
     57   int other = 0;
     58   const char *common = NULL;
     59 
     60   if (info->relocatable)
     61     return TRUE;
     62 
     63 #ifdef DEBUG
     64   _bfd_error_handler ("v850_elf_check_relocs called for section %A in %B",
     65 		      sec, abfd);
     66 #endif
     67 
     68   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
     69   sym_hashes = elf_sym_hashes (abfd);
     70 
     71   rel_end = relocs + sec->reloc_count;
     72   for (rel = relocs; rel < rel_end; rel++)
     73     {
     74       unsigned long r_symndx;
     75       struct elf_link_hash_entry *h;
     76 
     77       r_symndx = ELF32_R_SYM (rel->r_info);
     78       if (r_symndx < symtab_hdr->sh_info)
     79 	h = NULL;
     80       else
     81 	{
     82 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
     83 	  while (h->root.type == bfd_link_hash_indirect
     84 		 || h->root.type == bfd_link_hash_warning)
     85 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
     86 
     87 	  /* PR15323, ref flags aren't set for references in the same
     88 	     object.  */
     89 	  h->root.non_ir_ref = 1;
     90 	}
     91 
     92       r_type = ELF32_R_TYPE (rel->r_info);
     93       switch (r_type)
     94 	{
     95 	default:
     96 	  break;
     97 
     98         /* This relocation describes the C++ object vtable hierarchy.
     99            Reconstruct it for later use during GC.  */
    100         case R_V850_GNU_VTINHERIT:
    101           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
    102             return FALSE;
    103           break;
    104 
    105         /* This relocation describes which C++ vtable entries
    106 	   are actually used.  Record for later use during GC.  */
    107         case R_V850_GNU_VTENTRY:
    108           BFD_ASSERT (h != NULL);
    109           if (h != NULL
    110               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
    111             return FALSE;
    112           break;
    113 
    114 	case R_V850_SDA_16_16_SPLIT_OFFSET:
    115 	case R_V850_SDA_16_16_OFFSET:
    116 	case R_V850_SDA_15_16_OFFSET:
    117 	case R_V810_GPWLO_1:
    118 	case R_V850_HWLO:
    119 	case R_V850_HWLO_1:
    120 	  other = V850_OTHER_SDA;
    121 	  common = ".scommon";
    122 	  goto small_data_common;
    123 
    124 	case R_V850_ZDA_16_16_SPLIT_OFFSET:
    125 	case R_V850_ZDA_16_16_OFFSET:
    126 	case R_V850_ZDA_15_16_OFFSET:
    127 	  other = V850_OTHER_ZDA;
    128 	  common = ".zcommon";
    129 	  goto small_data_common;
    130 
    131 	case R_V850_TDA_4_4_OFFSET:
    132 	case R_V850_TDA_4_5_OFFSET:
    133 	case R_V850_TDA_7_7_OFFSET:
    134 	case R_V850_TDA_6_8_OFFSET:
    135 	case R_V850_TDA_7_8_OFFSET:
    136 	case R_V850_TDA_16_16_OFFSET:
    137 	  other = V850_OTHER_TDA;
    138 	  common = ".tcommon";
    139 	  /* fall through */
    140 
    141 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
    142 
    143 	small_data_common:
    144 	  if (h)
    145 	    {
    146 	      /* Flag which type of relocation was used.  */
    147 	      h->other |= other;
    148 	      if ((h->other & V850_OTHER_MASK) != (other & V850_OTHER_MASK)
    149 		  && (h->other & V850_OTHER_ERROR) == 0)
    150 		{
    151 		  const char * msg;
    152 		  static char  buff[200]; /* XXX */
    153 
    154 		  switch (h->other & V850_OTHER_MASK)
    155 		    {
    156 		    default:
    157 		      msg = _("Variable `%s' cannot occupy in multiple small data regions");
    158 		      break;
    159 		    case V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA:
    160 		      msg = _("Variable `%s' can only be in one of the small, zero, and tiny data regions");
    161 		      break;
    162 		    case V850_OTHER_SDA | V850_OTHER_ZDA:
    163 		      msg = _("Variable `%s' cannot be in both small and zero data regions simultaneously");
    164 		      break;
    165 		    case V850_OTHER_SDA | V850_OTHER_TDA:
    166 		      msg = _("Variable `%s' cannot be in both small and tiny data regions simultaneously");
    167 		      break;
    168 		    case V850_OTHER_ZDA | V850_OTHER_TDA:
    169 		      msg = _("Variable `%s' cannot be in both zero and tiny data regions simultaneously");
    170 		      break;
    171 		    }
    172 
    173 		  sprintf (buff, msg, h->root.root.string);
    174 		  info->callbacks->warning (info, buff, h->root.root.string,
    175 					    abfd, h->root.u.def.section,
    176 					    (bfd_vma) 0);
    177 
    178 		  bfd_set_error (bfd_error_bad_value);
    179 		  h->other |= V850_OTHER_ERROR;
    180 		  ret = FALSE;
    181 		}
    182 	    }
    183 
    184 	  if (h && h->root.type == bfd_link_hash_common
    185 	      && h->root.u.c.p
    186 	      && !strcmp (bfd_get_section_name (abfd, h->root.u.c.p->section), "COMMON"))
    187 	    {
    188 	      asection * section;
    189 
    190 	      section = h->root.u.c.p->section = bfd_make_section_old_way (abfd, common);
    191 	      section->flags |= SEC_IS_COMMON;
    192 	    }
    193 
    194 #ifdef DEBUG
    195 	  fprintf (stderr, "v850_elf_check_relocs, found %s relocation for %s%s\n",
    196 		   v850_elf_howto_table[ (int)r_type ].name,
    197 		   (h && h->root.root.string) ? h->root.root.string : "<unknown>",
    198 		   (h->root.type == bfd_link_hash_common) ? ", symbol is common" : "");
    199 #endif
    200 	  break;
    201 	}
    202     }
    203 
    204   return ret;
    205 }
    206 
    207 /* In the old version, when an entry was checked out from the table,
    208    it was deleted.  This produced an error if the entry was needed
    209    more than once, as the second attempted retry failed.
    210 
    211    In the current version, the entry is not deleted, instead we set
    212    the field 'found' to TRUE.  If a second lookup matches the same
    213    entry, then we know that the hi16s reloc has already been updated
    214    and does not need to be updated a second time.
    215 
    216    TODO - TOFIX: If it is possible that we need to restore 2 different
    217    addresses from the same table entry, where the first generates an
    218    overflow, whilst the second do not, then this code will fail.  */
    219 
    220 typedef struct hi16s_location
    221 {
    222   bfd_vma                 addend;
    223   bfd_byte *              address;
    224   unsigned long           counter;
    225   bfd_boolean             found;
    226   struct hi16s_location * next;
    227 }
    228 hi16s_location;
    229 
    230 static hi16s_location * previous_hi16s;
    231 static hi16s_location * free_hi16s;
    232 static unsigned long    hi16s_counter;
    233 
    234 static void
    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, "reloc number %d not recognised\n", r_type);
    498 #endif
    499       return bfd_reloc_notsupported;
    500 
    501     case R_V850_REL32:
    502     case R_V850_ABS32:
    503     case R_V810_WORD:
    504     case R_V850_PC32:
    505       bfd_put_32 (abfd, addend, address);
    506       return bfd_reloc_ok;
    507 
    508     case R_V850_WLO23:
    509     case R_V850_23:
    510       insn  = bfd_get_32 (abfd, address);
    511       insn &= ~((0x7f << 4) | (0x7fff80 << (16-7)));
    512       insn |= ((addend & 0x7f) << 4) | ((addend & 0x7fff80) << (16-7));
    513       bfd_put_32 (abfd, (bfd_vma) insn, address);
    514       return bfd_reloc_ok;
    515 
    516     case R_V850_PCR22:
    517     case R_V850_22_PCREL:
    518       if (saddend > 0x1fffff || saddend < -0x200000)
    519 	return bfd_reloc_overflow;
    520 
    521       if ((addend % 2) != 0)
    522 	return bfd_reloc_dangerous;
    523 
    524       insn  = bfd_get_32 (abfd, address);
    525       insn &= ~0xfffe003f;
    526       insn |= (((addend & 0xfffe) << 16) | ((addend & 0x3f0000) >> 16));
    527       bfd_put_32 (abfd, (bfd_vma) insn, address);
    528       return bfd_reloc_ok;
    529 
    530     case R_V850_PC17:
    531     case R_V850_17_PCREL:
    532       if (saddend > 0xffff || saddend < -0x10000)
    533 	return bfd_reloc_overflow;
    534 
    535       if ((addend % 2) != 0)
    536 	return bfd_reloc_dangerous;
    537 
    538       insn  = bfd_get_32 (abfd, address);
    539       insn &= ~ 0xfffe0010;
    540       insn |= ((addend & 0xfffe) << 16) | ((addend & 0x10000) >> (16-4));
    541       break;
    542 
    543     case R_V850_PC16U:
    544     case R_V850_16_PCREL:
    545       if ((saddend < -0xffff) || (saddend > 0))
    546 	return bfd_reloc_overflow;
    547 
    548       if ((addend % 2) != 0)
    549 	return bfd_reloc_dangerous;
    550 
    551       insn  = bfd_get_16 (abfd, address);
    552       insn &= ~0xfffe;
    553       insn |= (-addend & 0xfffe);
    554       break;
    555 
    556     case R_V850_PC9:
    557     case R_V850_9_PCREL:
    558       if (saddend > 0xff || saddend < -0x100)
    559 	return bfd_reloc_overflow;
    560 
    561       if ((addend % 2) != 0)
    562 	return bfd_reloc_dangerous;
    563 
    564       insn  = bfd_get_16 (abfd, address);
    565       insn &= ~ 0xf870;
    566       insn |= ((addend & 0x1f0) << 7) | ((addend & 0x0e) << 3);
    567       break;
    568 
    569     case R_V810_WHI:
    570     case R_V850_HI16:
    571       addend += (bfd_get_16 (abfd, address) << 16);
    572       addend = (addend >> 16);
    573       insn = addend;
    574       break;
    575 
    576     case R_V810_WHI1:
    577     case R_V850_HI16_S:
    578       /* Remember where this relocation took place.  */
    579       remember_hi16s_reloc (abfd, addend, address);
    580 
    581       addend += (bfd_get_16 (abfd, address) << 16);
    582       addend = (addend >> 16) + ((addend & 0x8000) != 0);
    583 
    584       /* This relocation cannot overflow.  */
    585       if (addend > 0xffff)
    586 	addend = 0;
    587 
    588       insn = addend;
    589       break;
    590 
    591     case R_V810_WLO:
    592     case R_V850_LO16:
    593       insn = bfd_get_16 (abfd, address);
    594       if (! v850_elf_perform_lo16_relocation (abfd, &insn, addend))
    595 	return bfd_reloc_overflow;
    596       break;
    597 
    598     case R_V810_BYTE:
    599     case R_V850_8:
    600       addend += (char) bfd_get_8 (abfd, address);
    601 
    602       saddend = (bfd_signed_vma) addend;
    603 
    604       if (saddend > 0x7f || saddend < -0x80)
    605 	return bfd_reloc_overflow;
    606 
    607       bfd_put_8 (abfd, addend, address);
    608       return bfd_reloc_ok;
    609 
    610     case R_V850_CALLT_16_16_OFFSET:
    611       addend += bfd_get_16 (abfd, address);
    612 
    613       saddend = (bfd_signed_vma) addend;
    614 
    615       if (saddend > 0xffff || saddend < 0)
    616 	return bfd_reloc_overflow;
    617 
    618       insn = addend;
    619       break;
    620 
    621     case R_V850_CALLT_15_16_OFFSET:
    622       insn = bfd_get_16 (abfd, address);
    623 
    624       addend += insn & 0xfffe;
    625 
    626       saddend = (bfd_signed_vma) addend;
    627 
    628       if (saddend > 0xffff || saddend < 0)
    629 	return bfd_reloc_overflow;
    630 
    631       insn = (0xfffe & addend)
    632 	| (insn & ~0xfffe);
    633       break;
    634 
    635     case R_V850_CALLT_6_7_OFFSET:
    636       insn = bfd_get_16 (abfd, address);
    637       addend += ((insn & 0x3f) << 1);
    638 
    639       saddend = (bfd_signed_vma) addend;
    640 
    641       if (saddend > 0x7e || saddend < 0)
    642 	return bfd_reloc_overflow;
    643 
    644       if (addend & 1)
    645 	return bfd_reloc_dangerous;
    646 
    647       insn &= 0xff80;
    648       insn |= (addend >> 1);
    649       break;
    650 
    651     case R_V850_16:
    652     case R_V810_HWORD:
    653     case R_V850_SDA_16_16_OFFSET:
    654     case R_V850_ZDA_16_16_OFFSET:
    655     case R_V850_TDA_16_16_OFFSET:
    656       addend += bfd_get_16 (abfd, address);
    657 
    658       saddend = (bfd_signed_vma) addend;
    659 
    660       if (saddend > 0x7fff || saddend < -0x8000)
    661 	return bfd_reloc_overflow;
    662 
    663       insn = addend;
    664       break;
    665 
    666     case R_V850_16_S1:
    667     case R_V850_SDA_15_16_OFFSET:
    668     case R_V850_ZDA_15_16_OFFSET:
    669     case R_V810_GPWLO_1:
    670       insn = bfd_get_16 (abfd, address);
    671       addend += (insn & 0xfffe);
    672 
    673       saddend = (bfd_signed_vma) addend;
    674 
    675       if (saddend > 0x7ffe || saddend < -0x8000)
    676 	return bfd_reloc_overflow;
    677 
    678       if (addend & 1)
    679         return bfd_reloc_dangerous;
    680 
    681       insn = (addend &~ (bfd_vma) 1) | (insn & 1);
    682       break;
    683 
    684     case R_V850_TDA_6_8_OFFSET:
    685       insn = bfd_get_16 (abfd, address);
    686       addend += ((insn & 0x7e) << 1);
    687 
    688       saddend = (bfd_signed_vma) addend;
    689 
    690       if (saddend > 0xfc || saddend < 0)
    691 	return bfd_reloc_overflow;
    692 
    693       if (addend & 3)
    694 	return bfd_reloc_dangerous;
    695 
    696       insn &= 0xff81;
    697       insn |= (addend >> 1);
    698       break;
    699 
    700     case R_V850_TDA_7_8_OFFSET:
    701       insn = bfd_get_16 (abfd, address);
    702       addend += ((insn & 0x7f) << 1);
    703 
    704       saddend = (bfd_signed_vma) addend;
    705 
    706       if (saddend > 0xfe || saddend < 0)
    707 	return bfd_reloc_overflow;
    708 
    709       if (addend & 1)
    710 	return bfd_reloc_dangerous;
    711 
    712       insn &= 0xff80;
    713       insn |= (addend >> 1);
    714       break;
    715 
    716     case R_V850_TDA_7_7_OFFSET:
    717       insn = bfd_get_16 (abfd, address);
    718       addend += insn & 0x7f;
    719 
    720       saddend = (bfd_signed_vma) addend;
    721 
    722       if (saddend > 0x7f || saddend < 0)
    723 	return bfd_reloc_overflow;
    724 
    725       insn &= 0xff80;
    726       insn |= addend;
    727       break;
    728 
    729     case R_V850_TDA_4_5_OFFSET:
    730       insn = bfd_get_16 (abfd, address);
    731       addend += ((insn & 0xf) << 1);
    732 
    733       saddend = (bfd_signed_vma) addend;
    734 
    735       if (saddend > 0x1e || saddend < 0)
    736 	return bfd_reloc_overflow;
    737 
    738       if (addend & 1)
    739 	return bfd_reloc_dangerous;
    740 
    741       insn &= 0xfff0;
    742       insn |= (addend >> 1);
    743       break;
    744 
    745     case R_V850_TDA_4_4_OFFSET:
    746       insn = bfd_get_16 (abfd, address);
    747       addend += insn & 0xf;
    748 
    749       saddend = (bfd_signed_vma) addend;
    750 
    751       if (saddend > 0xf || saddend < 0)
    752 	return bfd_reloc_overflow;
    753 
    754       insn &= 0xfff0;
    755       insn |= addend;
    756       break;
    757 
    758     case R_V810_WLO_1:
    759     case R_V850_HWLO:
    760     case R_V850_HWLO_1:
    761     case R_V850_LO16_S1:
    762       insn = bfd_get_16 (abfd, address);
    763       result = insn & 0xfffe;
    764       if (! v850_elf_perform_lo16_relocation (abfd, &result, addend))
    765 	return bfd_reloc_overflow;
    766       if (result & 1)
    767 	return bfd_reloc_overflow;
    768       insn = (result & 0xfffe)
    769 	| (insn & ~0xfffe);
    770 	bfd_put_16 (abfd, insn, address);
    771       return bfd_reloc_ok;
    772 
    773     case R_V850_BLO:
    774     case R_V850_LO16_SPLIT_OFFSET:
    775       insn = bfd_get_32 (abfd, address);
    776       result = ((insn & 0xfffe0000) >> 16) | ((insn & 0x20) >> 5);
    777       if (! v850_elf_perform_lo16_relocation (abfd, &result, addend))
    778 	return bfd_reloc_overflow;
    779       insn = (((result << 16) & 0xfffe0000)
    780 	      | ((result << 5) & 0x20)
    781 	      | (insn & ~0xfffe0020));
    782       bfd_put_32 (abfd, insn, address);
    783       return bfd_reloc_ok;
    784 
    785     case R_V850_16_SPLIT_OFFSET:
    786     case R_V850_SDA_16_16_SPLIT_OFFSET:
    787     case R_V850_ZDA_16_16_SPLIT_OFFSET:
    788       insn = bfd_get_32 (abfd, address);
    789       addend += ((insn & 0xfffe0000) >> 16) + ((insn & 0x20) >> 5);
    790 
    791       saddend = (bfd_signed_vma) addend;
    792 
    793       if (saddend > 0x7fff || saddend < -0x8000)
    794 	return bfd_reloc_overflow;
    795 
    796       insn &= 0x0001ffdf;
    797       insn |= (addend & 1) << 5;
    798       insn |= (addend &~ (bfd_vma) 1) << 16;
    799 
    800       bfd_put_32 (abfd, (bfd_vma) insn, address);
    801       return bfd_reloc_ok;
    802 
    803     case R_V850_GNU_VTINHERIT:
    804     case R_V850_GNU_VTENTRY:
    805       return bfd_reloc_ok;
    806 
    807     }
    808 
    809   bfd_put_16 (abfd, (bfd_vma) insn, address);
    810   return bfd_reloc_ok;
    811 }
    812 
    813 /* Insert the addend into the instruction.  */
    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 	 2,				/* Size (0 = byte, 1 = short, 2 = long).  */
    900 	 32,				/* Bitsize.  */
    901 	 FALSE,				/* PC_relative.  */
    902 	 0,				/* Bitpos.  */
    903 	 complain_overflow_bitfield,	/* 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   BFD_ASSERT (r_type < (unsigned int) R_V850_max);
   1903   cache_ptr->howto = &v850_elf_howto_table[r_type];
   1904 }
   1905 
   1906 /* Set the howto pointer for a V850 ELF reloc (type RELA).  */
   1907 
   1908 static void
   1909 v850_elf_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
   1910 			     arelent * cache_ptr,
   1911 			     Elf_Internal_Rela *dst)
   1912 {
   1913   unsigned int r_type;
   1914 
   1915   r_type = ELF32_R_TYPE (dst->r_info);
   1916   BFD_ASSERT (r_type < (unsigned int) R_V850_max);
   1917   cache_ptr->howto = &v850_elf_howto_table[r_type];
   1918 }
   1919 
   1920 static bfd_boolean
   1922 v850_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
   1923 {
   1924   return (   (name[0] == '.' && (name[1] == 'L' || name[1] == '.'))
   1925 	  || (name[0] == '_' &&  name[1] == '.' && name[2] == 'L' && name[3] == '_'));
   1926 }
   1927 
   1928 static bfd_boolean
   1929 v850_elf_is_target_special_symbol (bfd *abfd, asymbol *sym)
   1930 {
   1931   return v850_elf_is_local_label_name (abfd, sym->name);
   1932 }
   1933 
   1934 /* We overload some of the bfd_reloc error codes for own purposes.  */
   1936 #define bfd_reloc_gp_not_found		bfd_reloc_other
   1937 #define bfd_reloc_ep_not_found		bfd_reloc_continue
   1938 #define bfd_reloc_ctbp_not_found	(bfd_reloc_dangerous + 1)
   1939 
   1940 /* Perform a relocation as part of a final link.  */
   1941 
   1942 static bfd_reloc_status_type
   1943 v850_elf_final_link_relocate (reloc_howto_type *howto,
   1944 			      bfd *input_bfd,
   1945 			      bfd *output_bfd ATTRIBUTE_UNUSED,
   1946 			      asection *input_section,
   1947 			      bfd_byte *contents,
   1948 			      bfd_vma offset,
   1949 			      bfd_vma value,
   1950 			      bfd_vma addend,
   1951 			      struct bfd_link_info *info,
   1952 			      asection *sym_sec,
   1953 			      int is_local ATTRIBUTE_UNUSED)
   1954 {
   1955   unsigned int r_type = howto->type;
   1956   bfd_byte *hit_data = contents + offset;
   1957 
   1958   /* Adjust the value according to the relocation.  */
   1959   switch (r_type)
   1960     {
   1961     case R_V850_PC9:
   1962     case R_V850_9_PCREL:
   1963       value -= (input_section->output_section->vma
   1964 		+ input_section->output_offset);
   1965       value -= offset;
   1966       break;
   1967 
   1968     case R_V850_PC16U:
   1969     case R_V850_16_PCREL:
   1970       value -= (input_section->output_section->vma
   1971 		+ input_section->output_offset
   1972 		+ offset);
   1973 
   1974       /* If the sign extension will corrupt the value then we have overflowed.  */
   1975       if ((value & 0xffff0000) != 0xffff0000)
   1976 	return bfd_reloc_overflow;
   1977 
   1978       break;
   1979 
   1980     case R_V850_PC17:
   1981     case R_V850_17_PCREL:
   1982       value -= (input_section->output_section->vma
   1983 		+ input_section->output_offset
   1984 		+ offset);
   1985 
   1986       /* If the sign extension will corrupt the value then we have overflowed.  */
   1987       if (((value & 0xffff0000) != 0x0) && ((value & 0xffff0000) != 0xffff0000))
   1988 	return bfd_reloc_overflow;
   1989 
   1990       value = SEXT17 (value);
   1991       break;
   1992 
   1993     case R_V850_PCR22:
   1994     case R_V850_22_PCREL:
   1995       value -= (input_section->output_section->vma
   1996 		+ input_section->output_offset
   1997 		+ offset);
   1998 
   1999       /* If the sign extension will corrupt the value then we have overflowed.  */
   2000       if (((value & 0xffe00000) != 0x0) && ((value & 0xffe00000) != 0xffe00000))
   2001 	return bfd_reloc_overflow;
   2002 
   2003       /* Only the bottom 22 bits of the PC are valid.  */
   2004       value = SEXT22 (value);
   2005       break;
   2006 
   2007     case R_V850_PC32:
   2008     case R_V850_32_PCREL:
   2009       value -= (input_section->output_section->vma
   2010 		+ input_section->output_offset
   2011 		+ offset);
   2012       break;
   2013 
   2014     case R_V850_32_ABS:
   2015     case R_V850_23:
   2016     case R_V850_HI16_S:
   2017     case R_V850_HI16:
   2018     case R_V850_LO16:
   2019     case R_V850_LO16_S1:
   2020     case R_V850_LO16_SPLIT_OFFSET:
   2021     case R_V850_16:
   2022     case R_V850_ABS32:
   2023     case R_V850_8:
   2024     case R_V810_BYTE:
   2025     case R_V810_HWORD:
   2026     case R_V810_WORD:
   2027     case R_V810_WLO:
   2028     case R_V810_WHI:
   2029     case R_V810_WHI1:
   2030     case R_V810_WLO_1:
   2031     case R_V850_WLO23:
   2032     case R_V850_BLO:
   2033       break;
   2034 
   2035     case R_V850_ZDA_15_16_OFFSET:
   2036     case R_V850_ZDA_16_16_OFFSET:
   2037     case R_V850_ZDA_16_16_SPLIT_OFFSET:
   2038       if (sym_sec == NULL)
   2039 	return bfd_reloc_undefined;
   2040 
   2041       value -= sym_sec->output_section->vma;
   2042       break;
   2043 
   2044     case R_V850_SDA_15_16_OFFSET:
   2045     case R_V850_SDA_16_16_OFFSET:
   2046     case R_V850_SDA_16_16_SPLIT_OFFSET:
   2047     case R_V810_GPWLO_1:
   2048       {
   2049 	unsigned long                gp;
   2050 	struct bfd_link_hash_entry * h;
   2051 
   2052 	if (sym_sec == NULL)
   2053 	  return bfd_reloc_undefined;
   2054 
   2055 	/* Get the value of __gp.  */
   2056 	h = bfd_link_hash_lookup (info->hash, "__gp", FALSE, FALSE, TRUE);
   2057 	if (h == NULL
   2058 	    || h->type != bfd_link_hash_defined)
   2059 	  return bfd_reloc_gp_not_found;
   2060 
   2061 	gp = (h->u.def.value
   2062 	      + h->u.def.section->output_section->vma
   2063 	      + h->u.def.section->output_offset);
   2064 
   2065 	value -= sym_sec->output_section->vma;
   2066 	value -= (gp - sym_sec->output_section->vma);
   2067       }
   2068     break;
   2069 
   2070     case R_V850_TDA_4_4_OFFSET:
   2071     case R_V850_TDA_4_5_OFFSET:
   2072     case R_V850_TDA_7_7_OFFSET:
   2073     case R_V850_TDA_7_8_OFFSET:
   2074     case R_V850_TDA_6_8_OFFSET:
   2075     case R_V850_TDA_16_16_OFFSET:
   2076       {
   2077 	unsigned long                ep;
   2078 	struct bfd_link_hash_entry * h;
   2079 
   2080 	/* Get the value of __ep.  */
   2081 	h = bfd_link_hash_lookup (info->hash, "__ep", FALSE, FALSE, TRUE);
   2082 	if (h == NULL
   2083 	    || h->type != bfd_link_hash_defined)
   2084 	  return bfd_reloc_ep_not_found;
   2085 
   2086 	ep = (h->u.def.value
   2087 	      + h->u.def.section->output_section->vma
   2088 	      + h->u.def.section->output_offset);
   2089 
   2090 	value -= ep;
   2091       }
   2092     break;
   2093 
   2094     case R_V850_CALLT_6_7_OFFSET:
   2095       {
   2096 	unsigned long                ctbp;
   2097 	struct bfd_link_hash_entry * h;
   2098 
   2099 	/* Get the value of __ctbp.  */
   2100 	h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
   2101 	if (h == NULL
   2102 	    || h->type != bfd_link_hash_defined)
   2103 	  return bfd_reloc_ctbp_not_found;
   2104 
   2105 	ctbp = (h->u.def.value
   2106 	      + h->u.def.section->output_section->vma
   2107 	      + h->u.def.section->output_offset);
   2108 	value -= ctbp;
   2109       }
   2110     break;
   2111 
   2112     case R_V850_CALLT_15_16_OFFSET:
   2113     case R_V850_CALLT_16_16_OFFSET:
   2114       {
   2115 	unsigned long                ctbp;
   2116 	struct bfd_link_hash_entry * h;
   2117 
   2118 	if (sym_sec == NULL)
   2119 	  return bfd_reloc_undefined;
   2120 
   2121 	/* Get the value of __ctbp.  */
   2122 	h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
   2123 	if (h == NULL
   2124 	    || h->type != bfd_link_hash_defined)
   2125 	  return bfd_reloc_ctbp_not_found;
   2126 
   2127 	ctbp = (h->u.def.value
   2128 	      + h->u.def.section->output_section->vma
   2129 	      + h->u.def.section->output_offset);
   2130 
   2131 	value -= sym_sec->output_section->vma;
   2132 	value -= (ctbp - sym_sec->output_section->vma);
   2133       }
   2134     break;
   2135 
   2136     case R_V850_NONE:
   2137     case R_V810_NONE:
   2138     case R_V850_GNU_VTINHERIT:
   2139     case R_V850_GNU_VTENTRY:
   2140     case R_V850_LONGCALL:
   2141     case R_V850_LONGJUMP:
   2142     case R_V850_ALIGN:
   2143       return bfd_reloc_ok;
   2144 
   2145     default:
   2146 #ifdef DEBUG
   2147       fprintf (stderr, "reloc number %d not recognised\n", r_type);
   2148 #endif
   2149       return bfd_reloc_notsupported;
   2150     }
   2151 
   2152   /* Perform the relocation.  */
   2153   return v850_elf_perform_relocation (input_bfd, r_type, value + addend, hit_data);
   2154 }
   2155 
   2156 /* Relocate an V850 ELF section.  */
   2158 
   2159 static bfd_boolean
   2160 v850_elf_relocate_section (bfd *output_bfd,
   2161 			   struct bfd_link_info *info,
   2162 			   bfd *input_bfd,
   2163 			   asection *input_section,
   2164 			   bfd_byte *contents,
   2165 			   Elf_Internal_Rela *relocs,
   2166 			   Elf_Internal_Sym *local_syms,
   2167 			   asection **local_sections)
   2168 {
   2169   Elf_Internal_Shdr *symtab_hdr;
   2170   struct elf_link_hash_entry **sym_hashes;
   2171   Elf_Internal_Rela *rel;
   2172   Elf_Internal_Rela *relend;
   2173 
   2174   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
   2175   sym_hashes = elf_sym_hashes (input_bfd);
   2176 
   2177   /* Reset the list of remembered HI16S relocs to empty.  */
   2178   free_hi16s     = previous_hi16s;
   2179   previous_hi16s = NULL;
   2180   hi16s_counter  = 0;
   2181 
   2182   rel    = relocs;
   2183   relend = relocs + input_section->reloc_count;
   2184   for (; rel < relend; rel++)
   2185     {
   2186       unsigned int r_type;
   2187       reloc_howto_type *howto;
   2188       unsigned long r_symndx;
   2189       Elf_Internal_Sym *sym;
   2190       asection *sec;
   2191       struct elf_link_hash_entry *h;
   2192       bfd_vma relocation;
   2193       bfd_reloc_status_type r;
   2194 
   2195       r_symndx = ELF32_R_SYM (rel->r_info);
   2196       r_type   = ELF32_R_TYPE (rel->r_info);
   2197 
   2198       if (r_type == R_V850_GNU_VTENTRY
   2199           || r_type == R_V850_GNU_VTINHERIT)
   2200         continue;
   2201 
   2202       if (bfd_get_arch (input_bfd) == bfd_arch_v850_rh850)
   2203 	howto = v800_elf_howto_table + (r_type - R_V810_NONE);
   2204       else
   2205 	howto = v850_elf_howto_table + r_type;
   2206 
   2207       BFD_ASSERT (r_type == howto->type);
   2208 
   2209       h = NULL;
   2210       sym = NULL;
   2211       sec = NULL;
   2212       if (r_symndx < symtab_hdr->sh_info)
   2213 	{
   2214 	  sym = local_syms + r_symndx;
   2215 	  sec = local_sections[r_symndx];
   2216 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   2217 	}
   2218       else
   2219 	{
   2220 	  bfd_boolean unresolved_reloc, warned, ignored;
   2221 
   2222 	  /* Note - this check is delayed until now as it is possible and
   2223 	     valid to have a file without any symbols but with relocs that
   2224 	     can be processed.  */
   2225 	  if (sym_hashes == NULL)
   2226 	    {
   2227 	      info->callbacks->warning
   2228 		(info, "no hash table available",
   2229 		 NULL, input_bfd, input_section, (bfd_vma) 0);
   2230 
   2231 	      return FALSE;
   2232 	    }
   2233 
   2234 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   2235 				   r_symndx, symtab_hdr, sym_hashes,
   2236 				   h, sec, relocation,
   2237 				   unresolved_reloc, warned, ignored);
   2238 	}
   2239 
   2240       if (sec != NULL && discarded_section (sec))
   2241 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   2242 					 rel, 1, relend, howto, 0, contents);
   2243 
   2244       if (info->relocatable)
   2245 	continue;
   2246 
   2247       /* FIXME: We should use the addend, but the COFF relocations don't.  */
   2248       r = v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
   2249 					input_section,
   2250 					contents, rel->r_offset,
   2251 					relocation, rel->r_addend,
   2252 					info, sec, h == NULL);
   2253 
   2254       if (r != bfd_reloc_ok)
   2255 	{
   2256 	  const char * name;
   2257 	  const char * msg = NULL;
   2258 
   2259 	  if (h != NULL)
   2260 	    name = h->root.root.string;
   2261 	  else
   2262 	    {
   2263 	      name = (bfd_elf_string_from_elf_section
   2264 		      (input_bfd, symtab_hdr->sh_link, sym->st_name));
   2265 	      if (name == NULL || *name == '\0')
   2266 		name = bfd_section_name (input_bfd, sec);
   2267 	    }
   2268 
   2269 	  switch ((int) r)
   2270 	    {
   2271 	    case bfd_reloc_overflow:
   2272 	      if (! ((*info->callbacks->reloc_overflow)
   2273 		     (info, (h ? &h->root : NULL), name, howto->name,
   2274 		      (bfd_vma) 0, input_bfd, input_section,
   2275 		      rel->r_offset)))
   2276 		return FALSE;
   2277 	      break;
   2278 
   2279 	    case bfd_reloc_undefined:
   2280 	      if (! ((*info->callbacks->undefined_symbol)
   2281 		     (info, name, input_bfd, input_section,
   2282 		      rel->r_offset, TRUE)))
   2283 		return FALSE;
   2284 	      break;
   2285 
   2286 	    case bfd_reloc_outofrange:
   2287 	      msg = _("internal error: out of range error");
   2288 	      goto common_error;
   2289 
   2290 	    case bfd_reloc_notsupported:
   2291 	      msg = _("internal error: unsupported relocation error");
   2292 	      goto common_error;
   2293 
   2294 	    case bfd_reloc_dangerous:
   2295 	      msg = _("internal error: dangerous relocation");
   2296 	      goto common_error;
   2297 
   2298 	    case bfd_reloc_gp_not_found:
   2299 	      msg = _("could not locate special linker symbol __gp");
   2300 	      goto common_error;
   2301 
   2302 	    case bfd_reloc_ep_not_found:
   2303 	      msg = _("could not locate special linker symbol __ep");
   2304 	      goto common_error;
   2305 
   2306 	    case bfd_reloc_ctbp_not_found:
   2307 	      msg = _("could not locate special linker symbol __ctbp");
   2308 	      goto common_error;
   2309 
   2310 	    default:
   2311 	      msg = _("internal error: unknown error");
   2312 	      /* fall through */
   2313 
   2314 	    common_error:
   2315 	      if (!((*info->callbacks->warning)
   2316 		    (info, msg, name, input_bfd, input_section,
   2317 		     rel->r_offset)))
   2318 		return FALSE;
   2319 	      break;
   2320 	    }
   2321 	}
   2322     }
   2323 
   2324   return TRUE;
   2325 }
   2326 
   2327 static asection *
   2328 v850_elf_gc_mark_hook (asection *sec,
   2329 		       struct bfd_link_info *info,
   2330 		       Elf_Internal_Rela *rel,
   2331 		       struct elf_link_hash_entry *h,
   2332 		       Elf_Internal_Sym *sym)
   2333 {
   2334   if (h != NULL)
   2335     switch (ELF32_R_TYPE (rel->r_info))
   2336       {
   2337       case R_V850_GNU_VTINHERIT:
   2338       case R_V850_GNU_VTENTRY:
   2339 	return NULL;
   2340       }
   2341 
   2342   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
   2343 }
   2344 
   2345 /* Set the right machine number and architecture.  */
   2346 
   2347 static bfd_boolean
   2348 v850_elf_object_p (bfd *abfd)
   2349 {
   2350   enum bfd_architecture arch;
   2351   unsigned long mach;
   2352 
   2353   switch (elf_elfheader (abfd)->e_machine)
   2354     {
   2355     case EM_V800:
   2356       arch = bfd_arch_v850_rh850;
   2357       mach = (elf_elfheader (abfd)->e_flags & EF_V800_850E3)
   2358 	? bfd_mach_v850e3v5 : bfd_mach_v850e2v3;
   2359       break;
   2360 
   2361     case EM_CYGNUS_V850:
   2362     case EM_V850:
   2363       arch = bfd_arch_v850;
   2364       switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
   2365 	{
   2366 	default:
   2367 	case E_V850_ARCH:     mach = bfd_mach_v850; break;
   2368 	case E_V850E_ARCH:    mach = bfd_mach_v850e; break;
   2369 	case E_V850E1_ARCH:   mach = bfd_mach_v850e1; break;
   2370 	case E_V850E2_ARCH:   mach = bfd_mach_v850e2; break;
   2371 	case E_V850E2V3_ARCH: mach = bfd_mach_v850e2v3; break;
   2372 	case E_V850E3V5_ARCH: mach = bfd_mach_v850e3v5; break;
   2373 	}
   2374       break;
   2375 
   2376     default:
   2377       return FALSE;
   2378     }
   2379 
   2380   return bfd_default_set_arch_mach (abfd, arch, mach);
   2381 }
   2382 
   2383 /* Store the machine number in the flags field.  */
   2384 
   2385 static void
   2386 v850_elf_final_write_processing (bfd *abfd,
   2387 				 bfd_boolean linker ATTRIBUTE_UNUSED)
   2388 {
   2389   unsigned long val;
   2390 
   2391   switch (bfd_get_arch (abfd))
   2392     {
   2393     case bfd_arch_v850_rh850:
   2394       val = EF_RH850_ABI;
   2395       if (bfd_get_mach (abfd) == bfd_mach_v850e3v5)
   2396 	val |= EF_V800_850E3;
   2397       elf_elfheader (abfd)->e_flags |= val;
   2398       break;
   2399 
   2400     case bfd_arch_v850:
   2401       switch (bfd_get_mach (abfd))
   2402 	{
   2403 	default:
   2404 	case bfd_mach_v850:     val = E_V850_ARCH; break;
   2405 	case bfd_mach_v850e:    val = E_V850E_ARCH; break;
   2406 	case bfd_mach_v850e1:   val = E_V850E1_ARCH; break;
   2407 	case bfd_mach_v850e2:   val = E_V850E2_ARCH; break;
   2408 	case bfd_mach_v850e2v3: val = E_V850E2V3_ARCH; break;
   2409 	case bfd_mach_v850e3v5: val = E_V850E3V5_ARCH; break;
   2410 	}
   2411       elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
   2412       elf_elfheader (abfd)->e_flags |= val;
   2413       break;
   2414     default:
   2415       break;
   2416     }
   2417 }
   2418 
   2419 /* Function to keep V850 specific file flags.  */
   2420 
   2421 static bfd_boolean
   2422 v850_elf_set_private_flags (bfd *abfd, flagword flags)
   2423 {
   2424   BFD_ASSERT (!elf_flags_init (abfd)
   2425 	      || elf_elfheader (abfd)->e_flags == flags);
   2426 
   2427   elf_elfheader (abfd)->e_flags = flags;
   2428   elf_flags_init (abfd) = TRUE;
   2429   return TRUE;
   2430 }
   2431 
   2432 /* Merge backend specific data from an object file
   2433    to the output object file when linking.  */
   2434 
   2435 static bfd_boolean
   2436 v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   2437 {
   2438   flagword out_flags;
   2439   flagword in_flags;
   2440 
   2441   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
   2442       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
   2443     return TRUE;
   2444 
   2445   in_flags = elf_elfheader (ibfd)->e_flags;
   2446   out_flags = elf_elfheader (obfd)->e_flags;
   2447 
   2448   if (! elf_flags_init (obfd))
   2449     {
   2450       /* If the input is the default architecture then do not
   2451 	 bother setting the flags for the output architecture,
   2452 	 instead allow future merges to do this.  If no future
   2453 	 merges ever set these flags then they will retain their
   2454 	 unitialised values, which surprise surprise, correspond
   2455 	 to the default values.  */
   2456       if (bfd_get_arch_info (ibfd)->the_default)
   2457 	return TRUE;
   2458 
   2459       elf_flags_init (obfd) = TRUE;
   2460       elf_elfheader (obfd)->e_flags = in_flags;
   2461 
   2462       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
   2463 	  && bfd_get_arch_info (obfd)->the_default)
   2464 	return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
   2465 
   2466       return TRUE;
   2467     }
   2468 
   2469   /* Check flag compatibility.  */
   2470   if (in_flags == out_flags)
   2471     return TRUE;
   2472 
   2473   if (bfd_get_arch (obfd) == bfd_arch_v850_rh850)
   2474     {
   2475       if ((in_flags & EF_V800_850E3) != (out_flags & EF_V800_850E3))
   2476 	{
   2477 	  _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
   2478 			      ibfd);
   2479 	  elf_elfheader (obfd)->e_flags |= EF_V800_850E3;
   2480 	}
   2481 
   2482       if ((in_flags & EF_RH850_DATA_ALIGN8) != (out_flags & EF_RH850_DATA_ALIGN8))
   2483 	{
   2484 	  _bfd_error_handler (_("%B: Alignment mismatch with previous modules"),
   2485 			      ibfd);
   2486 	  elf_elfheader (obfd)->e_flags |= EF_RH850_DATA_ALIGN8;
   2487 	}
   2488 
   2489       return TRUE;
   2490     }
   2491 
   2492   if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
   2493       && (in_flags & EF_V850_ARCH) != E_V850_ARCH)
   2494     {
   2495       /* Allow earlier architecture binaries to be linked with later binaries.
   2496          Set the output binary to the later architecture, except for v850e1,
   2497          which we set to v850e.  */
   2498       if (   (in_flags  & EF_V850_ARCH) == E_V850E1_ARCH
   2499           && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
   2500         return TRUE;
   2501 
   2502       if (   (in_flags  & EF_V850_ARCH) == E_V850_ARCH
   2503 	  && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
   2504 	{
   2505 	  elf_elfheader (obfd)->e_flags =
   2506 	    ((out_flags & ~ EF_V850_ARCH) | E_V850E_ARCH);
   2507 	  return TRUE;
   2508 	}
   2509 
   2510       if ((   (in_flags & EF_V850_ARCH) == E_V850_ARCH
   2511 	   || (in_flags & EF_V850_ARCH) == E_V850E_ARCH)
   2512 	  && (out_flags & EF_V850_ARCH) == E_V850E2_ARCH)
   2513 	{
   2514 	  elf_elfheader (obfd)->e_flags =
   2515 	    ((out_flags & ~ EF_V850_ARCH) | E_V850E2_ARCH);
   2516 	  return TRUE;
   2517 	}
   2518 
   2519       if ((   (in_flags & EF_V850_ARCH) == E_V850_ARCH
   2520 	   || (in_flags & EF_V850_ARCH) == E_V850E_ARCH
   2521 	   || (in_flags & EF_V850_ARCH) == E_V850E2_ARCH)
   2522 	  && (out_flags & EF_V850_ARCH) == E_V850E2V3_ARCH)
   2523 	{
   2524 	  elf_elfheader (obfd)->e_flags =
   2525 	    ((out_flags & ~ EF_V850_ARCH) | E_V850E2V3_ARCH);
   2526 	  return TRUE;
   2527 	}
   2528 
   2529       if ((   (in_flags & EF_V850_ARCH) == E_V850_ARCH
   2530 	   || (in_flags & EF_V850_ARCH) == E_V850E_ARCH
   2531 	   || (in_flags & EF_V850_ARCH) == E_V850E2_ARCH
   2532            || (in_flags & EF_V850_ARCH) == E_V850E2V3_ARCH)
   2533 	  && (out_flags & EF_V850_ARCH) == E_V850E3V5_ARCH)
   2534 	{
   2535 	  elf_elfheader (obfd)->e_flags =
   2536 	    ((out_flags & ~ EF_V850_ARCH) | E_V850E3V5_ARCH);
   2537 	  return TRUE;
   2538 	}
   2539 
   2540       _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
   2541 			  ibfd);
   2542     }
   2543 
   2544   return TRUE;
   2545 }
   2546 
   2547 /* Display the flags field.  */
   2548 
   2549 static bfd_boolean
   2550 v850_elf_print_private_bfd_data (bfd *abfd, void * ptr)
   2551 {
   2552   FILE * file = (FILE *) ptr;
   2553 
   2554   BFD_ASSERT (abfd != NULL && ptr != NULL);
   2555 
   2556   _bfd_elf_print_private_bfd_data (abfd, ptr);
   2557 
   2558   /* xgettext:c-format.  */
   2559   fprintf (file, _("private flags = %lx: "), elf_elfheader (abfd)->e_flags);
   2560 
   2561   if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
   2562     {
   2563       if ((elf_elfheader (abfd)->e_flags & EF_RH850_ABI) != EF_RH850_ABI)
   2564 	fprintf (file, _("unknown v850 architecture"));
   2565       else if (elf_elfheader (abfd)->e_flags & EF_V800_850E3)
   2566 	fprintf (file, _("v850 E3 architecture"));
   2567       else
   2568 	fprintf (file, _("v850 architecture"));
   2569 
   2570       if (elf_elfheader (abfd)->e_flags & EF_RH850_DATA_ALIGN8)
   2571 	fprintf (file, _(", 8-byte data alignment"));
   2572     }
   2573   else
   2574     {
   2575       switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
   2576 	{
   2577 	default:
   2578 	case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
   2579 	case E_V850E_ARCH: fprintf (file, _("v850e architecture")); break;
   2580 	case E_V850E1_ARCH: fprintf (file, _("v850e1 architecture")); break;
   2581 	case E_V850E2_ARCH: fprintf (file, _("v850e2 architecture")); break;
   2582 	case E_V850E2V3_ARCH: fprintf (file, _("v850e2v3 architecture")); break;
   2583 	case E_V850E3V5_ARCH: fprintf (file, _("v850e3v5 architecture")); break;
   2584 	}
   2585     }
   2586 
   2587   fputc ('\n', file);
   2588 
   2589   return TRUE;
   2590 }
   2591 
   2592 /* V850 ELF uses four common sections.  One is the usual one, and the
   2593    others are for (small) objects in one of the special data areas:
   2594    small, tiny and zero.  All the objects are kept together, and then
   2595    referenced via the gp register, the ep register or the r0 register
   2596    respectively, which yields smaller, faster assembler code.  This
   2597    approach is copied from elf32-mips.c.  */
   2598 
   2599 static asection  v850_elf_scom_section;
   2600 static asymbol   v850_elf_scom_symbol;
   2601 static asymbol * v850_elf_scom_symbol_ptr;
   2602 static asection  v850_elf_tcom_section;
   2603 static asymbol   v850_elf_tcom_symbol;
   2604 static asymbol * v850_elf_tcom_symbol_ptr;
   2605 static asection  v850_elf_zcom_section;
   2606 static asymbol   v850_elf_zcom_symbol;
   2607 static asymbol * v850_elf_zcom_symbol_ptr;
   2608 
   2609 /* Given a BFD section, try to locate the
   2610    corresponding ELF section index.  */
   2611 
   2612 static bfd_boolean
   2613 v850_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
   2614 				   asection *sec,
   2615 				   int *retval)
   2616 {
   2617   if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
   2618     *retval = SHN_V850_SCOMMON;
   2619   else if (strcmp (bfd_get_section_name (abfd, sec), ".tcommon") == 0)
   2620     *retval = SHN_V850_TCOMMON;
   2621   else if (strcmp (bfd_get_section_name (abfd, sec), ".zcommon") == 0)
   2622     *retval = SHN_V850_ZCOMMON;
   2623   else
   2624     return FALSE;
   2625 
   2626   return TRUE;
   2627 }
   2628 
   2629 /* Handle the special V850 section numbers that a symbol may use.  */
   2630 
   2631 static void
   2632 v850_elf_symbol_processing (bfd *abfd, asymbol *asym)
   2633 {
   2634   elf_symbol_type * elfsym = (elf_symbol_type *) asym;
   2635   unsigned int indx;
   2636 
   2637   indx = elfsym->internal_elf_sym.st_shndx;
   2638 
   2639   /* If the section index is an "ordinary" index, then it may
   2640      refer to a v850 specific section created by the assembler.
   2641      Check the section's type and change the index it matches.
   2642 
   2643      FIXME: Should we alter the st_shndx field as well ?  */
   2644 
   2645   if (indx < elf_numsections (abfd))
   2646     switch (elf_elfsections (abfd)[indx]->sh_type)
   2647       {
   2648       case SHT_V850_SCOMMON:
   2649 	indx = SHN_V850_SCOMMON;
   2650 	break;
   2651 
   2652       case SHT_V850_TCOMMON:
   2653 	indx = SHN_V850_TCOMMON;
   2654 	break;
   2655 
   2656       case SHT_V850_ZCOMMON:
   2657 	indx = SHN_V850_ZCOMMON;
   2658 	break;
   2659 
   2660       default:
   2661 	break;
   2662       }
   2663 
   2664   switch (indx)
   2665     {
   2666     case SHN_V850_SCOMMON:
   2667       if (v850_elf_scom_section.name == NULL)
   2668 	{
   2669 	  /* Initialize the small common section.  */
   2670 	  v850_elf_scom_section.name           = ".scommon";
   2671 	  v850_elf_scom_section.flags          = SEC_IS_COMMON | SEC_ALLOC | SEC_DATA;
   2672 	  v850_elf_scom_section.output_section = & v850_elf_scom_section;
   2673 	  v850_elf_scom_section.symbol         = & v850_elf_scom_symbol;
   2674 	  v850_elf_scom_section.symbol_ptr_ptr = & v850_elf_scom_symbol_ptr;
   2675 	  v850_elf_scom_symbol.name            = ".scommon";
   2676 	  v850_elf_scom_symbol.flags           = BSF_SECTION_SYM;
   2677 	  v850_elf_scom_symbol.section         = & v850_elf_scom_section;
   2678 	  v850_elf_scom_symbol_ptr             = & v850_elf_scom_symbol;
   2679 	}
   2680       asym->section = & v850_elf_scom_section;
   2681       asym->value = elfsym->internal_elf_sym.st_size;
   2682       break;
   2683 
   2684     case SHN_V850_TCOMMON:
   2685       if (v850_elf_tcom_section.name == NULL)
   2686 	{
   2687 	  /* Initialize the tcommon section.  */
   2688 	  v850_elf_tcom_section.name           = ".tcommon";
   2689 	  v850_elf_tcom_section.flags          = SEC_IS_COMMON;
   2690 	  v850_elf_tcom_section.output_section = & v850_elf_tcom_section;
   2691 	  v850_elf_tcom_section.symbol         = & v850_elf_tcom_symbol;
   2692 	  v850_elf_tcom_section.symbol_ptr_ptr = & v850_elf_tcom_symbol_ptr;
   2693 	  v850_elf_tcom_symbol.name            = ".tcommon";
   2694 	  v850_elf_tcom_symbol.flags           = BSF_SECTION_SYM;
   2695 	  v850_elf_tcom_symbol.section         = & v850_elf_tcom_section;
   2696 	  v850_elf_tcom_symbol_ptr             = & v850_elf_tcom_symbol;
   2697 	}
   2698       asym->section = & v850_elf_tcom_section;
   2699       asym->value = elfsym->internal_elf_sym.st_size;
   2700       break;
   2701 
   2702     case SHN_V850_ZCOMMON:
   2703       if (v850_elf_zcom_section.name == NULL)
   2704 	{
   2705 	  /* Initialize the zcommon section.  */
   2706 	  v850_elf_zcom_section.name           = ".zcommon";
   2707 	  v850_elf_zcom_section.flags          = SEC_IS_COMMON;
   2708 	  v850_elf_zcom_section.output_section = & v850_elf_zcom_section;
   2709 	  v850_elf_zcom_section.symbol         = & v850_elf_zcom_symbol;
   2710 	  v850_elf_zcom_section.symbol_ptr_ptr = & v850_elf_zcom_symbol_ptr;
   2711 	  v850_elf_zcom_symbol.name            = ".zcommon";
   2712 	  v850_elf_zcom_symbol.flags           = BSF_SECTION_SYM;
   2713 	  v850_elf_zcom_symbol.section         = & v850_elf_zcom_section;
   2714 	  v850_elf_zcom_symbol_ptr             = & v850_elf_zcom_symbol;
   2715 	}
   2716       asym->section = & v850_elf_zcom_section;
   2717       asym->value = elfsym->internal_elf_sym.st_size;
   2718       break;
   2719     }
   2720 }
   2721 
   2722 /* Hook called by the linker routine which adds symbols from an object
   2723    file.  We must handle the special v850 section numbers here.  */
   2724 
   2725 static bfd_boolean
   2726 v850_elf_add_symbol_hook (bfd *abfd,
   2727 			  struct bfd_link_info *info ATTRIBUTE_UNUSED,
   2728 			  Elf_Internal_Sym *sym,
   2729 			  const char **namep ATTRIBUTE_UNUSED,
   2730 			  flagword *flagsp ATTRIBUTE_UNUSED,
   2731 			  asection **secp,
   2732 			  bfd_vma *valp)
   2733 {
   2734   unsigned int indx = sym->st_shndx;
   2735 
   2736   /* If the section index is an "ordinary" index, then it may
   2737      refer to a v850 specific section created by the assembler.
   2738      Check the section's type and change the index it matches.
   2739 
   2740      FIXME: Should we alter the st_shndx field as well ?  */
   2741 
   2742   if (indx < elf_numsections (abfd))
   2743     switch (elf_elfsections (abfd)[indx]->sh_type)
   2744       {
   2745       case SHT_V850_SCOMMON:
   2746 	indx = SHN_V850_SCOMMON;
   2747 	break;
   2748 
   2749       case SHT_V850_TCOMMON:
   2750 	indx = SHN_V850_TCOMMON;
   2751 	break;
   2752 
   2753       case SHT_V850_ZCOMMON:
   2754 	indx = SHN_V850_ZCOMMON;
   2755 	break;
   2756 
   2757       default:
   2758 	break;
   2759       }
   2760 
   2761   switch (indx)
   2762     {
   2763     case SHN_V850_SCOMMON:
   2764       *secp = bfd_make_section_old_way (abfd, ".scommon");
   2765       (*secp)->flags |= SEC_IS_COMMON;
   2766       *valp = sym->st_size;
   2767       break;
   2768 
   2769     case SHN_V850_TCOMMON:
   2770       *secp = bfd_make_section_old_way (abfd, ".tcommon");
   2771       (*secp)->flags |= SEC_IS_COMMON;
   2772       *valp = sym->st_size;
   2773       break;
   2774 
   2775     case SHN_V850_ZCOMMON:
   2776       *secp = bfd_make_section_old_way (abfd, ".zcommon");
   2777       (*secp)->flags |= SEC_IS_COMMON;
   2778       *valp = sym->st_size;
   2779       break;
   2780     }
   2781 
   2782   return TRUE;
   2783 }
   2784 
   2785 static int
   2786 v850_elf_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
   2787 				  const char *name ATTRIBUTE_UNUSED,
   2788 				  Elf_Internal_Sym *sym,
   2789 				  asection *input_sec,
   2790 				  struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
   2791 {
   2792   /* If we see a common symbol, which implies a relocatable link, then
   2793      if a symbol was in a special common section in an input file, mark
   2794      it as a special common in the output file.  */
   2795 
   2796   if (sym->st_shndx == SHN_COMMON)
   2797     {
   2798       if (strcmp (input_sec->name, ".scommon") == 0)
   2799 	sym->st_shndx = SHN_V850_SCOMMON;
   2800       else if (strcmp (input_sec->name, ".tcommon") == 0)
   2801 	sym->st_shndx = SHN_V850_TCOMMON;
   2802       else if (strcmp (input_sec->name, ".zcommon") == 0)
   2803 	sym->st_shndx = SHN_V850_ZCOMMON;
   2804     }
   2805 
   2806   /* The price we pay for using h->other unused bits as flags in the
   2807      linker is cleaning up after ourselves.  */
   2808 
   2809   sym->st_other &= ~(V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA
   2810 		     | V850_OTHER_ERROR);
   2811 
   2812   return 1;
   2813 }
   2814 
   2815 static bfd_boolean
   2816 v850_elf_section_from_shdr (bfd *abfd,
   2817 			    Elf_Internal_Shdr *hdr,
   2818 			    const char *name,
   2819 			    int shindex)
   2820 {
   2821   /* There ought to be a place to keep ELF backend specific flags, but
   2822      at the moment there isn't one.  We just keep track of the
   2823      sections by their name, instead.  */
   2824 
   2825   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
   2826     return FALSE;
   2827 
   2828   switch (hdr->sh_type)
   2829     {
   2830     case SHT_V850_SCOMMON:
   2831     case SHT_V850_TCOMMON:
   2832     case SHT_V850_ZCOMMON:
   2833       if (! bfd_set_section_flags (abfd, hdr->bfd_section,
   2834 				   (bfd_get_section_flags (abfd,
   2835 							   hdr->bfd_section)
   2836 				    | SEC_IS_COMMON)))
   2837 	return FALSE;
   2838     }
   2839 
   2840   return TRUE;
   2841 }
   2842 
   2843 /* Set the correct type for a V850 ELF section.  We do this
   2844    by the section name, which is a hack, but ought to work.  */
   2845 
   2846 static bfd_boolean
   2847 v850_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
   2848 			Elf_Internal_Shdr *hdr,
   2849 			asection *sec)
   2850 {
   2851   const char * name;
   2852 
   2853   name = bfd_get_section_name (abfd, sec);
   2854 
   2855   if (strcmp (name, ".scommon") == 0)
   2856     hdr->sh_type = SHT_V850_SCOMMON;
   2857   else if (strcmp (name, ".tcommon") == 0)
   2858     hdr->sh_type = SHT_V850_TCOMMON;
   2859   else if (strcmp (name, ".zcommon") == 0)
   2860     hdr->sh_type = SHT_V850_ZCOMMON;
   2861 
   2862   return TRUE;
   2863 }
   2864 
   2865 /* Delete some bytes from a section while relaxing.  */
   2866 
   2867 static bfd_boolean
   2868 v850_elf_relax_delete_bytes (bfd *abfd,
   2869 			     asection *sec,
   2870 			     bfd_vma addr,
   2871 			     bfd_vma toaddr,
   2872 			     int count)
   2873 {
   2874   Elf_Internal_Shdr *symtab_hdr;
   2875   Elf32_External_Sym *extsyms;
   2876   Elf32_External_Sym *esym;
   2877   Elf32_External_Sym *esymend;
   2878   int sym_index;
   2879   unsigned int sec_shndx;
   2880   bfd_byte *contents;
   2881   Elf_Internal_Rela *irel;
   2882   Elf_Internal_Rela *irelend;
   2883   struct elf_link_hash_entry *sym_hash;
   2884   Elf_Internal_Shdr *shndx_hdr;
   2885   Elf_External_Sym_Shndx *shndx;
   2886 
   2887   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   2888   extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
   2889 
   2890   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
   2891 
   2892   contents = elf_section_data (sec)->this_hdr.contents;
   2893 
   2894   /* The deletion must stop at the next ALIGN reloc for an alignment
   2895      power larger than the number of bytes we are deleting.  */
   2896 
   2897   /* Actually delete the bytes.  */
   2898 #if (DEBUG_RELAX & 2)
   2899   fprintf (stderr, "relax_delete: contents: sec: %s  %p .. %p %x\n",
   2900 	   sec->name, addr, toaddr, count );
   2901 #endif
   2902   memmove (contents + addr, contents + addr + count,
   2903 	   toaddr - addr - count);
   2904   memset (contents + toaddr-count, 0, count);
   2905 
   2906   /* Adjust all the relocs.  */
   2907   irel = elf_section_data (sec)->relocs;
   2908   irelend = irel + sec->reloc_count;
   2909   shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
   2910   shndx = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
   2911 
   2912   for (; irel < irelend; irel++)
   2913     {
   2914       bfd_vma raddr, paddr, symval;
   2915       Elf_Internal_Sym isym;
   2916 
   2917       /* Get the new reloc address.  */
   2918       raddr = irel->r_offset;
   2919       if ((raddr >= (addr + count) && raddr < toaddr))
   2920 	irel->r_offset -= count;
   2921 
   2922       if (raddr >= addr && raddr < addr + count)
   2923 	{
   2924 	  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   2925 				       (int) R_V850_NONE);
   2926 	  continue;
   2927 	}
   2928 
   2929       if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN)
   2930 	continue;
   2931 
   2932       bfd_elf32_swap_symbol_in (abfd,
   2933 				extsyms + ELF32_R_SYM (irel->r_info),
   2934 				shndx ? shndx + ELF32_R_SYM (irel->r_info) : NULL,
   2935 				& isym);
   2936 
   2937       if (isym.st_shndx != sec_shndx)
   2938 	continue;
   2939 
   2940       /* Get the value of the symbol referred to by the reloc.  */
   2941       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
   2942 	{
   2943 	  symval = isym.st_value;
   2944 #if (DEBUG_RELAX & 2)
   2945 	  {
   2946 	    char * name = bfd_elf_string_from_elf_section
   2947 	                   (abfd, symtab_hdr->sh_link, isym.st_name);
   2948 	    fprintf (stderr,
   2949 	       "relax_delete: local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
   2950 	       sec->name, name, isym.st_name,
   2951 	       sec->output_section->vma, sec->output_offset,
   2952 	       isym.st_value, irel->r_addend);
   2953 	  }
   2954 #endif
   2955 	}
   2956       else
   2957 	{
   2958 	  unsigned long indx;
   2959 	  struct elf_link_hash_entry * h;
   2960 
   2961 	  /* An external symbol.  */
   2962 	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
   2963 
   2964 	  h = elf_sym_hashes (abfd) [indx];
   2965 	  BFD_ASSERT (h != NULL);
   2966 
   2967 	  symval = h->root.u.def.value;
   2968 #if (DEBUG_RELAX & 2)
   2969 	  fprintf (stderr,
   2970 		   "relax_delete: defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
   2971 		   sec->name, h->root.root.string, h->root.u.def.value,
   2972 		   sec->output_section->vma, sec->output_offset, irel->r_addend);
   2973 #endif
   2974 	}
   2975 
   2976       paddr = symval + irel->r_addend;
   2977 
   2978       if ( (symval >= addr + count && symval < toaddr)
   2979 	  && (paddr < addr + count || paddr >= toaddr))
   2980 	irel->r_addend += count;
   2981       else if (    (symval < addr + count || symval >= toaddr)
   2982 	        && (paddr >= addr + count && paddr < toaddr))
   2983 	irel->r_addend -= count;
   2984     }
   2985 
   2986   /* Adjust the local symbols defined in this section.  */
   2987   esym = extsyms;
   2988   esymend = esym + symtab_hdr->sh_info;
   2989 
   2990   for (; esym < esymend; esym++, shndx = (shndx ? shndx + 1 : NULL))
   2991     {
   2992       Elf_Internal_Sym isym;
   2993 
   2994       bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
   2995 
   2996       if (isym.st_shndx == sec_shndx
   2997 	  && isym.st_value >= addr + count
   2998 	  && isym.st_value < toaddr)
   2999 	{
   3000 	  isym.st_value -= count;
   3001 
   3002 	  if (isym.st_value + isym.st_size >= toaddr)
   3003 	    isym.st_size += count;
   3004 
   3005 	  bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
   3006 	}
   3007       else if (isym.st_shndx == sec_shndx
   3008 	       && isym.st_value < addr + count)
   3009 	{
   3010 	  if (isym.st_value+isym.st_size >= addr + count
   3011 	      && isym.st_value+isym.st_size < toaddr)
   3012 	    isym.st_size -= count;
   3013 
   3014 	  if (isym.st_value >= addr
   3015 	      && isym.st_value <  addr + count)
   3016 	    isym.st_value = addr;
   3017 
   3018 	  bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
   3019 	}
   3020     }
   3021 
   3022   /* Now adjust the global symbols defined in this section.  */
   3023   esym = extsyms + symtab_hdr->sh_info;
   3024   esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
   3025 
   3026   for (sym_index = 0; esym < esymend; esym ++, sym_index ++)
   3027     {
   3028       Elf_Internal_Sym isym;
   3029 
   3030       bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
   3031       sym_hash = elf_sym_hashes (abfd) [sym_index];
   3032 
   3033       if (isym.st_shndx == sec_shndx
   3034 	  && ((sym_hash)->root.type == bfd_link_hash_defined
   3035 	      || (sym_hash)->root.type == bfd_link_hash_defweak)
   3036 	  && (sym_hash)->root.u.def.section == sec
   3037 	  && (sym_hash)->root.u.def.value >= addr + count
   3038 	  && (sym_hash)->root.u.def.value < toaddr)
   3039 	{
   3040 	  if ((sym_hash)->root.u.def.value + isym.st_size >= toaddr)
   3041 	    {
   3042 	      isym.st_size += count;
   3043 	      bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
   3044 	    }
   3045 
   3046 	  (sym_hash)->root.u.def.value -= count;
   3047 	}
   3048       else if (isym.st_shndx == sec_shndx
   3049 	       && ((sym_hash)->root.type == bfd_link_hash_defined
   3050 		   || (sym_hash)->root.type == bfd_link_hash_defweak)
   3051 	       && (sym_hash)->root.u.def.section == sec
   3052 	       && (sym_hash)->root.u.def.value < addr + count)
   3053 	{
   3054 	  if ((sym_hash)->root.u.def.value+isym.st_size >= addr + count
   3055 	      && (sym_hash)->root.u.def.value+isym.st_size < toaddr)
   3056 	    isym.st_size -= count;
   3057 
   3058 	  if ((sym_hash)->root.u.def.value >= addr
   3059 	      && (sym_hash)->root.u.def.value < addr + count)
   3060 	    (sym_hash)->root.u.def.value = addr;
   3061 
   3062 	  bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
   3063 	}
   3064 
   3065       if (shndx)
   3066 	++ shndx;
   3067     }
   3068 
   3069   return TRUE;
   3070 }
   3071 
   3072 #define NOP_OPCODE 	(0x0000)
   3073 #define MOVHI	    	0x0640				/* 4byte.  */
   3074 #define MOVHI_MASK  	0x07e0
   3075 #define MOVHI_R1(insn)	((insn) & 0x1f)			/* 4byte.  */
   3076 #define MOVHI_R2(insn)	((insn) >> 11)
   3077 #define MOVEA	    	0x0620				/* 2byte.  */
   3078 #define MOVEA_MASK  	0x07e0
   3079 #define MOVEA_R1(insn)	((insn) & 0x1f)
   3080 #define MOVEA_R2(insn)	((insn) >> 11)
   3081 #define JARL_4	    	0x00040780				/* 4byte.  */
   3082 #define JARL_4_MASK 	0xFFFF07FF
   3083 #define JARL_R2(insn)	(int)(((insn) & (~JARL_4_MASK)) >> 11)
   3084 #define ADD_I       	0x0240					/* 2byte.  */
   3085 #define ADD_I_MASK  	0x07e0
   3086 #define ADD_I5(insn)	((((insn) & 0x001f) << 11) >> 11)	/* 2byte.  */
   3087 #define ADD_R2(insn)	((insn) >> 11)
   3088 #define JMP_R	    	0x0060					/* 2byte.  */
   3089 #define JMP_R_MASK 	0xFFE0
   3090 #define JMP_R1(insn)	((insn) & 0x1f)
   3091 
   3092 static bfd_boolean
   3093 v850_elf_relax_section (bfd *abfd,
   3094 			asection *sec,
   3095 			struct bfd_link_info *link_info,
   3096 			bfd_boolean *again)
   3097 {
   3098   Elf_Internal_Shdr *symtab_hdr;
   3099   Elf_Internal_Rela *internal_relocs;
   3100   Elf_Internal_Rela *irel;
   3101   Elf_Internal_Rela *irelend;
   3102   Elf_Internal_Rela *irelalign = NULL;
   3103   Elf_Internal_Sym *isymbuf = NULL;
   3104   bfd_byte *contents = NULL;
   3105   bfd_vma addr = 0;
   3106   bfd_vma toaddr;
   3107   int align_pad_size = 0;
   3108   bfd_boolean result = TRUE;
   3109 
   3110   *again = FALSE;
   3111 
   3112   if (link_info->relocatable
   3113       || (sec->flags & SEC_RELOC) == 0
   3114       || sec->reloc_count == 0)
   3115     return TRUE;
   3116 
   3117   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
   3118 
   3119   internal_relocs = (_bfd_elf_link_read_relocs
   3120 		     (abfd, sec, NULL, NULL, link_info->keep_memory));
   3121   if (internal_relocs == NULL)
   3122     goto error_return;
   3123 
   3124   irelend = internal_relocs + sec->reloc_count;
   3125 
   3126   while (addr < sec->size)
   3127     {
   3128       toaddr = sec->size;
   3129 
   3130       for (irel = internal_relocs; irel < irelend; irel ++)
   3131 	if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
   3132 	    && irel->r_offset > addr
   3133 	    && irel->r_offset < toaddr)
   3134 	  toaddr = irel->r_offset;
   3135 
   3136 #ifdef DEBUG_RELAX
   3137       fprintf (stderr, "relax region 0x%x to 0x%x align pad %d\n",
   3138 	       addr, toaddr, align_pad_size);
   3139 #endif
   3140       if (irelalign)
   3141 	{
   3142 	  bfd_vma alignto;
   3143 	  bfd_vma alignmoveto;
   3144 
   3145 	  alignmoveto = BFD_ALIGN (addr - align_pad_size, 1 << irelalign->r_addend);
   3146 	  alignto = BFD_ALIGN (addr, 1 << irelalign->r_addend);
   3147 
   3148 	  if (alignmoveto < alignto)
   3149 	    {
   3150 	      bfd_vma i;
   3151 
   3152 	      align_pad_size = alignto - alignmoveto;
   3153 #ifdef DEBUG_RELAX
   3154 	      fprintf (stderr, "relax move region 0x%x to 0x%x delete size 0x%x\n",
   3155 		       alignmoveto, toaddr, align_pad_size);
   3156 #endif
   3157 	      if (!v850_elf_relax_delete_bytes (abfd, sec, alignmoveto,
   3158 						toaddr, align_pad_size))
   3159 		goto error_return;
   3160 
   3161 	      for (i  = BFD_ALIGN (toaddr - align_pad_size, 1);
   3162 		   (i + 1) < toaddr; i += 2)
   3163 		bfd_put_16 (abfd, NOP_OPCODE, contents + i);
   3164 
   3165 	      addr = alignmoveto;
   3166 	    }
   3167 	  else
   3168 	    align_pad_size = 0;
   3169 	}
   3170 
   3171       for (irel = internal_relocs; irel < irelend; irel++)
   3172 	{
   3173 	  bfd_vma laddr;
   3174 	  bfd_vma addend;
   3175 	  bfd_vma symval;
   3176 	  int insn[5];
   3177 	  int no_match = -1;
   3178 	  Elf_Internal_Rela *hi_irelfn;
   3179 	  Elf_Internal_Rela *lo_irelfn;
   3180 	  Elf_Internal_Rela *irelcall;
   3181 	  bfd_signed_vma foff;
   3182 	  unsigned int r_type;
   3183 
   3184 	  if (! (irel->r_offset >= addr && irel->r_offset < toaddr
   3185 		 && (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL
   3186 		     || ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)))
   3187 	    continue;
   3188 
   3189 #ifdef DEBUG_RELAX
   3190 	  fprintf (stderr, "relax check r_info 0x%x r_offset 0x%x r_addend 0x%x\n",
   3191 		   irel->r_info,
   3192 		   irel->r_offset,
   3193 		   irel->r_addend );
   3194 #endif
   3195 
   3196 	  /* Get the section contents.  */
   3197 	  if (contents == NULL)
   3198 	    {
   3199 	      if (elf_section_data (sec)->this_hdr.contents != NULL)
   3200 		contents = elf_section_data (sec)->this_hdr.contents;
   3201 	      else
   3202 		{
   3203 		  if (! bfd_malloc_and_get_section (abfd, sec, &contents))
   3204 		    goto error_return;
   3205 		}
   3206 	    }
   3207 
   3208 	  /* Read this BFD's local symbols if we haven't done so already.  */
   3209 	  if (isymbuf == NULL && symtab_hdr->sh_info != 0)
   3210 	    {
   3211 	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
   3212 	      if (isymbuf == NULL)
   3213 		isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
   3214 						symtab_hdr->sh_info, 0,
   3215 						NULL, NULL, NULL);
   3216 	      if (isymbuf == NULL)
   3217 		goto error_return;
   3218 	    }
   3219 
   3220 	  laddr = irel->r_offset;
   3221 
   3222 	  if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL)
   3223 	    {
   3224 	      /* Check code for -mlong-calls output. */
   3225 	      if (laddr + 16 <= (bfd_vma) sec->size)
   3226 		{
   3227 		  insn[0] = bfd_get_16 (abfd, contents + laddr);
   3228 		  insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
   3229 		  insn[2] = bfd_get_32 (abfd, contents + laddr + 8);
   3230 		  insn[3] = bfd_get_16 (abfd, contents + laddr + 12);
   3231 		  insn[4] = bfd_get_16 (abfd, contents + laddr + 14);
   3232 
   3233 		  if ((insn[0] & MOVHI_MASK) != MOVHI
   3234 		       || MOVHI_R1 (insn[0]) != 0)
   3235 		    no_match = 0;
   3236 
   3237 		  if (no_match < 0
   3238 		      && ((insn[1] & MOVEA_MASK) != MOVEA
   3239 			   || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
   3240 		    no_match = 1;
   3241 
   3242 		  if (no_match < 0
   3243 		      && (insn[2] & JARL_4_MASK) != JARL_4)
   3244 		    no_match = 2;
   3245 
   3246 		  if (no_match < 0
   3247 		      && ((insn[3] & ADD_I_MASK) != ADD_I
   3248 			   || ADD_I5 (insn[3]) != 4
   3249 			   || JARL_R2 (insn[2]) != ADD_R2 (insn[3])))
   3250 		    no_match = 3;
   3251 
   3252 		  if (no_match < 0
   3253 		      && ((insn[4] & JMP_R_MASK) != JMP_R
   3254 			   || MOVEA_R2 (insn[1]) != JMP_R1 (insn[4])))
   3255 		    no_match = 4;
   3256 		}
   3257 	      else
   3258 		{
   3259 		  ((*_bfd_error_handler)
   3260 		   ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insns",
   3261 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset));
   3262 
   3263 		  continue;
   3264 		}
   3265 
   3266 	      if (no_match >= 0)
   3267 		{
   3268 		  ((*_bfd_error_handler)
   3269 		   ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insn 0x%x",
   3270 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
   3271 
   3272 		  continue;
   3273 		}
   3274 
   3275 	      /* Get the reloc for the address from which the register is
   3276 	         being loaded.  This reloc will tell us which function is
   3277 	         actually being called.  */
   3278 
   3279 	      for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
   3280 		{
   3281 		  r_type = ELF32_R_TYPE (hi_irelfn->r_info);
   3282 
   3283 		  if (hi_irelfn->r_offset == laddr + 2
   3284 		      && (r_type == (int) R_V850_HI16_S || r_type == (int) R_V810_WHI1))
   3285 		    break;
   3286 		}
   3287 
   3288 	      for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
   3289 		{
   3290 		  r_type = ELF32_R_TYPE (lo_irelfn->r_info);
   3291 
   3292 		  if (lo_irelfn->r_offset == laddr + 6
   3293 		      && (r_type == (int) R_V850_LO16 || r_type == (int) R_V810_WLO))
   3294 		    break;
   3295 		}
   3296 
   3297 	      for (irelcall = internal_relocs; irelcall < irelend; irelcall ++)
   3298 		{
   3299 		  r_type = ELF32_R_TYPE (irelcall->r_info);
   3300 
   3301 		  if (irelcall->r_offset == laddr + 8
   3302 		      && (r_type == (int) R_V850_22_PCREL || r_type == (int) R_V850_PCR22))
   3303 		    break;
   3304 		}
   3305 
   3306 	      if (   hi_irelfn == irelend
   3307 		  || lo_irelfn == irelend
   3308 		  || irelcall  == irelend)
   3309 		{
   3310 		  ((*_bfd_error_handler)
   3311 		   ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc",
   3312 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
   3313 
   3314 		  continue;
   3315 		}
   3316 
   3317 	      if (ELF32_R_SYM (irelcall->r_info) < symtab_hdr->sh_info)
   3318 		{
   3319 		  Elf_Internal_Sym *  isym;
   3320 
   3321 		  /* A local symbol.  */
   3322 		  isym = isymbuf + ELF32_R_SYM (irelcall->r_info);
   3323 
   3324 		  symval = isym->st_value;
   3325 		}
   3326 	      else
   3327 		{
   3328 		  unsigned long indx;
   3329 		  struct elf_link_hash_entry * h;
   3330 
   3331 		  /* An external symbol.  */
   3332 		  indx = ELF32_R_SYM (irelcall->r_info) - symtab_hdr->sh_info;
   3333 		  h = elf_sym_hashes (abfd)[indx];
   3334 		  BFD_ASSERT (h != NULL);
   3335 
   3336 		  if (   h->root.type != bfd_link_hash_defined
   3337 		      && h->root.type != bfd_link_hash_defweak)
   3338 		    /* This appears to be a reference to an undefined
   3339 		       symbol.  Just ignore it--it will be caught by the
   3340 		       regular reloc processing.  */
   3341 		    continue;
   3342 
   3343 		  symval = h->root.u.def.value;
   3344 		}
   3345 
   3346 	      if (symval + irelcall->r_addend != irelcall->r_offset + 4)
   3347 		{
   3348 		  ((*_bfd_error_handler)
   3349 		   ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc 0x%lx",
   3350 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset, irelcall->r_offset ));
   3351 
   3352 		  continue;
   3353 		}
   3354 
   3355 	      /* Get the value of the symbol referred to by the reloc.  */
   3356 	      if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
   3357 		{
   3358 		  Elf_Internal_Sym *isym;
   3359 		  asection *sym_sec;
   3360 
   3361 		  /* A local symbol.  */
   3362 		  isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
   3363 
   3364 		  if (isym->st_shndx == SHN_UNDEF)
   3365 		    sym_sec = bfd_und_section_ptr;
   3366 		  else if (isym->st_shndx == SHN_ABS)
   3367 		    sym_sec = bfd_abs_section_ptr;
   3368 		  else if (isym->st_shndx == SHN_COMMON)
   3369 		    sym_sec = bfd_com_section_ptr;
   3370 		  else
   3371 		    sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
   3372 		  symval = (isym->st_value
   3373 			    + sym_sec->output_section->vma
   3374 			    + sym_sec->output_offset);
   3375 		}
   3376 	      else
   3377 		{
   3378 		  unsigned long indx;
   3379 		  struct elf_link_hash_entry *h;
   3380 
   3381 		  /* An external symbol.  */
   3382 		  indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
   3383 		  h = elf_sym_hashes (abfd)[indx];
   3384 		  BFD_ASSERT (h != NULL);
   3385 
   3386 		  if (   h->root.type != bfd_link_hash_defined
   3387 		      && h->root.type != bfd_link_hash_defweak)
   3388 		    /* This appears to be a reference to an undefined
   3389 		       symbol.  Just ignore it--it will be caught by the
   3390 		       regular reloc processing.  */
   3391 		    continue;
   3392 
   3393 		  symval = (h->root.u.def.value
   3394 			    + h->root.u.def.section->output_section->vma
   3395 			    + h->root.u.def.section->output_offset);
   3396 		}
   3397 
   3398 	      addend = irel->r_addend;
   3399 
   3400 	      foff = (symval + addend
   3401 		      - (irel->r_offset
   3402 			 + sec->output_section->vma
   3403 			 + sec->output_offset
   3404 			 + 4));
   3405 #ifdef DEBUG_RELAX
   3406 	      fprintf (stderr, "relax longcall r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
   3407 		       irel->r_offset,
   3408 		       (irel->r_offset
   3409 			+ sec->output_section->vma
   3410 			+ sec->output_offset),
   3411 		       symval, addend, foff);
   3412 #endif
   3413 
   3414 	      if (foff < -0x100000 || foff >= 0x100000)
   3415 		/* After all that work, we can't shorten this function call.  */
   3416 		continue;
   3417 
   3418 	      /* For simplicity of coding, we are going to modify the section
   3419 	         contents, the section relocs, and the BFD symbol table.  We
   3420 	         must tell the rest of the code not to free up this
   3421 	         information.  It would be possible to instead create a table
   3422 	         of changes which have to be made, as is done in coff-mips.c;
   3423 	         that would be more work, but would require less memory when
   3424 	         the linker is run.  */
   3425 	      elf_section_data (sec)->relocs = internal_relocs;
   3426 	      elf_section_data (sec)->this_hdr.contents = contents;
   3427 	      symtab_hdr->contents = (bfd_byte *) isymbuf;
   3428 
   3429 	      /* Replace the long call with a jarl.  */
   3430 	      if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
   3431 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_PCR22);
   3432 	      else
   3433 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_22_PCREL);
   3434 
   3435 	      addend = 0;
   3436 
   3437 	      if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
   3438 		/* If this needs to be changed because of future relaxing,
   3439 		   it will be handled here like other internal IND12W
   3440 		   relocs.  */
   3441 		bfd_put_32 (abfd,
   3442 			    0x00000780 | (JARL_R2 (insn[2])<<11) | ((addend << 16) & 0xffff) | ((addend >> 16) & 0xf),
   3443 			    contents + irel->r_offset);
   3444 	      else
   3445 		/* We can't fully resolve this yet, because the external
   3446 		   symbol value may be changed by future relaxing.
   3447 		   We let the final link phase handle it.  */
   3448 		bfd_put_32 (abfd, 0x00000780 | (JARL_R2 (insn[2])<<11),
   3449 			    contents + irel->r_offset);
   3450 
   3451 	      hi_irelfn->r_info =
   3452 		ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
   3453 	      lo_irelfn->r_info =
   3454 		ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
   3455 	      irelcall->r_info =
   3456 		ELF32_R_INFO (ELF32_R_SYM (irelcall->r_info), R_V850_NONE);
   3457 
   3458 	      if (! v850_elf_relax_delete_bytes (abfd, sec,
   3459 						 irel->r_offset + 4, toaddr, 12))
   3460 		goto error_return;
   3461 
   3462 	      align_pad_size += 12;
   3463 	    }
   3464 	  else if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)
   3465 	    {
   3466 	      /* Check code for -mlong-jumps output.  */
   3467 	      if (laddr + 10 <= (bfd_vma) sec->size)
   3468 		{
   3469 		  insn[0] = bfd_get_16 (abfd, contents + laddr);
   3470 		  insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
   3471 		  insn[2] = bfd_get_16 (abfd, contents + laddr + 8);
   3472 
   3473 		  if ((insn[0] & MOVHI_MASK) != MOVHI
   3474 		       || MOVHI_R1 (insn[0]) != 0)
   3475 		    no_match = 0;
   3476 
   3477 		  if (no_match < 0
   3478 		      && ((insn[1] & MOVEA_MASK) != MOVEA
   3479 			   || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
   3480 		    no_match = 1;
   3481 
   3482 		  if (no_match < 0
   3483 		      && ((insn[2] & JMP_R_MASK) != JMP_R
   3484 			   || MOVEA_R2 (insn[1]) != JMP_R1 (insn[2])))
   3485 		    no_match = 4;
   3486 		}
   3487 	      else
   3488 		{
   3489 		  ((*_bfd_error_handler)
   3490 		   ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insns",
   3491 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset));
   3492 
   3493 		  continue;
   3494 		}
   3495 
   3496 	      if (no_match >= 0)
   3497 		{
   3498 		  ((*_bfd_error_handler)
   3499 		   ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insn 0x%x",
   3500 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
   3501 
   3502 		  continue;
   3503 		}
   3504 
   3505 	      /* Get the reloc for the address from which the register is
   3506 	         being loaded.  This reloc will tell us which function is
   3507 	         actually being called.  */
   3508 	      for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
   3509 		{
   3510 		  r_type = ELF32_R_TYPE (hi_irelfn->r_info);
   3511 
   3512 		  if (hi_irelfn->r_offset == laddr + 2
   3513 		      && ((r_type == (int) R_V850_HI16_S) || r_type == (int) R_V810_WHI1))
   3514 		    break;
   3515 		}
   3516 
   3517 	      for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
   3518 		{
   3519 		  r_type = ELF32_R_TYPE (lo_irelfn->r_info);
   3520 
   3521 		  if (lo_irelfn->r_offset == laddr + 6
   3522 		      && (r_type == (int) R_V850_LO16 || r_type == (int) R_V810_WLO))
   3523 		    break;
   3524 		}
   3525 
   3526 	      if (   hi_irelfn == irelend
   3527 		  || lo_irelfn == irelend)
   3528 		{
   3529 		  ((*_bfd_error_handler)
   3530 		   ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized reloc",
   3531 		    bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
   3532 
   3533 		  continue;
   3534 		}
   3535 
   3536 	      /* Get the value of the symbol referred to by the reloc.  */
   3537 	      if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
   3538 		{
   3539 		  Elf_Internal_Sym *  isym;
   3540 		  asection *          sym_sec;
   3541 
   3542 		  /* A local symbol.  */
   3543 		  isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
   3544 
   3545 		  if (isym->st_shndx == SHN_UNDEF)
   3546 		    sym_sec = bfd_und_section_ptr;
   3547 		  else if (isym->st_shndx == SHN_ABS)
   3548 		    sym_sec = bfd_abs_section_ptr;
   3549 		  else if (isym->st_shndx == SHN_COMMON)
   3550 		    sym_sec = bfd_com_section_ptr;
   3551 		  else
   3552 		    sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
   3553 		  symval = (isym->st_value
   3554 			    + sym_sec->output_section->vma
   3555 			    + sym_sec->output_offset);
   3556 #ifdef DEBUG_RELAX
   3557 		  {
   3558 		    char * name = bfd_elf_string_from_elf_section
   3559 		      (abfd, symtab_hdr->sh_link, isym->st_name);
   3560 
   3561 		    fprintf (stderr, "relax long jump local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
   3562 			     sym_sec->name, name, isym->st_name,
   3563 			     sym_sec->output_section->vma,
   3564 			     sym_sec->output_offset,
   3565 			     isym->st_value, irel->r_addend);
   3566 		  }
   3567 #endif
   3568 		}
   3569 	      else
   3570 		{
   3571 		  unsigned long indx;
   3572 		  struct elf_link_hash_entry * h;
   3573 
   3574 		  /* An external symbol.  */
   3575 		  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
   3576 		  h = elf_sym_hashes (abfd)[indx];
   3577 		  BFD_ASSERT (h != NULL);
   3578 
   3579 		  if (   h->root.type != bfd_link_hash_defined
   3580 		      && h->root.type != bfd_link_hash_defweak)
   3581 		    /* This appears to be a reference to an undefined
   3582 		       symbol.  Just ignore it--it will be caught by the
   3583 		       regular reloc processing.  */
   3584 		    continue;
   3585 
   3586 		  symval = (h->root.u.def.value
   3587 			    + h->root.u.def.section->output_section->vma
   3588 			    + h->root.u.def.section->output_offset);
   3589 #ifdef DEBUG_RELAX
   3590 		  fprintf (stderr,
   3591 			   "relax longjump defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
   3592 			   sec->name, h->root.root.string, h->root.u.def.value,
   3593 			   sec->output_section->vma, sec->output_offset, irel->r_addend);
   3594 #endif
   3595 		}
   3596 
   3597 	      addend = irel->r_addend;
   3598 
   3599 	      foff = (symval + addend
   3600 		      - (irel->r_offset
   3601 			 + sec->output_section->vma
   3602 			 + sec->output_offset
   3603 			 + 4));
   3604 #ifdef DEBUG_RELAX
   3605 	      fprintf (stderr, "relax longjump r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
   3606 		       irel->r_offset,
   3607 		       (irel->r_offset
   3608 			+ sec->output_section->vma
   3609 			+ sec->output_offset),
   3610 		       symval, addend, foff);
   3611 #endif
   3612 	      if (foff < -0x100000 || foff >= 0x100000)
   3613 		/* After all that work, we can't shorten this function call.  */
   3614 		continue;
   3615 
   3616 	      /* For simplicity of coding, we are going to modify the section
   3617 	         contents, the section relocs, and the BFD symbol table.  We
   3618 	         must tell the rest of the code not to free up this
   3619 	         information.  It would be possible to instead create a table
   3620 	         of changes which have to be made, as is done in coff-mips.c;
   3621 	         that would be more work, but would require less memory when
   3622 	         the linker is run.  */
   3623 	      elf_section_data (sec)->relocs = internal_relocs;
   3624 	      elf_section_data (sec)->this_hdr.contents = contents;
   3625 	      symtab_hdr->contents = (bfd_byte *) isymbuf;
   3626 
   3627 	      if (foff < -0x100 || foff >= 0x100)
   3628 		{
   3629 		  /* Replace the long jump with a jr.  */
   3630 
   3631 		  if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
   3632 		    irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_PCR22);
   3633 		  else
   3634 		    irel->r_info =
   3635 		      ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_22_PCREL);
   3636 
   3637 		  irel->r_addend = addend;
   3638 		  addend = 0;
   3639 
   3640 		  if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
   3641 		    /* If this needs to be changed because of future relaxing,
   3642 		       it will be handled here like other internal IND12W
   3643 		       relocs.  */
   3644 		    bfd_put_32 (abfd,
   3645 				0x00000780 | ((addend << 15) & 0xffff0000) | ((addend >> 17) & 0xf),
   3646 				contents + irel->r_offset);
   3647 		  else
   3648 		    /* We can't fully resolve this yet, because the external
   3649 		       symbol value may be changed by future relaxing.
   3650 		       We let the final link phase handle it.  */
   3651 		    bfd_put_32 (abfd, 0x00000780, contents + irel->r_offset);
   3652 
   3653 		  hi_irelfn->r_info =
   3654 			ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
   3655 		  lo_irelfn->r_info =
   3656 			ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
   3657 		  if (!v850_elf_relax_delete_bytes (abfd, sec,
   3658 						    irel->r_offset + 4, toaddr, 6))
   3659 		    goto error_return;
   3660 
   3661 		  align_pad_size += 6;
   3662 		}
   3663 	      else
   3664 		{
   3665 		  /* Replace the long jump with a br.  */
   3666 
   3667 		  if (bfd_get_arch (abfd) == bfd_arch_v850_rh850)
   3668 		    irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_PC9);
   3669 		  else
   3670 		    irel->r_info =
   3671 		      ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_9_PCREL);
   3672 
   3673 		  irel->r_addend = addend;
   3674 		  addend = 0;
   3675 
   3676 		  if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
   3677 		    /* If this needs to be changed because of future relaxing,
   3678 		       it will be handled here like other internal IND12W
   3679 		       relocs.  */
   3680 		    bfd_put_16 (abfd,
   3681 				0x0585 | ((addend << 10) & 0xf800) | ((addend << 3) & 0x0070),
   3682 				contents + irel->r_offset);
   3683 		  else
   3684 		    /* We can't fully resolve this yet, because the external
   3685 		       symbol value may be changed by future relaxing.
   3686 		       We let the final link phase handle it.  */
   3687 		    bfd_put_16 (abfd, 0x0585, contents + irel->r_offset);
   3688 
   3689 		  hi_irelfn->r_info =
   3690 			ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
   3691 		  lo_irelfn->r_info =
   3692 			ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
   3693 		  if (!v850_elf_relax_delete_bytes (abfd, sec,
   3694 						    irel->r_offset + 2, toaddr, 8))
   3695 		    goto error_return;
   3696 
   3697 		  align_pad_size += 8;
   3698 		}
   3699 	    }
   3700 	}
   3701 
   3702       irelalign = NULL;
   3703       for (irel = internal_relocs; irel < irelend; irel++)
   3704 	{
   3705 	  if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
   3706 	      && irel->r_offset == toaddr)
   3707 	    {
   3708 	      irel->r_offset -= align_pad_size;
   3709 
   3710 	      if (irelalign == NULL || irelalign->r_addend > irel->r_addend)
   3711 		irelalign = irel;
   3712 	    }
   3713 	}
   3714 
   3715       addr = toaddr;
   3716     }
   3717 
   3718   if (!irelalign)
   3719     {
   3720 #ifdef DEBUG_RELAX
   3721       fprintf (stderr, "relax pad %d shorten %d -> %d\n",
   3722 	       align_pad_size,
   3723 	       sec->size,
   3724 	       sec->size - align_pad_size);
   3725 #endif
   3726       sec->size -= align_pad_size;
   3727     }
   3728 
   3729  finish:
   3730   if (internal_relocs != NULL
   3731       && elf_section_data (sec)->relocs != internal_relocs)
   3732     free (internal_relocs);
   3733 
   3734   if (contents != NULL
   3735       && elf_section_data (sec)->this_hdr.contents != (unsigned char *) contents)
   3736     free (contents);
   3737 
   3738   if (isymbuf != NULL
   3739       && symtab_hdr->contents != (bfd_byte *) isymbuf)
   3740     free (isymbuf);
   3741 
   3742   return result;
   3743 
   3744  error_return:
   3745   result = FALSE;
   3746   goto finish;
   3747 }
   3748 
   3749 static const struct bfd_elf_special_section v850_elf_special_sections[] =
   3750 {
   3751   { STRING_COMMA_LEN (".call_table_data"), 0, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE) },
   3752   { STRING_COMMA_LEN (".call_table_text"), 0, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
   3753 								 + SHF_EXECINSTR) },
   3754   { STRING_COMMA_LEN (".rosdata"),        -2, SHT_PROGBITS,     (SHF_ALLOC
   3755 								 + SHF_V850_GPREL) },
   3756   { STRING_COMMA_LEN (".rozdata"),        -2, SHT_PROGBITS,     (SHF_ALLOC
   3757 								 + SHF_V850_R0REL) },
   3758   { STRING_COMMA_LEN (".sbss"),           -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
   3759 								 + SHF_V850_GPREL) },
   3760   { STRING_COMMA_LEN (".scommon"),        -2, SHT_V850_SCOMMON, (SHF_ALLOC + SHF_WRITE
   3761 								 + SHF_V850_GPREL) },
   3762   { STRING_COMMA_LEN (".sdata"),          -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
   3763 								 + SHF_V850_GPREL) },
   3764   { STRING_COMMA_LEN (".tbss"),           -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
   3765 								 + SHF_V850_EPREL) },
   3766   { STRING_COMMA_LEN (".tcommon"),        -2, SHT_V850_TCOMMON, (SHF_ALLOC + SHF_WRITE
   3767 								 + SHF_V850_R0REL) },
   3768   { STRING_COMMA_LEN (".tdata"),          -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
   3769 								 + SHF_V850_EPREL) },
   3770   { STRING_COMMA_LEN (".zbss"),           -2, SHT_NOBITS,       (SHF_ALLOC + SHF_WRITE
   3771 								 + SHF_V850_R0REL) },
   3772   { STRING_COMMA_LEN (".zcommon"),        -2, SHT_V850_ZCOMMON, (SHF_ALLOC + SHF_WRITE
   3773 								 + SHF_V850_R0REL) },
   3774   { STRING_COMMA_LEN (".zdata"),          -2, SHT_PROGBITS,     (SHF_ALLOC + SHF_WRITE
   3775 								 + SHF_V850_R0REL) },
   3776   { NULL,                     0,           0, 0,                0 }
   3777 };
   3778 
   3779 #define TARGET_LITTLE_SYM			v850_elf32_vec
   3781 #define TARGET_LITTLE_NAME			"elf32-v850"
   3782 #define ELF_ARCH				bfd_arch_v850
   3783 #define ELF_MACHINE_CODE			EM_V850
   3784 #define ELF_MACHINE_ALT1			EM_CYGNUS_V850
   3785 #define ELF_MAXPAGESIZE				0x1000
   3786 
   3787 #define elf_info_to_howto			v850_elf_info_to_howto_rela
   3788 #define elf_info_to_howto_rel			v850_elf_info_to_howto_rel
   3789 
   3790 #define elf_backend_check_relocs		v850_elf_check_relocs
   3791 #define elf_backend_relocate_section    	v850_elf_relocate_section
   3792 #define elf_backend_object_p			v850_elf_object_p
   3793 #define elf_backend_final_write_processing 	v850_elf_final_write_processing
   3794 #define elf_backend_section_from_bfd_section 	v850_elf_section_from_bfd_section
   3795 #define elf_backend_symbol_processing		v850_elf_symbol_processing
   3796 #define elf_backend_add_symbol_hook		v850_elf_add_symbol_hook
   3797 #define elf_backend_link_output_symbol_hook 	v850_elf_link_output_symbol_hook
   3798 #define elf_backend_section_from_shdr		v850_elf_section_from_shdr
   3799 #define elf_backend_fake_sections		v850_elf_fake_sections
   3800 #define elf_backend_gc_mark_hook                v850_elf_gc_mark_hook
   3801 #define elf_backend_special_sections		v850_elf_special_sections
   3802 
   3803 #define elf_backend_can_gc_sections 1
   3804 #define elf_backend_rela_normal 1
   3805 
   3806 #define bfd_elf32_bfd_is_local_label_name	v850_elf_is_local_label_name
   3807 #define bfd_elf32_bfd_is_target_special_symbol	v850_elf_is_target_special_symbol
   3808 
   3809 #define bfd_elf32_bfd_reloc_type_lookup		v850_elf_reloc_type_lookup
   3810 #define bfd_elf32_bfd_reloc_name_lookup	        v850_elf_reloc_name_lookup
   3811 #define bfd_elf32_bfd_merge_private_bfd_data 	v850_elf_merge_private_bfd_data
   3812 #define bfd_elf32_bfd_set_private_flags		v850_elf_set_private_flags
   3813 #define bfd_elf32_bfd_print_private_bfd_data	v850_elf_print_private_bfd_data
   3814 #define bfd_elf32_bfd_relax_section		v850_elf_relax_section
   3815 
   3816 #define elf_symbol_leading_char			'_'
   3817 
   3818 #undef  elf32_bed
   3819 #define elf32_bed elf32_v850_bed
   3820 
   3821 #include "elf32-target.h"
   3822 
   3823 /* Map BFD reloc types to V800 ELF reloc types.  */
   3824 
   3825 static const struct v850_elf_reloc_map v800_elf_reloc_map[] =
   3826 {
   3827   { BFD_RELOC_NONE,                   R_V810_NONE    },
   3828   { BFD_RELOC_8,                      R_V810_BYTE    },
   3829   { BFD_RELOC_16,                     R_V810_HWORD   },
   3830   { BFD_RELOC_32,                     R_V810_WORD    },
   3831   { BFD_RELOC_LO16,                   R_V810_WLO     },
   3832   { BFD_RELOC_HI16,                   R_V810_WHI     },
   3833   { BFD_RELOC_HI16_S,                 R_V810_WHI1    },
   3834   { BFD_RELOC_V850_32_PCREL,          R_V850_PC32    },
   3835   { BFD_RELOC_V850_22_PCREL,          R_V850_PCR22   },
   3836   { BFD_RELOC_V850_17_PCREL,          R_V850_PC17    },
   3837   { BFD_RELOC_V850_16_PCREL,          R_V850_PC16U   },
   3838   { BFD_RELOC_V850_9_PCREL,	      R_V850_PC9     },
   3839   { BFD_RELOC_V850_LO16_S1,           R_V810_WLO_1   }, /* Or R_V850_HWLO or R_V850_HWLO_1.  */
   3840   { BFD_RELOC_V850_23,                R_V850_WLO23   },
   3841   { BFD_RELOC_V850_LO16_SPLIT_OFFSET, R_V850_BLO     },
   3842   { BFD_RELOC_V850_ZDA_16_16_OFFSET,  R_V810_HWORD   },
   3843   { BFD_RELOC_V850_TDA_16_16_OFFSET,  R_V810_HWORD   },
   3844   { BFD_RELOC_V850_SDA_16_16_OFFSET,  R_V810_HWORD   },
   3845   { BFD_RELOC_V850_SDA_15_16_OFFSET,  R_V810_GPWLO_1 }
   3846 };
   3847 
   3848 /* Map a bfd relocation into the appropriate howto structure.  */
   3849 
   3850 static reloc_howto_type *
   3851 v800_elf_reloc_type_lookup (bfd * abfd, bfd_reloc_code_real_type code)
   3852 {
   3853   unsigned int i;
   3854 
   3855   BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_v850_rh850);
   3856 
   3857   for (i = ARRAY_SIZE (v800_elf_reloc_map); i --;)
   3858     if (v800_elf_reloc_map[i].bfd_reloc_val == code)
   3859       {
   3860 	unsigned int elf_reloc_val = v800_elf_reloc_map[i].elf_reloc_val;
   3861 	unsigned int idx = elf_reloc_val - R_V810_NONE;
   3862 
   3863 	BFD_ASSERT (v800_elf_howto_table[idx].type == elf_reloc_val);
   3864 
   3865 	return v800_elf_howto_table + idx;
   3866       }
   3867 
   3868 #ifdef DEBUG
   3869   fprintf (stderr, "failed to find v800 equiv of bfd reloc code %d\n", code);
   3870 #endif
   3871   return NULL;
   3872 }
   3873 
   3874 static reloc_howto_type *
   3875 v800_elf_reloc_name_lookup (bfd * abfd, const char * r_name)
   3876 {
   3877   unsigned int i;
   3878 
   3879   BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_v850_rh850);
   3880 
   3881   for (i = ARRAY_SIZE (v800_elf_howto_table); i--;)
   3882     if (v800_elf_howto_table[i].name != NULL
   3883 	&& strcasecmp (v800_elf_howto_table[i].name, r_name) == 0)
   3884       return v800_elf_howto_table + i;
   3885 
   3886   return NULL;
   3887 }
   3888 
   3889 
   3890 /* Set the howto pointer in CACHE_PTR for a V800 ELF reloc.  */
   3891 
   3892 static void
   3893 v800_elf_info_to_howto (bfd *               abfd,
   3894 			arelent *           cache_ptr,
   3895 			Elf_Internal_Rela * dst)
   3896 {
   3897   unsigned int r_type = ELF32_R_TYPE (dst->r_info);
   3898 
   3899   BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_v850_rh850);
   3900 
   3901   BFD_ASSERT (r_type < (unsigned int) R_V800_max);
   3902 
   3903   if (r_type == R_V800_NONE)
   3904     r_type = R_V810_NONE;
   3905 
   3906   BFD_ASSERT (r_type >= (unsigned int) R_V810_NONE);
   3907   r_type -= R_V810_NONE;
   3908   BFD_ASSERT (r_type < ARRAY_SIZE (v800_elf_howto_table));
   3909 
   3910   cache_ptr->howto = v800_elf_howto_table + r_type;
   3911 }
   3912 
   3913 
   3915 #undef  TARGET_LITTLE_SYM
   3916 #define TARGET_LITTLE_SYM			v800_elf32_vec
   3917 #undef  TARGET_LITTLE_NAME
   3918 #define TARGET_LITTLE_NAME			"elf32-v850-rh850"
   3919 #undef  ELF_ARCH
   3920 #define ELF_ARCH				bfd_arch_v850_rh850
   3921 #undef  ELF_MACHINE_CODE
   3922 #define ELF_MACHINE_CODE			EM_V800
   3923 #undef  ELF_MACHINE_ALT1
   3924 
   3925 #undef  elf32_bed
   3926 #define elf32_bed elf32_v850_rh850_bed
   3927 
   3928 #undef  elf_info_to_howto
   3929 #define elf_info_to_howto			v800_elf_info_to_howto
   3930 #undef  elf_info_to_howto_rel
   3931 #define elf_info_to_howto_rel			NULL
   3932 #undef  bfd_elf32_bfd_reloc_type_lookup
   3933 #define bfd_elf32_bfd_reloc_type_lookup		v800_elf_reloc_type_lookup
   3934 #undef  bfd_elf32_bfd_reloc_name_lookup
   3935 #define bfd_elf32_bfd_reloc_name_lookup		v800_elf_reloc_name_lookup
   3936 
   3937 #include "elf32-target.h"
   3938