Home | History | Annotate | Download | only in bfd
      1 /* Intel i860 specific support for 32-bit ELF.
      2    Copyright (C) 1993-2016 Free Software Foundation, Inc.
      3 
      4    Full i860 support contributed by Jason Eckhardt <jle (at) cygnus.com>.
      5 
      6    This file is part of BFD, the Binary File Descriptor library.
      7 
      8    This program is free software; you can redistribute it and/or modify
      9    it under the terms of the GNU General Public License as published by
     10    the Free Software Foundation; either version 3 of the License, or
     11    (at your option) any later version.
     12 
     13    This program is distributed in the hope that it will be useful,
     14    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16    GNU General Public License for more details.
     17 
     18    You should have received a copy of the GNU General Public License
     19    along with this program; if not, write to the Free Software
     20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     21    MA 02110-1301, USA.  */
     22 
     23 #include "sysdep.h"
     24 #include "bfd.h"
     25 #include "libbfd.h"
     26 #include "elf-bfd.h"
     27 #include "elf/i860.h"
     28 
     29 /* special_function for R_860_PC26 relocation.  */
     30 static bfd_reloc_status_type
     31 i860_howto_pc26_reloc (bfd *abfd ATTRIBUTE_UNUSED,
     32                        arelent *reloc_entry,
     33                        asymbol *symbol,
     34                        void *data ATTRIBUTE_UNUSED,
     35                        asection *input_section,
     36                        bfd *output_bfd,
     37                        char **error_message ATTRIBUTE_UNUSED)
     38 {
     39   bfd_vma insn;
     40   bfd_vma relocation;
     41   bfd_byte *addr;
     42 
     43   if (output_bfd != NULL
     44       && (symbol->flags & BSF_SECTION_SYM) == 0
     45       && (! reloc_entry->howto->partial_inplace
     46 	  || reloc_entry->addend == 0))
     47     {
     48       reloc_entry->address += input_section->output_offset;
     49       return bfd_reloc_ok;
     50     }
     51 
     52   /* Used elf32-mips.c as an example.  */
     53   if (bfd_is_und_section (symbol->section)
     54       && output_bfd == (bfd *) NULL)
     55     return bfd_reloc_undefined;
     56 
     57   if (bfd_is_com_section (symbol->section))
     58     relocation = 0;
     59   else
     60     relocation = symbol->value;
     61 
     62   relocation += symbol->section->output_section->vma;
     63   relocation += symbol->section->output_offset;
     64   relocation += reloc_entry->addend;
     65 
     66   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
     67     return bfd_reloc_outofrange;
     68 
     69   /* Adjust for PC-relative relocation.  */
     70   relocation -= (input_section->output_section->vma
     71                  + input_section->output_offset
     72                  + reloc_entry->address
     73                  + 4);
     74 
     75   /* Check for target out of range.  */
     76   if ((bfd_signed_vma)relocation > (0x3ffffff << 2)
     77       || (bfd_signed_vma)relocation < (-0x4000000 * 4))
     78     return bfd_reloc_outofrange;
     79 
     80   addr = (bfd_byte *) data + reloc_entry->address;
     81   insn = bfd_get_32 (abfd, addr);
     82 
     83   relocation >>= reloc_entry->howto->rightshift;
     84   insn = (insn & ~reloc_entry->howto->dst_mask)
     85          | (relocation & reloc_entry->howto->dst_mask);
     86 
     87   bfd_put_32 (abfd, (bfd_vma) insn, addr);
     88 
     89   return bfd_reloc_ok;
     90 }
     91 
     92 /* special_function for R_860_PC16 relocation.  */
     93 static bfd_reloc_status_type
     94 i860_howto_pc16_reloc (bfd *abfd,
     95                        arelent *reloc_entry,
     96                        asymbol *symbol,
     97                        void *data,
     98                        asection *input_section,
     99                        bfd *output_bfd,
    100                        char **error_message ATTRIBUTE_UNUSED)
    101 {
    102   bfd_vma insn;
    103   bfd_vma relocation;
    104   bfd_byte *addr;
    105 
    106   if (output_bfd != NULL
    107       && (symbol->flags & BSF_SECTION_SYM) == 0
    108       && (! reloc_entry->howto->partial_inplace
    109 	  || reloc_entry->addend == 0))
    110     {
    111       reloc_entry->address += input_section->output_offset;
    112       return bfd_reloc_ok;
    113     }
    114 
    115   /* Used elf32-mips.c as an example.  */
    116   if (bfd_is_und_section (symbol->section)
    117       && output_bfd == (bfd *) NULL)
    118     return bfd_reloc_undefined;
    119 
    120   if (bfd_is_com_section (symbol->section))
    121     relocation = 0;
    122   else
    123     relocation = symbol->value;
    124 
    125   relocation += symbol->section->output_section->vma;
    126   relocation += symbol->section->output_offset;
    127   relocation += reloc_entry->addend;
    128 
    129   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
    130     return bfd_reloc_outofrange;
    131 
    132   /* Adjust for PC-relative relocation.  */
    133   relocation -= (input_section->output_section->vma
    134                  + input_section->output_offset
    135                  + reloc_entry->address
    136                  + 4);
    137 
    138   /* Check for target out of range.  */
    139   if ((bfd_signed_vma)relocation > (0x7fff << 2)
    140       || (bfd_signed_vma)relocation < (-0x8000 * 4))
    141     return bfd_reloc_outofrange;
    142 
    143   addr = (bfd_byte *) data + reloc_entry->address;
    144   insn = bfd_get_32 (abfd, addr);
    145 
    146   relocation >>= reloc_entry->howto->rightshift;
    147   relocation = (((relocation & 0xf800) << 5) | (relocation & 0x7ff))
    148                & reloc_entry->howto->dst_mask;
    149   insn = (insn & ~reloc_entry->howto->dst_mask) | relocation;
    150 
    151   bfd_put_32 (abfd, (bfd_vma) insn, addr);
    152 
    153   return bfd_reloc_ok;
    154 }
    155 
    156 /* special_function for R_860_HIGHADJ relocation.  */
    157 static bfd_reloc_status_type
    158 i860_howto_highadj_reloc (bfd *abfd,
    159                           arelent *reloc_entry,
    160                           asymbol *symbol,
    161                           void *data,
    162                           asection *input_section,
    163                           bfd *output_bfd,
    164                           char **error_message ATTRIBUTE_UNUSED)
    165 {
    166   bfd_vma insn;
    167   bfd_vma relocation;
    168   bfd_byte *addr;
    169 
    170   if (output_bfd != NULL
    171       && (symbol->flags & BSF_SECTION_SYM) == 0
    172       && (! reloc_entry->howto->partial_inplace
    173 	  || reloc_entry->addend == 0))
    174     {
    175       reloc_entry->address += input_section->output_offset;
    176       return bfd_reloc_ok;
    177     }
    178 
    179   /* Used elf32-mips.c as an example.  */
    180   if (bfd_is_und_section (symbol->section)
    181       && output_bfd == (bfd *) NULL)
    182     return bfd_reloc_undefined;
    183 
    184   if (bfd_is_com_section (symbol->section))
    185     relocation = 0;
    186   else
    187     relocation = symbol->value;
    188 
    189   relocation += symbol->section->output_section->vma;
    190   relocation += symbol->section->output_offset;
    191   relocation += reloc_entry->addend;
    192   relocation += 0x8000;
    193 
    194   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
    195     return bfd_reloc_outofrange;
    196 
    197   addr = (bfd_byte *) data + reloc_entry->address;
    198   insn = bfd_get_32 (abfd, addr);
    199 
    200   relocation = ((relocation >> 16) & 0xffff);
    201 
    202   insn = (insn & 0xffff0000) | relocation;
    203 
    204   bfd_put_32 (abfd, (bfd_vma) insn, addr);
    205 
    206   return bfd_reloc_ok;
    207 }
    208 
    209 /* special_function for R_860_SPLITn relocations.  */
    210 static bfd_reloc_status_type
    211 i860_howto_splitn_reloc (bfd *abfd,
    212                          arelent *reloc_entry,
    213                          asymbol *symbol,
    214                          void *data,
    215                          asection *input_section,
    216                          bfd *output_bfd,
    217                          char **error_message ATTRIBUTE_UNUSED)
    218 {
    219   bfd_vma insn;
    220   bfd_vma relocation;
    221   bfd_byte *addr;
    222 
    223   if (output_bfd != NULL
    224       && (symbol->flags & BSF_SECTION_SYM) == 0
    225       && (! reloc_entry->howto->partial_inplace
    226 	  || reloc_entry->addend == 0))
    227     {
    228       reloc_entry->address += input_section->output_offset;
    229       return bfd_reloc_ok;
    230     }
    231 
    232   /* Used elf32-mips.c as an example.  */
    233   if (bfd_is_und_section (symbol->section)
    234       && output_bfd == (bfd *) NULL)
    235     return bfd_reloc_undefined;
    236 
    237   if (bfd_is_com_section (symbol->section))
    238     relocation = 0;
    239   else
    240     relocation = symbol->value;
    241 
    242   relocation += symbol->section->output_section->vma;
    243   relocation += symbol->section->output_offset;
    244   relocation += reloc_entry->addend;
    245 
    246   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
    247     return bfd_reloc_outofrange;
    248 
    249   addr = (bfd_byte *) data + reloc_entry->address;
    250   insn = bfd_get_32 (abfd, addr);
    251 
    252   relocation = (((relocation & 0xf800) << 5) | (relocation & 0x7ff))
    253                & reloc_entry->howto->dst_mask;
    254   insn = (insn & ~reloc_entry->howto->dst_mask) | relocation;
    255 
    256   bfd_put_32 (abfd, (bfd_vma) insn, addr);
    257 
    258   return bfd_reloc_ok;
    259 }
    260 
    261 /* This howto table is preliminary.  */
    262 static reloc_howto_type elf32_i860_howto_table [] =
    263 {
    264   /* This relocation does nothing.  */
    265   HOWTO (R_860_NONE,		/* type */
    266 	 0,			/* rightshift */
    267 	 3,			/* size (0 = byte, 1 = short, 2 = long) */
    268 	 0,			/* bitsize */
    269 	 FALSE,			/* pc_relative */
    270 	 0,			/* bitpos */
    271 	 complain_overflow_dont, /* complain_on_overflow */
    272 	 bfd_elf_generic_reloc,	/* special_function */
    273 	 "R_860_NONE",		/* name */
    274 	 FALSE,			/* partial_inplace */
    275 	 0,			/* src_mask */
    276 	 0,			/* dst_mask */
    277 	 FALSE),		/* pcrel_offset */
    278 
    279   /* A 32-bit absolute relocation.  */
    280   HOWTO (R_860_32,		/* type */
    281 	 0,			/* rightshift */
    282 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    283 	 32,			/* bitsize */
    284 	 FALSE,			/* pc_relative */
    285 	 0,			/* bitpos */
    286 	 complain_overflow_bitfield, /* complain_on_overflow */
    287 	 bfd_elf_generic_reloc,	/* special_function */
    288 	 "R_860_32",		/* name */
    289 	 FALSE,			/* partial_inplace */
    290 	 0xffffffff,		/* src_mask */
    291 	 0xffffffff,		/* dst_mask */
    292 	 FALSE),		/* pcrel_offset */
    293 
    294   HOWTO (R_860_COPY,		/* type */
    295 	 0,			/* rightshift */
    296 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    297 	 32,			/* bitsize */
    298 	 FALSE,			/* pc_relative */
    299 	 0,			/* bitpos */
    300 	 complain_overflow_bitfield, /* complain_on_overflow */
    301 	 bfd_elf_generic_reloc,	/* special_function */
    302 	 "R_860_COPY",		/* name */
    303 	 TRUE,			/* partial_inplace */
    304 	 0xffffffff,		/* src_mask */
    305 	 0xffffffff,		/* dst_mask */
    306 	 FALSE),		/* pcrel_offset */
    307 
    308   HOWTO (R_860_GLOB_DAT,	/* type */
    309 	 0,			/* rightshift */
    310 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    311 	 32,			/* bitsize */
    312 	 FALSE,			/* pc_relative */
    313 	 0,			/* bitpos */
    314 	 complain_overflow_bitfield, /* complain_on_overflow */
    315 	 bfd_elf_generic_reloc,	/* special_function */
    316 	 "R_860_GLOB_DAT",	/* name */
    317 	 TRUE,			/* partial_inplace */
    318 	 0xffffffff,		/* src_mask */
    319 	 0xffffffff,		/* dst_mask */
    320 	 FALSE),		/* pcrel_offset */
    321 
    322   HOWTO (R_860_JUMP_SLOT,	/* type */
    323 	 0,			/* rightshift */
    324 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    325 	 32,			/* bitsize */
    326 	 FALSE,			/* pc_relative */
    327 	 0,			/* bitpos */
    328 	 complain_overflow_bitfield, /* complain_on_overflow */
    329 	 bfd_elf_generic_reloc,	/* special_function */
    330 	 "R_860_JUMP_SLOT",	/* name */
    331 	 TRUE,			/* partial_inplace */
    332 	 0xffffffff,		/* src_mask */
    333 	 0xffffffff,		/* dst_mask */
    334 	 FALSE),		/* pcrel_offset */
    335 
    336   HOWTO (R_860_RELATIVE,	/* type */
    337 	 0,			/* rightshift */
    338 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    339 	 32,			/* bitsize */
    340 	 FALSE,			/* pc_relative */
    341 	 0,			/* bitpos */
    342 	 complain_overflow_bitfield, /* complain_on_overflow */
    343 	 bfd_elf_generic_reloc,	/* special_function */
    344 	 "R_860_RELATIVE",	/* name */
    345 	 TRUE,			/* partial_inplace */
    346 	 0xffffffff,		/* src_mask */
    347 	 0xffffffff,		/* dst_mask */
    348 	 FALSE),		/* pcrel_offset */
    349 
    350   /* A 26-bit PC-relative relocation.  */
    351   HOWTO (R_860_PC26,	        /* type */
    352 	 2,			/* rightshift */
    353 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    354 	 26,			/* bitsize */
    355 	 TRUE,			/* pc_relative */
    356 	 0,			/* bitpos */
    357 	 complain_overflow_bitfield, /* complain_on_overflow */
    358 	 i860_howto_pc26_reloc,	/* special_function */
    359 	 "R_860_PC26",		/* name */
    360 	 FALSE,			/* partial_inplace */
    361 	 0x3ffffff,		/* src_mask */
    362 	 0x3ffffff,		/* dst_mask */
    363 	 TRUE),		        /* pcrel_offset */
    364 
    365   HOWTO (R_860_PLT26,	        /* type */
    366 	 0,			/* rightshift */
    367 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    368 	 26,			/* bitsize */
    369 	 TRUE,			/* pc_relative */
    370 	 0,			/* bitpos */
    371 	 complain_overflow_bitfield, /* complain_on_overflow */
    372 	 bfd_elf_generic_reloc,	/* special_function */
    373 	 "R_860_PLT26",		/* name */
    374 	 TRUE,			/* partial_inplace */
    375 	 0xffffffff,		/* src_mask */
    376 	 0xffffffff,		/* dst_mask */
    377 	 TRUE),		        /* pcrel_offset */
    378 
    379   /* A 16-bit PC-relative relocation.  */
    380   HOWTO (R_860_PC16,	        /* type */
    381 	 2,			/* rightshift */
    382 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    383 	 16,			/* bitsize */
    384 	 TRUE,			/* pc_relative */
    385 	 0,			/* bitpos */
    386 	 complain_overflow_bitfield, /* complain_on_overflow */
    387 	 i860_howto_pc16_reloc,	/* special_function */
    388 	 "R_860_PC16",		/* name */
    389 	 FALSE,			/* partial_inplace */
    390 	 0x1f07ff,		/* src_mask */
    391 	 0x1f07ff,		/* dst_mask */
    392 	 TRUE),		        /* pcrel_offset */
    393 
    394   HOWTO (R_860_LOW0,	        /* type */
    395 	 0,			/* rightshift */
    396 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    397 	 16,			/* bitsize */
    398 	 FALSE,			/* pc_relative */
    399 	 0,			/* bitpos */
    400 	 complain_overflow_dont, /* complain_on_overflow */
    401 	 bfd_elf_generic_reloc,	/* special_function */
    402 	 "R_860_LOW0",		/* name */
    403 	 FALSE,			/* partial_inplace */
    404 	 0xffff,		/* src_mask */
    405 	 0xffff,		/* dst_mask */
    406 	 FALSE),	        /* pcrel_offset */
    407 
    408   HOWTO (R_860_SPLIT0,	        /* type */
    409 	 0,			/* rightshift */
    410 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    411 	 16,			/* bitsize */
    412 	 FALSE,			/* pc_relative */
    413 	 0,			/* bitpos */
    414 	 complain_overflow_dont, /* complain_on_overflow */
    415 	 i860_howto_splitn_reloc, /* special_function */
    416 	 "R_860_SPLIT0",	/* name */
    417 	 FALSE,			/* partial_inplace */
    418 	 0x1f07ff,		/* src_mask */
    419 	 0x1f07ff,		/* dst_mask */
    420 	 FALSE),	        /* pcrel_offset */
    421 
    422   HOWTO (R_860_LOW1,	        /* type */
    423 	 0,			/* rightshift */
    424 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    425 	 16,			/* bitsize */
    426 	 FALSE,			/* pc_relative */
    427 	 0,			/* bitpos */
    428 	 complain_overflow_dont, /* complain_on_overflow */
    429 	 bfd_elf_generic_reloc,	/* special_function */
    430 	 "R_860_LOW1",		/* name */
    431 	 FALSE,			/* partial_inplace */
    432 	 0xfffe,		/* src_mask */
    433 	 0xfffe,		/* dst_mask */
    434 	 FALSE),	        /* pcrel_offset */
    435 
    436   HOWTO (R_860_SPLIT1,	        /* type */
    437 	 0,			/* rightshift */
    438 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    439 	 16,			/* bitsize */
    440 	 FALSE,			/* pc_relative */
    441 	 0,			/* bitpos */
    442 	 complain_overflow_dont, /* complain_on_overflow */
    443 	 i860_howto_splitn_reloc, /* special_function */
    444 	 "R_860_SPLIT1",	/* name */
    445 	 FALSE,			/* partial_inplace */
    446 	 0x1f07fe,		/* src_mask */
    447 	 0x1f07fe,		/* dst_mask */
    448 	 FALSE),	        /* pcrel_offset */
    449 
    450   HOWTO (R_860_LOW2,	        /* type */
    451 	 0,			/* rightshift */
    452 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    453 	 16,			/* bitsize */
    454 	 FALSE,			/* pc_relative */
    455 	 0,			/* bitpos */
    456 	 complain_overflow_dont, /* complain_on_overflow */
    457 	 bfd_elf_generic_reloc,	/* special_function */
    458 	 "R_860_LOW2",		/* name */
    459 	 FALSE,			/* partial_inplace */
    460 	 0xfffc,		/* src_mask */
    461 	 0xfffc,		/* dst_mask */
    462 	 FALSE),	        /* pcrel_offset */
    463 
    464   HOWTO (R_860_SPLIT2,	        /* type */
    465 	 0,			/* rightshift */
    466 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    467 	 16,			/* bitsize */
    468 	 FALSE,			/* pc_relative */
    469 	 0,			/* bitpos */
    470 	 complain_overflow_dont, /* complain_on_overflow */
    471 	 i860_howto_splitn_reloc, /* special_function */
    472 	 "R_860_SPLIT2",	/* name */
    473 	 FALSE,			/* partial_inplace */
    474 	 0x1f07fc,		/* src_mask */
    475 	 0x1f07fc,		/* dst_mask */
    476 	 FALSE),	        /* pcrel_offset */
    477 
    478   HOWTO (R_860_LOW3,	        /* type */
    479 	 0,			/* rightshift */
    480 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    481 	 16,			/* bitsize */
    482 	 FALSE,			/* pc_relative */
    483 	 0,			/* bitpos */
    484 	 complain_overflow_dont, /* complain_on_overflow */
    485 	 bfd_elf_generic_reloc,	/* special_function */
    486 	 "R_860_LOW3",		/* name */
    487 	 FALSE,			/* partial_inplace */
    488 	 0xfff8,		/* src_mask */
    489 	 0xfff8,		/* dst_mask */
    490 	 FALSE),	        /* pcrel_offset */
    491 
    492   HOWTO (R_860_LOGOT0,	        /* type */
    493 	 0,			/* rightshift */
    494 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    495 	 16,			/* bitsize */
    496 	 FALSE,			/* pc_relative */
    497 	 0,			/* bitpos */
    498 	 complain_overflow_dont, /* complain_on_overflow */
    499 	 bfd_elf_generic_reloc,	/* special_function */
    500 	 "R_860_LOGOT0",	/* name */
    501 	 FALSE,			/* partial_inplace */
    502 	 0,			/* src_mask */
    503 	 0xffff,		/* dst_mask */
    504 	 TRUE),		        /* pcrel_offset */
    505 
    506   HOWTO (R_860_SPGOT0,	        /* type */
    507 	 0,			/* rightshift */
    508 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    509 	 16,			/* bitsize */
    510 	 FALSE,			/* pc_relative */
    511 	 0,			/* bitpos */
    512 	 complain_overflow_dont, /* complain_on_overflow */
    513 	 bfd_elf_generic_reloc,	/* special_function */
    514 	 "R_860_SPGOT0",	/* name */
    515 	 FALSE,			/* partial_inplace */
    516 	 0,			/* src_mask */
    517 	 0xffff,		/* dst_mask */
    518 	 TRUE),		        /* pcrel_offset */
    519 
    520   HOWTO (R_860_LOGOT1,	        /* type */
    521 	 0,			/* rightshift */
    522 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    523 	 16,			/* bitsize */
    524 	 FALSE,			/* pc_relative */
    525 	 0,			/* bitpos */
    526 	 complain_overflow_dont, /* complain_on_overflow */
    527 	 bfd_elf_generic_reloc,	/* special_function */
    528 	 "R_860_LOGOT1",	/* name */
    529 	 FALSE,			/* partial_inplace */
    530 	 0,			/* src_mask */
    531 	 0xffff,		/* dst_mask */
    532 	 TRUE),		        /* pcrel_offset */
    533 
    534   HOWTO (R_860_SPGOT1,	        /* type */
    535 	 0,			/* rightshift */
    536 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    537 	 16,			/* bitsize */
    538 	 FALSE,			/* pc_relative */
    539 	 0,			/* bitpos */
    540 	 complain_overflow_dont, /* complain_on_overflow */
    541 	 bfd_elf_generic_reloc,	/* special_function */
    542 	 "R_860_SPGOT1",	/* name */
    543 	 FALSE,			/* partial_inplace */
    544 	 0,			/* src_mask */
    545 	 0xffff,		/* dst_mask */
    546 	 TRUE),		        /* pcrel_offset */
    547 
    548   HOWTO (R_860_LOGOTOFF0,        /* type */
    549 	 0,			/* rightshift */
    550 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    551 	 32,			/* bitsize */
    552 	 FALSE,			/* pc_relative */
    553 	 0,			/* bitpos */
    554 	 complain_overflow_dont, /* complain_on_overflow */
    555 	 bfd_elf_generic_reloc,	/* special_function */
    556 	 "R_860_LOGOTOFF0",	/* name */
    557 	 TRUE,			/* partial_inplace */
    558 	 0xffffffff,		/* src_mask */
    559 	 0xffffffff,		/* dst_mask */
    560 	 FALSE),	        /* pcrel_offset */
    561 
    562   HOWTO (R_860_SPGOTOFF0,        /* type */
    563 	 0,			/* rightshift */
    564 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    565 	 32,			/* bitsize */
    566 	 FALSE,			/* pc_relative */
    567 	 0,			/* bitpos */
    568 	 complain_overflow_dont, /* complain_on_overflow */
    569 	 bfd_elf_generic_reloc,	/* special_function */
    570 	 "R_860_SPGOTOFF0",	/* name */
    571 	 TRUE,			/* partial_inplace */
    572 	 0xffffffff,		/* src_mask */
    573 	 0xffffffff,		/* dst_mask */
    574 	 FALSE),	        /* pcrel_offset */
    575 
    576   HOWTO (R_860_LOGOTOFF1,        /* type */
    577 	 0,			/* rightshift */
    578 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    579 	 32,			/* bitsize */
    580 	 FALSE,			/* pc_relative */
    581 	 0,			/* bitpos */
    582 	 complain_overflow_dont, /* complain_on_overflow */
    583 	 bfd_elf_generic_reloc,	/* special_function */
    584 	 "R_860_LOGOTOFF1",	/* name */
    585 	 TRUE,			/* partial_inplace */
    586 	 0xffffffff,		/* src_mask */
    587 	 0xffffffff,		/* dst_mask */
    588 	 FALSE),	        /* pcrel_offset */
    589 
    590   HOWTO (R_860_SPGOTOFF1,       /* type */
    591 	 0,			/* rightshift */
    592 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    593 	 32,			/* bitsize */
    594 	 FALSE,			/* pc_relative */
    595 	 0,			/* bitpos */
    596 	 complain_overflow_dont, /* complain_on_overflow */
    597 	 bfd_elf_generic_reloc,	/* special_function */
    598 	 "R_860_SPGOTOFF1",	/* name */
    599 	 TRUE,			/* partial_inplace */
    600 	 0xffffffff,		/* src_mask */
    601 	 0xffffffff,		/* dst_mask */
    602 	 FALSE),	        /* pcrel_offset */
    603 
    604   HOWTO (R_860_LOGOTOFF2,        /* type */
    605 	 0,			/* rightshift */
    606 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    607 	 32,			/* bitsize */
    608 	 FALSE,			/* pc_relative */
    609 	 0,			/* bitpos */
    610 	 complain_overflow_dont, /* complain_on_overflow */
    611 	 bfd_elf_generic_reloc,	/* special_function */
    612 	 "R_860_LOGOTOFF2",	/* name */
    613 	 TRUE,			/* partial_inplace */
    614 	 0xffffffff,		/* src_mask */
    615 	 0xffffffff,		/* dst_mask */
    616 	 FALSE),	        /* pcrel_offset */
    617 
    618   HOWTO (R_860_LOGOTOFF3,        /* type */
    619 	 0,			/* rightshift */
    620 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    621 	 32,			/* bitsize */
    622 	 FALSE,			/* pc_relative */
    623 	 0,			/* bitpos */
    624 	 complain_overflow_dont, /* complain_on_overflow */
    625 	 bfd_elf_generic_reloc,	/* special_function */
    626 	 "R_860_LOGOTOFF3",	/* name */
    627 	 TRUE,			/* partial_inplace */
    628 	 0xffffffff,		/* src_mask */
    629 	 0xffffffff,		/* dst_mask */
    630 	 FALSE),	        /* pcrel_offset */
    631 
    632   HOWTO (R_860_LOPC,	        /* type */
    633 	 0,			/* rightshift */
    634 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    635 	 16,			/* bitsize */
    636 	 TRUE,			/* pc_relative */
    637 	 0,			/* bitpos */
    638 	 complain_overflow_bitfield, /* complain_on_overflow */
    639 	 bfd_elf_generic_reloc,	/* special_function */
    640 	 "R_860_LOPC",		/* name */
    641 	 FALSE,			/* partial_inplace */
    642 	 0xffff,		/* src_mask */
    643 	 0xffff,		/* dst_mask */
    644 	 TRUE),		        /* pcrel_offset */
    645 
    646   HOWTO (R_860_HIGHADJ,	        /* type */
    647 	 0,			/* rightshift */
    648 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    649 	 16,			/* bitsize */
    650 	 FALSE,			/* pc_relative */
    651 	 0,			/* bitpos */
    652 	 complain_overflow_dont, /* complain_on_overflow */
    653 	 i860_howto_highadj_reloc, /* special_function */
    654 	 "R_860_HIGHADJ",	/* name */
    655 	 FALSE,			/* partial_inplace */
    656 	 0xffff,		/* src_mask */
    657 	 0xffff,		/* dst_mask */
    658 	 FALSE),	        /* pcrel_offset */
    659 
    660   HOWTO (R_860_HAGOT,	        /* type */
    661 	 0,			/* rightshift */
    662 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    663 	 16,			/* bitsize */
    664 	 FALSE,			/* pc_relative */
    665 	 0,			/* bitpos */
    666 	 complain_overflow_dont, /* complain_on_overflow */
    667 	 bfd_elf_generic_reloc,	/* special_function */
    668 	 "R_860_HAGOT",		/* name */
    669 	 FALSE,			/* partial_inplace */
    670 	 0,			/* src_mask */
    671 	 0xffff,		/* dst_mask */
    672 	 TRUE),		        /* pcrel_offset */
    673 
    674   HOWTO (R_860_HAGOTOFF,        /* type */
    675 	 0,			/* rightshift */
    676 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    677 	 32,			/* bitsize */
    678 	 FALSE,			/* pc_relative */
    679 	 0,			/* bitpos */
    680 	 complain_overflow_dont, /* complain_on_overflow */
    681 	 bfd_elf_generic_reloc,	/* special_function */
    682 	 "R_860_HAGOTOFF",	/* name */
    683 	 TRUE,			/* partial_inplace */
    684 	 0xffffffff,		/* src_mask */
    685 	 0xffffffff,		/* dst_mask */
    686 	 FALSE),	        /* pcrel_offset */
    687 
    688   HOWTO (R_860_HAPC,	        /* type */
    689 	 0,			/* rightshift */
    690 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    691 	 16,			/* bitsize */
    692 	 TRUE,			/* pc_relative */
    693 	 0,			/* bitpos */
    694 	 complain_overflow_bitfield, /* complain_on_overflow */
    695 	 bfd_elf_generic_reloc,	/* special_function */
    696 	 "R_860_HAPC",		/* name */
    697 	 FALSE,			/* partial_inplace */
    698 	 0xffff,		/* src_mask */
    699 	 0xffff,		/* dst_mask */
    700 	 TRUE),		        /* pcrel_offset */
    701 
    702   HOWTO (R_860_HIGH,	        /* type */
    703 	 16,			/* rightshift */
    704 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    705 	 16,			/* bitsize */
    706 	 FALSE,			/* pc_relative */
    707 	 0,			/* bitpos */
    708 	 complain_overflow_dont, /* complain_on_overflow */
    709 	 bfd_elf_generic_reloc,	/* special_function */
    710 	 "R_860_HIGH",		/* name */
    711 	 FALSE,			/* partial_inplace */
    712 	 0xffff,		/* src_mask */
    713 	 0xffff,		/* dst_mask */
    714 	 FALSE),	        /* pcrel_offset */
    715 
    716   HOWTO (R_860_HIGOT,	        /* type */
    717 	 0,			/* rightshift */
    718 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    719 	 16,			/* bitsize */
    720 	 FALSE,			/* pc_relative */
    721 	 0,			/* bitpos */
    722 	 complain_overflow_dont, /* complain_on_overflow */
    723 	 bfd_elf_generic_reloc,	/* special_function */
    724 	 "R_860_HIGOT",		/* name */
    725 	 FALSE,			/* partial_inplace */
    726 	 0,			/* src_mask */
    727 	 0xffff,		/* dst_mask */
    728 	 TRUE),		        /* pcrel_offset */
    729 
    730   HOWTO (R_860_HIGOTOFF,        /* type */
    731 	 0,			/* rightshift */
    732 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    733 	 32,			/* bitsize */
    734 	 FALSE,			/* pc_relative */
    735 	 0,			/* bitpos */
    736 	 complain_overflow_dont, /* complain_on_overflow */
    737 	 bfd_elf_generic_reloc,	/* special_function */
    738 	 "R_860_HIGOTOFF",	/* name */
    739 	 TRUE,			/* partial_inplace */
    740 	 0xffffffff,		/* src_mask */
    741 	 0xffffffff,		/* dst_mask */
    742 	 FALSE),	        /* pcrel_offset */
    743 };
    744 
    745 static unsigned char elf_code_to_howto_index[R_860_max + 1];
    747 
    748 static reloc_howto_type *
    749 lookup_howto (unsigned int rtype)
    750 {
    751   static int initialized = 0;
    752   int i;
    753   int howto_tbl_size = (int) (sizeof (elf32_i860_howto_table)
    754 			/ sizeof (elf32_i860_howto_table[0]));
    755 
    756   if (! initialized)
    757     {
    758       initialized = 1;
    759       memset (elf_code_to_howto_index, 0xff,
    760 	      sizeof (elf_code_to_howto_index));
    761       for (i = 0; i < howto_tbl_size; i++)
    762         elf_code_to_howto_index[elf32_i860_howto_table[i].type] = i;
    763     }
    764 
    765   BFD_ASSERT (rtype <= R_860_max);
    766   i = elf_code_to_howto_index[rtype];
    767   if (i >= howto_tbl_size)
    768     return 0;
    769   return elf32_i860_howto_table + i;
    770 }
    771 
    772 /* Given a BFD reloc, return the matching HOWTO structure.  */
    773 static reloc_howto_type *
    774 elf32_i860_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    775 			      bfd_reloc_code_real_type code)
    776 {
    777   unsigned int rtype;
    778 
    779   switch (code)
    780     {
    781     case BFD_RELOC_NONE:
    782       rtype = R_860_NONE;
    783       break;
    784     case BFD_RELOC_32:
    785       rtype = R_860_32;
    786       break;
    787     case BFD_RELOC_860_COPY:
    788       rtype = R_860_COPY;
    789       break;
    790     case BFD_RELOC_860_GLOB_DAT:
    791       rtype = R_860_GLOB_DAT;
    792       break;
    793     case BFD_RELOC_860_JUMP_SLOT:
    794       rtype = R_860_JUMP_SLOT;
    795       break;
    796     case BFD_RELOC_860_RELATIVE:
    797       rtype = R_860_RELATIVE;
    798       break;
    799     case BFD_RELOC_860_PC26:
    800       rtype = R_860_PC26;
    801       break;
    802     case BFD_RELOC_860_PLT26:
    803       rtype = R_860_PLT26;
    804       break;
    805     case BFD_RELOC_860_PC16:
    806       rtype = R_860_PC16;
    807       break;
    808     case BFD_RELOC_860_LOW0:
    809       rtype = R_860_LOW0;
    810       break;
    811     case BFD_RELOC_860_SPLIT0:
    812       rtype = R_860_SPLIT0;
    813       break;
    814     case BFD_RELOC_860_LOW1:
    815       rtype = R_860_LOW1;
    816       break;
    817     case BFD_RELOC_860_SPLIT1:
    818       rtype = R_860_SPLIT1;
    819       break;
    820     case BFD_RELOC_860_LOW2:
    821       rtype = R_860_LOW2;
    822       break;
    823     case BFD_RELOC_860_SPLIT2:
    824       rtype = R_860_SPLIT2;
    825       break;
    826     case BFD_RELOC_860_LOW3:
    827       rtype = R_860_LOW3;
    828       break;
    829     case BFD_RELOC_860_LOGOT0:
    830       rtype = R_860_LOGOT0;
    831       break;
    832     case BFD_RELOC_860_SPGOT0:
    833       rtype = R_860_SPGOT0;
    834       break;
    835     case BFD_RELOC_860_LOGOT1:
    836       rtype = R_860_LOGOT1;
    837       break;
    838     case BFD_RELOC_860_SPGOT1:
    839       rtype = R_860_SPGOT1;
    840       break;
    841     case BFD_RELOC_860_LOGOTOFF0:
    842       rtype = R_860_LOGOTOFF0;
    843       break;
    844     case BFD_RELOC_860_SPGOTOFF0:
    845       rtype = R_860_SPGOTOFF0;
    846       break;
    847     case BFD_RELOC_860_LOGOTOFF1:
    848       rtype = R_860_LOGOTOFF1;
    849       break;
    850     case BFD_RELOC_860_SPGOTOFF1:
    851       rtype = R_860_SPGOTOFF1;
    852       break;
    853     case BFD_RELOC_860_LOGOTOFF2:
    854       rtype = R_860_LOGOTOFF2;
    855       break;
    856     case BFD_RELOC_860_LOGOTOFF3:
    857       rtype = R_860_LOGOTOFF3;
    858       break;
    859     case BFD_RELOC_860_LOPC:
    860       rtype = R_860_LOPC;
    861       break;
    862     case BFD_RELOC_860_HIGHADJ:
    863       rtype = R_860_HIGHADJ;
    864       break;
    865     case BFD_RELOC_860_HAGOT:
    866       rtype = R_860_HAGOT;
    867       break;
    868     case BFD_RELOC_860_HAGOTOFF:
    869       rtype = R_860_HAGOTOFF;
    870       break;
    871     case BFD_RELOC_860_HAPC:
    872       rtype = R_860_HAPC;
    873       break;
    874     case BFD_RELOC_860_HIGH:
    875       rtype = R_860_HIGH;
    876       break;
    877     case BFD_RELOC_860_HIGOT:
    878       rtype = R_860_HIGOT;
    879       break;
    880     case BFD_RELOC_860_HIGOTOFF:
    881       rtype = R_860_HIGOTOFF;
    882       break;
    883     default:
    884       rtype = 0;
    885       break;
    886     }
    887   return lookup_howto (rtype);
    888 }
    889 
    890 static reloc_howto_type *
    891 elf32_i860_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    892 			      const char *r_name)
    893 {
    894   unsigned int i;
    895 
    896   for (i = 0;
    897        i < (sizeof (elf32_i860_howto_table)
    898 	    / sizeof (elf32_i860_howto_table[0]));
    899        i++)
    900     if (elf32_i860_howto_table[i].name != NULL
    901 	&& strcasecmp (elf32_i860_howto_table[i].name, r_name) == 0)
    902       return &elf32_i860_howto_table[i];
    903 
    904   return NULL;
    905 }
    906 
    907 /* Given a ELF reloc, return the matching HOWTO structure.  */
    908 static void
    909 elf32_i860_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
    910 			       arelent *bfd_reloc,
    911 			       Elf_Internal_Rela *elf_reloc)
    912 {
    913   bfd_reloc->howto
    914     = lookup_howto ((unsigned) ELF32_R_TYPE (elf_reloc->r_info));
    915 }
    916 
    917 /* Specialized relocation handler for R_860_SPLITn.  These relocations
    919    involves a 16-bit field that is split into two contiguous parts.  */
    920 static bfd_reloc_status_type
    921 elf32_i860_relocate_splitn (bfd *input_bfd,
    922 			    Elf_Internal_Rela *rello,
    923 			    bfd_byte *contents,
    924 			    bfd_vma value)
    925 {
    926   bfd_vma insn;
    927   reloc_howto_type *howto;
    928   howto = lookup_howto ((unsigned) ELF32_R_TYPE (rello->r_info));
    929   insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
    930 
    931   /* Relocate.  */
    932   value += rello->r_addend;
    933 
    934   /* Separate the fields and insert.  */
    935   value = (((value & 0xf800) << 5) | (value & 0x7ff)) & howto->dst_mask;
    936   insn = (insn & ~howto->dst_mask) | value;
    937 
    938   bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
    939   return bfd_reloc_ok;
    940 }
    941 
    942 /* Specialized relocation handler for R_860_PC16.  This relocation
    943    involves a 16-bit, PC-relative field that is split into two contiguous
    944    parts.  */
    945 static bfd_reloc_status_type
    946 elf32_i860_relocate_pc16 (bfd *input_bfd,
    947 			  asection *input_section,
    948 			  Elf_Internal_Rela *rello,
    949 			  bfd_byte *contents,
    950 			  bfd_vma value)
    951 {
    952   bfd_vma insn;
    953   reloc_howto_type *howto;
    954   howto = lookup_howto ((unsigned) ELF32_R_TYPE (rello->r_info));
    955   insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
    956 
    957   /* Adjust for PC-relative relocation.  */
    958   value -= (input_section->output_section->vma
    959 	    + input_section->output_offset);
    960   value -= rello->r_offset;
    961 
    962   /* Relocate.  */
    963   value += rello->r_addend;
    964 
    965   /* Adjust the value by 4, then separate the fields and insert.  */
    966   value = (value - 4) >> howto->rightshift;
    967   value = (((value & 0xf800) << 5) | (value & 0x7ff)) & howto->dst_mask;
    968   insn = (insn & ~howto->dst_mask) | value;
    969 
    970   bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
    971   return bfd_reloc_ok;
    972 
    973 }
    974 
    975 /* Specialized relocation handler for R_860_PC26.  This relocation
    976    involves a 26-bit, PC-relative field which must be adjusted by 4.  */
    977 static bfd_reloc_status_type
    978 elf32_i860_relocate_pc26 (bfd *input_bfd,
    979 			  asection *input_section,
    980 			  Elf_Internal_Rela *rello,
    981 			  bfd_byte *contents,
    982 			  bfd_vma value)
    983 {
    984   bfd_vma insn;
    985   reloc_howto_type *howto;
    986   howto = lookup_howto ((unsigned) ELF32_R_TYPE (rello->r_info));
    987   insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
    988 
    989   /* Adjust for PC-relative relocation.  */
    990   value -= (input_section->output_section->vma
    991 	    + input_section->output_offset);
    992   value -= rello->r_offset;
    993 
    994   /* Relocate.  */
    995   value += rello->r_addend;
    996 
    997   /* Adjust value by 4 and insert the field.  */
    998   value = ((value - 4) >> howto->rightshift) & howto->dst_mask;
    999   insn = (insn & ~howto->dst_mask) | value;
   1000 
   1001   bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
   1002   return bfd_reloc_ok;
   1003 
   1004 }
   1005 
   1006 /* Specialized relocation handler for R_860_HIGHADJ.  */
   1007 static bfd_reloc_status_type
   1008 elf32_i860_relocate_highadj (bfd *input_bfd,
   1009 			     Elf_Internal_Rela *rel,
   1010 			     bfd_byte *contents,
   1011 			     bfd_vma value)
   1012 {
   1013   bfd_vma insn;
   1014 
   1015   insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
   1016 
   1017   value += rel->r_addend;
   1018   value += 0x8000;
   1019   value = ((value >> 16) & 0xffff);
   1020 
   1021   insn = (insn & 0xffff0000) | value;
   1022 
   1023   bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
   1024   return bfd_reloc_ok;
   1025 }
   1026 
   1027 /* Perform a single relocation.  By default we use the standard BFD
   1028    routines. However, we handle some specially.  */
   1029 static bfd_reloc_status_type
   1030 i860_final_link_relocate (reloc_howto_type *howto,
   1031 			  bfd *input_bfd,
   1032 			  asection *input_section,
   1033 			  bfd_byte *contents,
   1034 			  Elf_Internal_Rela *rel,
   1035 			  bfd_vma relocation)
   1036 {
   1037   return _bfd_final_link_relocate (howto, input_bfd, input_section,
   1038 				   contents, rel->r_offset, relocation,
   1039 				   rel->r_addend);
   1040 }
   1041 
   1042 /* Relocate an i860 ELF section.
   1043 
   1044    This is boiler-plate code copied from fr30.
   1045 
   1046    The RELOCATE_SECTION function is called by the new ELF backend linker
   1047    to handle the relocations for a section.
   1048 
   1049    The relocs are always passed as Rela structures; if the section
   1050    actually uses Rel structures, the r_addend field will always be
   1051    zero.
   1052 
   1053    This function is responsible for adjusting the section contents as
   1054    necessary, and (if using Rela relocs and generating a relocatable
   1055    output file) adjusting the reloc addend as necessary.
   1056 
   1057    This function does not have to worry about setting the reloc
   1058    address or the reloc symbol index.
   1059 
   1060    LOCAL_SYMS is a pointer to the swapped in local symbols.
   1061 
   1062    LOCAL_SECTIONS is an array giving the section in the input file
   1063    corresponding to the st_shndx field of each local symbol.
   1064 
   1065    The global hash table entry for the global symbols can be found
   1066    via elf_sym_hashes (input_bfd).
   1067 
   1068    When generating relocatable output, this function must handle
   1069    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
   1070    going to be the section symbol corresponding to the output
   1071    section, which means that the addend must be adjusted
   1072    accordingly.  */
   1073 static bfd_boolean
   1074 elf32_i860_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
   1075 			     struct bfd_link_info *info,
   1076 			     bfd *input_bfd,
   1077 			     asection *input_section,
   1078 			     bfd_byte *contents,
   1079 			     Elf_Internal_Rela *relocs,
   1080 			     Elf_Internal_Sym *local_syms,
   1081 			     asection **local_sections)
   1082 {
   1083   Elf_Internal_Shdr *symtab_hdr;
   1084   struct elf_link_hash_entry **sym_hashes;
   1085   Elf_Internal_Rela *rel;
   1086   Elf_Internal_Rela *relend;
   1087 
   1088   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
   1089   sym_hashes = elf_sym_hashes (input_bfd);
   1090   relend     = relocs + input_section->reloc_count;
   1091 
   1092   for (rel = relocs; rel < relend; rel ++)
   1093     {
   1094       reloc_howto_type *           howto;
   1095       unsigned long                r_symndx;
   1096       Elf_Internal_Sym *           sym;
   1097       asection *                   sec;
   1098       struct elf_link_hash_entry * h;
   1099       bfd_vma                      relocation;
   1100       bfd_reloc_status_type        r;
   1101       const char *                 name = NULL;
   1102       int                          r_type;
   1103 
   1104       r_type = ELF32_R_TYPE (rel->r_info);
   1105       r_symndx = ELF32_R_SYM (rel->r_info);
   1106 
   1107       howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info));
   1108       h     = NULL;
   1109       sym   = NULL;
   1110       sec   = NULL;
   1111 
   1112       if (r_symndx < symtab_hdr->sh_info)
   1113 	{
   1114 	  sym = local_syms + r_symndx;
   1115 	  sec = local_sections [r_symndx];
   1116 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   1117 
   1118 	  name = bfd_elf_string_from_elf_section
   1119 	    (input_bfd, symtab_hdr->sh_link, sym->st_name);
   1120 	  name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
   1121 	}
   1122       else
   1123 	{
   1124 	  bfd_boolean unresolved_reloc, warned, ignored;
   1125 
   1126 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   1127 				   r_symndx, symtab_hdr, sym_hashes,
   1128 				   h, sec, relocation,
   1129 				   unresolved_reloc, warned, ignored);
   1130 	}
   1131 
   1132       if (sec != NULL && discarded_section (sec))
   1133 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   1134 					 rel, 1, relend, howto, 0, contents);
   1135 
   1136       if (bfd_link_relocatable (info))
   1137 	continue;
   1138 
   1139       switch (r_type)
   1140 	{
   1141 	default:
   1142 	  r = i860_final_link_relocate (howto, input_bfd, input_section,
   1143 					contents, rel, relocation);
   1144 	  break;
   1145 
   1146 	case R_860_HIGHADJ:
   1147 	  r = elf32_i860_relocate_highadj (input_bfd, rel, contents,
   1148 					   relocation);
   1149 	  break;
   1150 
   1151 	case R_860_PC16:
   1152 	  r = elf32_i860_relocate_pc16 (input_bfd, input_section, rel,
   1153 					contents, relocation);
   1154 	  break;
   1155 
   1156 	case R_860_PC26:
   1157 	  r = elf32_i860_relocate_pc26 (input_bfd, input_section, rel,
   1158 					contents, relocation);
   1159 	  break;
   1160 
   1161 	case R_860_SPLIT0:
   1162 	case R_860_SPLIT1:
   1163 	case R_860_SPLIT2:
   1164 	  r = elf32_i860_relocate_splitn (input_bfd, rel, contents,
   1165 					  relocation);
   1166 	  break;
   1167 
   1168 	/* We do not yet handle GOT/PLT/Dynamic relocations.  */
   1169 	case R_860_COPY:
   1170 	case R_860_GLOB_DAT:
   1171 	case R_860_JUMP_SLOT:
   1172 	case R_860_RELATIVE:
   1173 	case R_860_PLT26:
   1174 	case R_860_LOGOT0:
   1175 	case R_860_SPGOT0:
   1176 	case R_860_LOGOT1:
   1177 	case R_860_SPGOT1:
   1178 	case R_860_LOGOTOFF0:
   1179 	case R_860_SPGOTOFF0:
   1180 	case R_860_LOGOTOFF1:
   1181 	case R_860_SPGOTOFF1:
   1182 	case R_860_LOGOTOFF2:
   1183 	case R_860_LOGOTOFF3:
   1184 	case R_860_LOPC:
   1185 	case R_860_HAGOT:
   1186 	case R_860_HAGOTOFF:
   1187 	case R_860_HAPC:
   1188 	case R_860_HIGOT:
   1189 	case R_860_HIGOTOFF:
   1190 	  r = bfd_reloc_notsupported;
   1191 	  break;
   1192 	}
   1193 
   1194       if (r != bfd_reloc_ok)
   1195 	{
   1196 	  const char * msg = (const char *) NULL;
   1197 
   1198 	  switch (r)
   1199 	    {
   1200 	    case bfd_reloc_overflow:
   1201 	      (*info->callbacks->reloc_overflow)
   1202 		(info, (h ? &h->root : NULL), name, howto->name,
   1203 		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
   1204 	      break;
   1205 
   1206 	    case bfd_reloc_undefined:
   1207 	      (*info->callbacks->undefined_symbol)
   1208 		(info, name, input_bfd, input_section, rel->r_offset, TRUE);
   1209 	      break;
   1210 
   1211 	    case bfd_reloc_outofrange:
   1212 	      msg = _("internal error: out of range error");
   1213 	      break;
   1214 
   1215 	    case bfd_reloc_notsupported:
   1216 	      msg = _("internal error: unsupported relocation error");
   1217 	      break;
   1218 
   1219 	    case bfd_reloc_dangerous:
   1220 	      msg = _("internal error: dangerous relocation");
   1221 	      break;
   1222 
   1223 	    default:
   1224 	      msg = _("internal error: unknown error");
   1225 	      break;
   1226 	    }
   1227 
   1228 	  if (msg)
   1229 	    (*info->callbacks->warning) (info, msg, name, input_bfd,
   1230 					 input_section, rel->r_offset);
   1231 	}
   1232     }
   1233 
   1234   return TRUE;
   1235 }
   1236 
   1237 /* Return whether a symbol name implies a local label.  SVR4/860 compilers
   1238    generate labels of the form ".ep.function_name" to denote the end of a
   1239    function prolog. These should be local.
   1240    ??? Do any other SVR4 compilers have this convention? If so, this should
   1241    be added to the generic routine.  */
   1242 static bfd_boolean
   1243 elf32_i860_is_local_label_name (bfd *abfd, const char *name)
   1244 {
   1245   if (name[0] == '.' && name[1] == 'e' && name[2] == 'p' && name[3] == '.')
   1246     return TRUE;
   1247 
   1248   return _bfd_elf_is_local_label_name (abfd, name);
   1249 }
   1250 
   1251 #define TARGET_BIG_SYM		i860_elf32_vec
   1253 #define TARGET_BIG_NAME		"elf32-i860"
   1254 #define TARGET_LITTLE_SYM	i860_elf32_le_vec
   1255 #define TARGET_LITTLE_NAME	"elf32-i860-little"
   1256 #define ELF_ARCH		bfd_arch_i860
   1257 #define ELF_MACHINE_CODE	EM_860
   1258 #define ELF_MAXPAGESIZE		4096
   1259 
   1260 #define elf_backend_rela_normal			1
   1261 #define elf_info_to_howto_rel                   NULL
   1262 #define elf_info_to_howto			elf32_i860_info_to_howto_rela
   1263 #define elf_backend_relocate_section		elf32_i860_relocate_section
   1264 #define bfd_elf32_bfd_reloc_type_lookup		elf32_i860_reloc_type_lookup
   1265 #define bfd_elf32_bfd_reloc_name_lookup	elf32_i860_reloc_name_lookup
   1266 #define bfd_elf32_bfd_is_local_label_name	elf32_i860_is_local_label_name
   1267 
   1268 #include "elf32-target.h"
   1269