Back to index

cell-binutils  2.17cvs20070401
Defines | Functions | Variables
elf32-i860.c File Reference
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
#include "elf-bfd.h"
#include "elf/i860.h"
#include "elf32-target.h"

Go to the source code of this file.

Defines

#define TARGET_BIG_SYM   bfd_elf32_i860_vec
#define TARGET_BIG_NAME   "elf32-i860"
#define TARGET_LITTLE_SYM   bfd_elf32_i860_little_vec
#define TARGET_LITTLE_NAME   "elf32-i860-little"
#define ELF_ARCH   bfd_arch_i860
#define ELF_MACHINE_CODE   EM_860
#define ELF_MAXPAGESIZE   4096
#define elf_backend_rela_normal   1
#define elf_info_to_howto_rel   NULL
#define elf_info_to_howto   elf32_i860_info_to_howto_rela
#define elf_backend_relocate_section   elf32_i860_relocate_section
#define bfd_elf32_bfd_reloc_type_lookup   elf32_i860_reloc_type_lookup
#define bfd_elf32_bfd_reloc_name_lookup   elf32_i860_reloc_name_lookup
#define bfd_elf32_bfd_is_local_label_name   elf32_i860_is_local_label_name

Functions

static bfd_reloc_status_type i860_howto_pc26_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, asymbol *symbol, void *data ATTRIBUTE_UNUSED, asection *input_section, bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
static bfd_reloc_status_type i860_howto_pc16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, void *data, asection *input_section, bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
static bfd_reloc_status_type i860_howto_highadj_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, void *data, asection *input_section, bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
static bfd_reloc_status_type i860_howto_splitn_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, void *data, asection *input_section, bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
static reloc_howto_type * lookup_howto (unsigned int rtype)
static reloc_howto_type * elf32_i860_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, bfd_reloc_code_real_type code)
static reloc_howto_type * elf32_i860_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
static void elf32_i860_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc, Elf_Internal_Rela *elf_reloc)
static bfd_reloc_status_type elf32_i860_relocate_splitn (bfd *input_bfd, Elf_Internal_Rela *rello, bfd_byte *contents, bfd_vma value)
static bfd_reloc_status_type elf32_i860_relocate_pc16 (bfd *input_bfd, asection *input_section, Elf_Internal_Rela *rello, bfd_byte *contents, bfd_vma value)
static bfd_reloc_status_type elf32_i860_relocate_pc26 (bfd *input_bfd, asection *input_section, Elf_Internal_Rela *rello, bfd_byte *contents, bfd_vma value)
static bfd_reloc_status_type elf32_i860_relocate_highadj (bfd *input_bfd, Elf_Internal_Rela *rel, bfd_byte *contents, bfd_vma value)
static bfd_reloc_status_type i860_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd, asection *input_section, bfd_byte *contents, Elf_Internal_Rela *rel, bfd_vma relocation)
static bfd_boolean elf32_i860_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, struct bfd_link_info *info, bfd *input_bfd, asection *input_section, bfd_byte *contents, Elf_Internal_Rela *relocs, Elf_Internal_Sym *local_syms, asection **local_sections)
static bfd_boolean elf32_i860_is_local_label_name (bfd *abfd, const char *name)

Variables

static reloc_howto_type elf32_i860_howto_table []
static unsigned char elf_code_to_howto_index [R_860_max+1]

Define Documentation

Definition at line 1273 of file elf32-i860.c.

Definition at line 1272 of file elf32-i860.c.

Definition at line 1271 of file elf32-i860.c.

#define ELF_ARCH   bfd_arch_i860

Definition at line 1263 of file elf32-i860.c.

#define elf_backend_rela_normal   1

Definition at line 1267 of file elf32-i860.c.

Definition at line 1270 of file elf32-i860.c.

Definition at line 1269 of file elf32-i860.c.

Definition at line 1268 of file elf32-i860.c.

#define ELF_MACHINE_CODE   EM_860

Definition at line 1264 of file elf32-i860.c.

#define ELF_MAXPAGESIZE   4096

Definition at line 1265 of file elf32-i860.c.

#define TARGET_BIG_NAME   "elf32-i860"

Definition at line 1260 of file elf32-i860.c.

Definition at line 1259 of file elf32-i860.c.

#define TARGET_LITTLE_NAME   "elf32-i860-little"

Definition at line 1262 of file elf32-i860.c.

Definition at line 1261 of file elf32-i860.c.


Function Documentation

static void elf32_i860_info_to_howto_rela ( bfd *abfd  ATTRIBUTE_UNUSED,
arelent bfd_reloc,
Elf_Internal_Rela elf_reloc 
) [static]

Definition at line 908 of file elf32-i860.c.

{
  bfd_reloc->howto
    = lookup_howto ((unsigned) ELF32_R_TYPE (elf_reloc->r_info));
}

Here is the call graph for this function:

static bfd_boolean elf32_i860_is_local_label_name ( bfd abfd,
const char *  name 
) [static]

Definition at line 1251 of file elf32-i860.c.

{
  if (name[0] == '.' && name[1] == 'e' && name[2] == 'p' && name[3] == '.')
    return TRUE;

  return _bfd_elf_is_local_label_name (abfd, name);
}

Here is the call graph for this function:

static reloc_howto_type* elf32_i860_reloc_name_lookup ( bfd *abfd  ATTRIBUTE_UNUSED,
const char *  r_name 
) [static]

Definition at line 890 of file elf32-i860.c.

{
  unsigned int i;

  for (i = 0;
       i < (sizeof (elf32_i860_howto_table)
           / sizeof (elf32_i860_howto_table[0]));
       i++)
    if (elf32_i860_howto_table[i].name != NULL
       && strcasecmp (elf32_i860_howto_table[i].name, r_name) == 0)
      return &elf32_i860_howto_table[i];

  return NULL;
}

Here is the call graph for this function:

static reloc_howto_type* elf32_i860_reloc_type_lookup ( bfd *abfd  ATTRIBUTE_UNUSED,
bfd_reloc_code_real_type  code 
) [static]

Definition at line 773 of file elf32-i860.c.

{
  unsigned int rtype;

  switch (code)
    {
    case BFD_RELOC_NONE:
      rtype = R_860_NONE;
      break;
    case BFD_RELOC_32:
      rtype = R_860_32;
      break;
    case BFD_RELOC_860_COPY:
      rtype = R_860_COPY;
      break;
    case BFD_RELOC_860_GLOB_DAT:
      rtype = R_860_GLOB_DAT;
      break;
    case BFD_RELOC_860_JUMP_SLOT:
      rtype = R_860_JUMP_SLOT;
      break;
    case BFD_RELOC_860_RELATIVE:
      rtype = R_860_RELATIVE;
      break;
    case BFD_RELOC_860_PC26:
      rtype = R_860_PC26;
      break;
    case BFD_RELOC_860_PLT26:
      rtype = R_860_PLT26;
      break;
    case BFD_RELOC_860_PC16:
      rtype = R_860_PC16;
      break;
    case BFD_RELOC_860_LOW0:
      rtype = R_860_LOW0;
      break;
    case BFD_RELOC_860_SPLIT0:
      rtype = R_860_SPLIT0;
      break;
    case BFD_RELOC_860_LOW1:
      rtype = R_860_LOW1;
      break;
    case BFD_RELOC_860_SPLIT1:
      rtype = R_860_SPLIT1;
      break;
    case BFD_RELOC_860_LOW2:
      rtype = R_860_LOW2;
      break;
    case BFD_RELOC_860_SPLIT2:
      rtype = R_860_SPLIT2;
      break;
    case BFD_RELOC_860_LOW3:
      rtype = R_860_LOW3;
      break;
    case BFD_RELOC_860_LOGOT0:
      rtype = R_860_LOGOT0;
      break;
    case BFD_RELOC_860_SPGOT0:
      rtype = R_860_SPGOT0;
      break;
    case BFD_RELOC_860_LOGOT1:
      rtype = R_860_LOGOT1;
      break;
    case BFD_RELOC_860_SPGOT1:
      rtype = R_860_SPGOT1;
      break;
    case BFD_RELOC_860_LOGOTOFF0:
      rtype = R_860_LOGOTOFF0;
      break;
    case BFD_RELOC_860_SPGOTOFF0:
      rtype = R_860_SPGOTOFF0;
      break;
    case BFD_RELOC_860_LOGOTOFF1:
      rtype = R_860_LOGOTOFF1;
      break;
    case BFD_RELOC_860_SPGOTOFF1:
      rtype = R_860_SPGOTOFF1;
      break;
    case BFD_RELOC_860_LOGOTOFF2:
      rtype = R_860_LOGOTOFF2;
      break;
    case BFD_RELOC_860_LOGOTOFF3:
      rtype = R_860_LOGOTOFF3;
      break;
    case BFD_RELOC_860_LOPC:
      rtype = R_860_LOPC;
      break;
    case BFD_RELOC_860_HIGHADJ:
      rtype = R_860_HIGHADJ;
      break;
    case BFD_RELOC_860_HAGOT:
      rtype = R_860_HAGOT;
      break;
    case BFD_RELOC_860_HAGOTOFF:
      rtype = R_860_HAGOTOFF;
      break;
    case BFD_RELOC_860_HAPC:
      rtype = R_860_HAPC;
      break;
    case BFD_RELOC_860_HIGH:
      rtype = R_860_HIGH;
      break;
    case BFD_RELOC_860_HIGOT:
      rtype = R_860_HIGOT;
      break;
    case BFD_RELOC_860_HIGOTOFF:
      rtype = R_860_HIGOTOFF;
      break;
    default:
      rtype = 0;
      break;
    }
  return lookup_howto (rtype);
}

Here is the call graph for this function:

static bfd_reloc_status_type elf32_i860_relocate_highadj ( bfd input_bfd,
Elf_Internal_Rela rel,
bfd_byte contents,
bfd_vma  value 
) [static]

Definition at line 1006 of file elf32-i860.c.

{
  bfd_vma insn;

  insn = bfd_get_32 (input_bfd, contents + rel->r_offset);

  value += rel->r_addend;
  value += 0x8000; 
  value = ((value >> 16) & 0xffff);

  insn = (insn & 0xffff0000) | value;

  bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
  return bfd_reloc_ok;
}

Here is the caller graph for this function:

static bfd_reloc_status_type elf32_i860_relocate_pc16 ( bfd input_bfd,
asection input_section,
Elf_Internal_Rela rello,
bfd_byte contents,
bfd_vma  value 
) [static]

Definition at line 944 of file elf32-i860.c.

{
  bfd_vma insn;
  reloc_howto_type *howto;
  howto = lookup_howto ((unsigned) ELF32_R_TYPE (rello->r_info));
  insn = bfd_get_32 (input_bfd, contents + rello->r_offset);

  /* Adjust for PC-relative relocation.  */
  value -= (input_section->output_section->vma
           + input_section->output_offset);
  value -= rello->r_offset;

  /* Relocate.  */
  value += rello->r_addend;

  /* Adjust the value by 4, then separate the fields and insert.  */
  value = (value - 4) >> howto->rightshift;
  value = (((value & 0xf800) << 5) | (value & 0x7ff)) & howto->dst_mask;
  insn = (insn & ~howto->dst_mask) | value;

  bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
  return bfd_reloc_ok;

}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_reloc_status_type elf32_i860_relocate_pc26 ( bfd input_bfd,
asection input_section,
Elf_Internal_Rela rello,
bfd_byte contents,
bfd_vma  value 
) [static]

Definition at line 976 of file elf32-i860.c.

{
  bfd_vma insn;
  reloc_howto_type *howto;
  howto = lookup_howto ((unsigned) ELF32_R_TYPE (rello->r_info));
  insn = bfd_get_32 (input_bfd, contents + rello->r_offset);

  /* Adjust for PC-relative relocation.  */
  value -= (input_section->output_section->vma
           + input_section->output_offset);
  value -= rello->r_offset;

  /* Relocate.  */
  value += rello->r_addend;

  /* Adjust value by 4 and insert the field.  */
  value = ((value - 4) >> howto->rightshift) & howto->dst_mask;
  insn = (insn & ~howto->dst_mask) | value;

  bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
  return bfd_reloc_ok;

}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_boolean elf32_i860_relocate_section ( bfd *output_bfd  ATTRIBUTE_UNUSED,
struct bfd_link_info info,
bfd input_bfd,
asection input_section,
bfd_byte contents,
Elf_Internal_Rela relocs,
Elf_Internal_Sym *  local_syms,
asection **  local_sections 
) [static]

Definition at line 1072 of file elf32-i860.c.

{
  Elf_Internal_Shdr *symtab_hdr;
  struct elf_link_hash_entry **sym_hashes;
  Elf_Internal_Rela *rel;
  Elf_Internal_Rela *relend;

  symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
  sym_hashes = elf_sym_hashes (input_bfd);
  relend     = relocs + input_section->reloc_count;

  for (rel = relocs; rel < relend; rel ++)
    {
      reloc_howto_type *           howto;
      unsigned long                r_symndx;
      Elf_Internal_Sym *           sym;
      asection *                   sec;
      struct elf_link_hash_entry * h;
      bfd_vma                      relocation;
      bfd_reloc_status_type        r;
      const char *                 name = NULL;
      int                          r_type;

      r_type = ELF32_R_TYPE (rel->r_info);
      r_symndx = ELF32_R_SYM (rel->r_info);

      howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info));
      h     = NULL;
      sym   = NULL;
      sec   = NULL;

      if (r_symndx < symtab_hdr->sh_info)
       {
         sym = local_syms + r_symndx;
         sec = local_sections [r_symndx];
         relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);

         name = bfd_elf_string_from_elf_section
           (input_bfd, symtab_hdr->sh_link, sym->st_name);
         name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
       }
      else
       {
         bfd_boolean unresolved_reloc, warned;

         RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
                               r_symndx, symtab_hdr, sym_hashes,
                               h, sec, relocation,
                               unresolved_reloc, warned);
       }

      if (sec != NULL && elf_discarded_section (sec))
       {
         /* For relocs against symbols from removed linkonce sections,
            or sections discarded by a linker script, we just want the
            section contents zeroed.  Avoid any special processing.  */
         _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
         rel->r_info = 0;
         rel->r_addend = 0;
         continue;
       }

      if (info->relocatable)
       continue;

      switch (r_type)
       {
       default:
         r = i860_final_link_relocate (howto, input_bfd, input_section,
                                   contents, rel, relocation);
         break;

       case R_860_HIGHADJ:
         r = elf32_i860_relocate_highadj (input_bfd, rel, contents,
                                      relocation);
         break;

       case R_860_PC16:
         r = elf32_i860_relocate_pc16 (input_bfd, input_section, rel,
                                   contents, relocation);
         break;

       case R_860_PC26:
         r = elf32_i860_relocate_pc26 (input_bfd, input_section, rel,
                                   contents, relocation);
         break;

       case R_860_SPLIT0:
       case R_860_SPLIT1:
       case R_860_SPLIT2:
         r = elf32_i860_relocate_splitn (input_bfd, rel, contents,
                                     relocation);
         break;

       /* We do not yet handle GOT/PLT/Dynamic relocations.  */
       case R_860_COPY:
       case R_860_GLOB_DAT:
       case R_860_JUMP_SLOT:
       case R_860_RELATIVE:
       case R_860_PLT26:
       case R_860_LOGOT0:
       case R_860_SPGOT0:
       case R_860_LOGOT1:
       case R_860_SPGOT1:
       case R_860_LOGOTOFF0:
       case R_860_SPGOTOFF0:
       case R_860_LOGOTOFF1:
       case R_860_SPGOTOFF1:
       case R_860_LOGOTOFF2:
       case R_860_LOGOTOFF3:
       case R_860_LOPC:
       case R_860_HAGOT:
       case R_860_HAGOTOFF:
       case R_860_HAPC:
       case R_860_HIGOT:
       case R_860_HIGOTOFF:
         r = bfd_reloc_notsupported;
         break;
       }

      if (r != bfd_reloc_ok)
       {
         const char * msg = (const char *) NULL;

         switch (r)
           {
           case bfd_reloc_overflow:
             r = info->callbacks->reloc_overflow
              (info, (h ? &h->root : NULL), name, howto->name,
               (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
             break;

           case bfd_reloc_undefined:
             r = info->callbacks->undefined_symbol
              (info, name, input_bfd, input_section, rel->r_offset, TRUE);
             break;

           case bfd_reloc_outofrange:
             msg = _("internal error: out of range error");
             break;

           case bfd_reloc_notsupported:
             msg = _("internal error: unsupported relocation error");
             break;

           case bfd_reloc_dangerous:
             msg = _("internal error: dangerous relocation");
             break;

           default:
             msg = _("internal error: unknown error");
             break;
           }

         if (msg)
           r = info->callbacks->warning
             (info, msg, name, input_bfd, input_section, rel->r_offset);

         if (! r)
           return FALSE;
       }
    }

  return TRUE;
}

Here is the call graph for this function:

static bfd_reloc_status_type elf32_i860_relocate_splitn ( bfd input_bfd,
Elf_Internal_Rela rello,
bfd_byte contents,
bfd_vma  value 
) [static]

Definition at line 919 of file elf32-i860.c.

{
  bfd_vma insn;
  reloc_howto_type *howto;
  howto = lookup_howto ((unsigned) ELF32_R_TYPE (rello->r_info));
  insn = bfd_get_32 (input_bfd, contents + rello->r_offset);

  /* Relocate.  */
  value += rello->r_addend;

  /* Separate the fields and insert.  */
  value = (((value & 0xf800) << 5) | (value & 0x7ff)) & howto->dst_mask;
  insn = (insn & ~howto->dst_mask) | value;

  bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
  return bfd_reloc_ok;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_reloc_status_type i860_final_link_relocate ( reloc_howto_type *  howto,
bfd input_bfd,
asection input_section,
bfd_byte contents,
Elf_Internal_Rela rel,
bfd_vma  relocation 
) [static]

Definition at line 1028 of file elf32-i860.c.

{
  return _bfd_final_link_relocate (howto, input_bfd, input_section,
                               contents, rel->r_offset, relocation,
                               rel->r_addend);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_reloc_status_type i860_howto_highadj_reloc ( bfd abfd,
arelent reloc_entry,
asymbol symbol,
void *  data,
asection input_section,
bfd output_bfd,
char **error_message  ATTRIBUTE_UNUSED 
) [static]

Definition at line 158 of file elf32-i860.c.

{
  bfd_vma insn;
  bfd_vma relocation;
  bfd_byte *addr;

  if (output_bfd != NULL
      && (symbol->flags & BSF_SECTION_SYM) == 0
      && (! reloc_entry->howto->partial_inplace
         || reloc_entry->addend == 0))
    {
      reloc_entry->address += input_section->output_offset;
      return bfd_reloc_ok;
    }

  /* Used elf32-mips.c as an example.  */
  if (bfd_is_und_section (symbol->section)
      && output_bfd == (bfd *) NULL)
    return bfd_reloc_undefined;

  if (bfd_is_com_section (symbol->section))
    relocation = 0;
  else
    relocation = symbol->value;

  relocation += symbol->section->output_section->vma;
  relocation += symbol->section->output_offset;
  relocation += reloc_entry->addend;
  relocation += 0x8000;

  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
    return bfd_reloc_outofrange;

  addr = (bfd_byte *) data + reloc_entry->address;
  insn = bfd_get_32 (abfd, addr);

  relocation = ((relocation >> 16) & 0xffff);

  insn = (insn & 0xffff0000) | relocation;

  bfd_put_32 (abfd, (bfd_vma) insn, addr);

  return bfd_reloc_ok;
}
static bfd_reloc_status_type i860_howto_pc16_reloc ( bfd abfd,
arelent reloc_entry,
asymbol symbol,
void *  data,
asection input_section,
bfd output_bfd,
char **error_message  ATTRIBUTE_UNUSED 
) [static]

Definition at line 94 of file elf32-i860.c.

{
  bfd_vma insn;
  bfd_vma relocation;
  bfd_byte *addr;

  if (output_bfd != NULL
      && (symbol->flags & BSF_SECTION_SYM) == 0
      && (! reloc_entry->howto->partial_inplace
         || reloc_entry->addend == 0))
    {
      reloc_entry->address += input_section->output_offset;
      return bfd_reloc_ok;
    }

  /* Used elf32-mips.c as an example.  */
  if (bfd_is_und_section (symbol->section)
      && output_bfd == (bfd *) NULL)
    return bfd_reloc_undefined;

  if (bfd_is_com_section (symbol->section))
    relocation = 0;
  else
    relocation = symbol->value;

  relocation += symbol->section->output_section->vma;
  relocation += symbol->section->output_offset;
  relocation += reloc_entry->addend;

  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
    return bfd_reloc_outofrange;

  /* Adjust for PC-relative relocation.  */
  relocation -= (input_section->output_section->vma
                 + input_section->output_offset
                 + reloc_entry->address
                 + 4);

  /* Check for target out of range.  */
  if ((bfd_signed_vma)relocation > (0x7fff << 2)
      || (bfd_signed_vma)relocation < (-0x8000 << 2))
    return bfd_reloc_outofrange;

  addr = (bfd_byte *) data + reloc_entry->address;
  insn = bfd_get_32 (abfd, addr);

  relocation >>= reloc_entry->howto->rightshift;
  relocation = (((relocation & 0xf800) << 5) | (relocation & 0x7ff))
               & reloc_entry->howto->dst_mask;
  insn = (insn & ~reloc_entry->howto->dst_mask) | relocation;

  bfd_put_32 (abfd, (bfd_vma) insn, addr);

  return bfd_reloc_ok;
}
static bfd_reloc_status_type i860_howto_pc26_reloc ( bfd *abfd  ATTRIBUTE_UNUSED,
arelent reloc_entry,
asymbol symbol,
void *data  ATTRIBUTE_UNUSED,
asection input_section,
bfd output_bfd,
char **error_message  ATTRIBUTE_UNUSED 
) [static]

Definition at line 31 of file elf32-i860.c.

{
  bfd_vma insn;
  bfd_vma relocation;
  bfd_byte *addr;

  if (output_bfd != NULL
      && (symbol->flags & BSF_SECTION_SYM) == 0
      && (! reloc_entry->howto->partial_inplace
         || reloc_entry->addend == 0))
    {
      reloc_entry->address += input_section->output_offset;
      return bfd_reloc_ok;
    }

  /* Used elf32-mips.c as an example.  */
  if (bfd_is_und_section (symbol->section)
      && output_bfd == (bfd *) NULL)
    return bfd_reloc_undefined;

  if (bfd_is_com_section (symbol->section))
    relocation = 0;
  else
    relocation = symbol->value;

  relocation += symbol->section->output_section->vma;
  relocation += symbol->section->output_offset;
  relocation += reloc_entry->addend;

  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
    return bfd_reloc_outofrange;

  /* Adjust for PC-relative relocation.  */
  relocation -= (input_section->output_section->vma
                 + input_section->output_offset
                 + reloc_entry->address
                 + 4);

  /* Check for target out of range.  */
  if ((bfd_signed_vma)relocation > (0x3ffffff << 2)
      || (bfd_signed_vma)relocation < (-0x4000000 << 2))
    return bfd_reloc_outofrange;

  addr = (bfd_byte *) data + reloc_entry->address;
  insn = bfd_get_32 (abfd, addr);

  relocation >>= reloc_entry->howto->rightshift;
  insn = (insn & ~reloc_entry->howto->dst_mask)
         | (relocation & reloc_entry->howto->dst_mask);

  bfd_put_32 (abfd, (bfd_vma) insn, addr);

  return bfd_reloc_ok;
}
static bfd_reloc_status_type i860_howto_splitn_reloc ( bfd abfd,
arelent reloc_entry,
asymbol symbol,
void *  data,
asection input_section,
bfd output_bfd,
char **error_message  ATTRIBUTE_UNUSED 
) [static]

Definition at line 211 of file elf32-i860.c.

{
  bfd_vma insn;
  bfd_vma relocation;
  bfd_byte *addr;

  if (output_bfd != NULL
      && (symbol->flags & BSF_SECTION_SYM) == 0
      && (! reloc_entry->howto->partial_inplace
         || reloc_entry->addend == 0))
    {
      reloc_entry->address += input_section->output_offset;
      return bfd_reloc_ok;
    }

  /* Used elf32-mips.c as an example.  */
  if (bfd_is_und_section (symbol->section)
      && output_bfd == (bfd *) NULL)
    return bfd_reloc_undefined;

  if (bfd_is_com_section (symbol->section))
    relocation = 0;
  else
    relocation = symbol->value;

  relocation += symbol->section->output_section->vma;
  relocation += symbol->section->output_offset;
  relocation += reloc_entry->addend;

  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
    return bfd_reloc_outofrange;

  addr = (bfd_byte *) data + reloc_entry->address;
  insn = bfd_get_32 (abfd, addr);

  relocation = (((relocation & 0xf800) << 5) | (relocation & 0x7ff))
               & reloc_entry->howto->dst_mask;
  insn = (insn & ~reloc_entry->howto->dst_mask) | relocation;

  bfd_put_32 (abfd, (bfd_vma) insn, addr);

  return bfd_reloc_ok;
}
static reloc_howto_type* lookup_howto ( unsigned int  rtype) [static]

Definition at line 748 of file elf32-i860.c.

{
  static int initialized = 0;
  int i;
  int howto_tbl_size = (int) (sizeof (elf32_i860_howto_table)
                     / sizeof (elf32_i860_howto_table[0]));

  if (! initialized)
    {
      initialized = 1;
      memset (elf_code_to_howto_index, 0xff,
             sizeof (elf_code_to_howto_index));
      for (i = 0; i < howto_tbl_size; i++)
        elf_code_to_howto_index[elf32_i860_howto_table[i].type] = i;
    }

  BFD_ASSERT (rtype <= R_860_max);
  i = elf_code_to_howto_index[rtype];
  if (i >= howto_tbl_size)
    return 0;
  return elf32_i860_howto_table + i;
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

reloc_howto_type elf32_i860_howto_table[] [static]

Definition at line 262 of file elf32-i860.c.

unsigned char elf_code_to_howto_index[R_860_max+1] [static]

Definition at line 745 of file elf32-i860.c.