Back to index

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

Go to the source code of this file.

Classes

struct  xc16x_reloc_map

Defines

#define ELF_ARCH   bfd_arch_xc16x
#define ELF_MACHINE_CODE   EM_XC16X
#define ELF_MAXPAGESIZE   0x100
#define TARGET_LITTLE_SYM   bfd_elf32_xc16x_vec
#define TARGET_LITTLE_NAME   "elf32-xc16x"
#define elf_backend_final_write_processing   elf32_xc16x_final_write_processing
#define elf_backend_object_p   elf32_xc16x_object_p
#define elf_backend_can_gc_sections   1
#define bfd_elf32_bfd_reloc_type_lookup   xc16x_reloc_type_lookup
#define bfd_elf32_bfd_reloc_name_lookup   xc16x_reloc_name_lookup
#define elf_info_to_howto   elf32_xc16x_info_to_howto
#define elf_info_to_howto_rel   elf32_xc16x_info_to_howto
#define elf_backend_relocate_section   elf32_xc16x_relocate_section
#define elf_backend_rela_normal   1

Functions

static reloc_howto_type * xc16x_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, bfd_reloc_code_real_type code)
static reloc_howto_type * xc16x_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
static void elf32_xc16x_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc, Elf_Internal_Rela *elf_reloc)
static bfd_reloc_status_type elf32_xc16x_final_link_relocate (unsigned long r_type, bfd *input_bfd, bfd *output_bfd ATTRIBUTE_UNUSED, asection *input_section ATTRIBUTE_UNUSED, bfd_byte *contents, bfd_vma offset, bfd_vma value, bfd_vma addend, struct bfd_link_info *info ATTRIBUTE_UNUSED, asection *sym_sec ATTRIBUTE_UNUSED, int is_local ATTRIBUTE_UNUSED)
static bfd_boolean elf32_xc16x_relocate_section (bfd *output_bfd, 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 void elf32_xc16x_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
static unsigned long elf32_xc16x_mach (flagword flags)
static bfd_boolean elf32_xc16x_object_p (bfd *abfd)

Variables

static reloc_howto_type xc16x_elf_howto_table []
static struct xc16x_reloc_map []

Class Documentation

struct xc16x_reloc_map

Definition at line 172 of file elf32-xc16x.c.

Class Members
bfd_reloc_code_real_type bfd_reloc_val
unsigned int xc16x_reloc_val

Define Documentation

Definition at line 473 of file elf32-xc16x.c.

Definition at line 472 of file elf32-xc16x.c.

#define ELF_ARCH   bfd_arch_xc16x

Definition at line 463 of file elf32-xc16x.c.

Definition at line 471 of file elf32-xc16x.c.

Definition at line 469 of file elf32-xc16x.c.

Definition at line 470 of file elf32-xc16x.c.

#define elf_backend_rela_normal   1

Definition at line 477 of file elf32-xc16x.c.

Definition at line 476 of file elf32-xc16x.c.

Definition at line 474 of file elf32-xc16x.c.

Definition at line 475 of file elf32-xc16x.c.

#define ELF_MACHINE_CODE   EM_XC16X

Definition at line 464 of file elf32-xc16x.c.

#define ELF_MAXPAGESIZE   0x100

Definition at line 465 of file elf32-xc16x.c.

#define TARGET_LITTLE_NAME   "elf32-xc16x"

Definition at line 468 of file elf32-xc16x.c.

Definition at line 467 of file elf32-xc16x.c.


Function Documentation

static bfd_reloc_status_type elf32_xc16x_final_link_relocate ( unsigned long  r_type,
bfd input_bfd,
bfd *output_bfd  ATTRIBUTE_UNUSED,
asection *input_section  ATTRIBUTE_UNUSED,
bfd_byte contents,
bfd_vma  offset,
bfd_vma  value,
bfd_vma  addend,
struct bfd_link_info *info  ATTRIBUTE_UNUSED,
asection *sym_sec  ATTRIBUTE_UNUSED,
int is_local  ATTRIBUTE_UNUSED 
) [static]

Definition at line 245 of file elf32-xc16x.c.

{
  bfd_byte *hit_data = contents + offset;
  bfd_vma val1;

  switch (r_type)
    {
    case R_XC16X_NONE:
      return bfd_reloc_ok;

    case R_XC16X_ABS_16:
      value += addend;
      bfd_put_16 (input_bfd, value, hit_data);
      return bfd_reloc_ok;

    case R_XC16X_8_PCREL:
      bfd_put_8 (input_bfd, value, hit_data);
      return bfd_reloc_ok;

      /* Following case is to find page number from actual
        address for this divide value by 16k i.e. page size.  */

    case R_XC16X_PAG:
      value += addend;
      value /= 0x4000;
      bfd_put_16 (input_bfd, value, hit_data);
      return bfd_reloc_ok;

      /* Following case is to find page offset from actual address
        for this take modulo of value by 16k i.e. page size.  */

    case R_XC16X_POF:
      value += addend;
      value %= 0x4000;
      bfd_put_16 (input_bfd, value, hit_data);
      return bfd_reloc_ok;

      /* Following case is to find segment number from actual
        address for this divide value by 64k i.e. segment size.  */

    case R_XC16X_SEG:
      value += addend;
      value /= 0x10000;
      bfd_put_16 (input_bfd, value, hit_data);
      return bfd_reloc_ok;

      /* Following case is to find segment offset from actual address
        for this take modulo of value by 64k i.e. segment size.  */

    case R_XC16X_SOF:
      value += addend;
      value %= 0x10000;
      bfd_put_16 (input_bfd, value, hit_data);
      return bfd_reloc_ok;

    case R_XC16X_ABS_32:
      if (!strstr (input_section->name,".debug"))
       {
         value += addend;
         val1 = value;
         value %= 0x4000;
         val1 /= 0x4000;
         val1 = val1 << 16;
         value += val1;
         bfd_put_32 (input_bfd, value, hit_data);
       }
      else
       {
         value += addend;
         bfd_put_32 (input_bfd, value, hit_data);
       }
      return bfd_reloc_ok;

    default:
      return bfd_reloc_notsupported;
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void elf32_xc16x_final_write_processing ( bfd abfd,
bfd_boolean linker  ATTRIBUTE_UNUSED 
) [static]

Definition at line 412 of file elf32-xc16x.c.

{
  unsigned long val;

  switch (bfd_get_mach (abfd))
    {
    default:
    case bfd_mach_xc16x:
      val = 0x1000;
      break;

    case bfd_mach_xc16xl:
      val = 0x1001;
      break;

    case bfd_mach_xc16xs:
      val = 0x1002;
      break;
    }

  elf_elfheader (abfd)->e_flags |= val;
}

Here is the call graph for this function:

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

Definition at line 228 of file elf32-xc16x.c.

{
  unsigned int r;
  unsigned int i;

  r = ELF32_R_TYPE (elf_reloc->r_info);
  for (i = 0; i < ARRAY_SIZE (xc16x_elf_howto_table); i++)
    if (xc16x_elf_howto_table[i].type == r)
      {
       bfd_reloc->howto = &xc16x_elf_howto_table[i];
       return;
      }
  abort ();
}
static unsigned long elf32_xc16x_mach ( flagword  flags) [static]

Definition at line 437 of file elf32-xc16x.c.

{  
  switch (flags)
    {
    case 0x1000:
    default: 
      return bfd_mach_xc16x;

    case 0x1001:
      return bfd_mach_xc16xl;

    case 0x1002:
      return bfd_mach_xc16xs;
    }
}

Here is the caller graph for this function:

static bfd_boolean elf32_xc16x_object_p ( bfd abfd) [static]

Definition at line 455 of file elf32-xc16x.c.

Here is the call graph for this function:

static bfd_boolean elf32_xc16x_relocate_section ( bfd output_bfd,
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 334 of file elf32-xc16x.c.

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

  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
  sym_hashes = elf_sym_hashes (input_bfd);

  rel = relocs;
  relend = relocs + input_section->reloc_count;
  for (; rel < relend; rel++)
    {
      unsigned int r_type;
      unsigned long r_symndx;
      Elf_Internal_Sym *sym;
      asection *sec;
      struct elf_link_hash_entry *h;
      bfd_vma relocation;
      bfd_reloc_status_type r;

      /* This is a final link.  */
      r_symndx = ELF32_R_SYM (rel->r_info);
      r_type = 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);
       }
      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.  */
         reloc_howto_type *howto;
         howto = xc16x_reloc_type_lookup (input_bfd, r_type);
         _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
         rel->r_info = 0;
         rel->r_addend = 0;
         continue;
       }

      if (info->relocatable)
       continue;

      r = elf32_xc16x_final_link_relocate (r_type, input_bfd, output_bfd,
                                      input_section,
                                      contents, rel->r_offset,
                                      relocation, rel->r_addend,
                                      info, sec, h == NULL);
    }

  return TRUE;
}

Here is the call graph for this function:

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

Definition at line 209 of file elf32-xc16x.c.

{
  unsigned int i;

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

  return NULL;
}

Here is the call graph for this function:

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

Definition at line 196 of file elf32-xc16x.c.

{
  unsigned int i;

  for (i = ARRAY_SIZE (xc16x_reloc_map); --i;)
    if (xc16x_reloc_map [i].bfd_reloc_val == code)
      return & xc16x_elf_howto_table [xc16x_reloc_map[i].xc16x_reloc_val];

  return NULL;
}

Here is the caller graph for this function:


Variable Documentation

reloc_howto_type xc16x_elf_howto_table[] [static]

Definition at line 29 of file elf32-xc16x.c.

struct xc16x_reloc_map[] [static]
Initial value:
{
  { BFD_RELOC_NONE,           R_XC16X_NONE },
  { BFD_RELOC_8,              R_XC16X_ABS_8 },
  { BFD_RELOC_16,             R_XC16X_ABS_16 },
  { BFD_RELOC_32,             R_XC16X_ABS_32 },
  { BFD_RELOC_8_PCREL,        R_XC16X_8_PCREL },
  { BFD_RELOC_XC16X_PAG,      R_XC16X_PAG},
  { BFD_RELOC_XC16X_POF,      R_XC16X_POF},
  { BFD_RELOC_XC16X_SEG,      R_XC16X_SEG},
  { BFD_RELOC_XC16X_SOF,      R_XC16X_SOF},
}

Definition at line 178 of file elf32-xc16x.c.