OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [bfd/] [coff-tic80.c] - Diff between revs 156 and 816

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 156 Rev 816
/* BFD back-end for Texas Instruments TMS320C80 Multimedia Video Processor (MVP).
/* BFD back-end for Texas Instruments TMS320C80 Multimedia Video Processor (MVP).
   Copyright 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
   Copyright 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
 
 
   Written by Fred Fish (fnf@cygnus.com)
   Written by Fred Fish (fnf@cygnus.com)
 
 
   There is nothing new under the sun. This file draws a lot on other
   There is nothing new under the sun. This file draws a lot on other
   coff files.
   coff files.
 
 
   This file is part of BFD, the Binary File Descriptor library.
   This file is part of BFD, the Binary File Descriptor library.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, 51 Franklin Street - Fifth Floor,
   Foundation, 51 Franklin Street - Fifth Floor,
   Boston, MA 02110-1301, USA.  */
   Boston, MA 02110-1301, USA.  */
 
 
#include "sysdep.h"
#include "sysdep.h"
#include "bfd.h"
#include "bfd.h"
#include "bfdlink.h"
#include "bfdlink.h"
#include "libbfd.h"
#include "libbfd.h"
#ifdef _CONST
#ifdef _CONST
/* Newlib-based hosts define _CONST as a STDC-safe alias for const,
/* Newlib-based hosts define _CONST as a STDC-safe alias for const,
  but to the tic80 toolchain it means something altogether different.
  but to the tic80 toolchain it means something altogether different.
  Since sysdep.h will have pulled in stdio.h and hence _ansi.h which
  Since sysdep.h will have pulled in stdio.h and hence _ansi.h which
  contains this definition, we must undef it before including the
  contains this definition, we must undef it before including the
  tic80-specific definition. */
  tic80-specific definition. */
#undef _CONST
#undef _CONST
#endif /* _CONST */
#endif /* _CONST */
#include "coff/tic80.h"
#include "coff/tic80.h"
#include "coff/internal.h"
#include "coff/internal.h"
#include "libcoff.h"
#include "libcoff.h"
 
 
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2)
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2)
#define COFF_ALIGN_IN_SECTION_HEADER 1
#define COFF_ALIGN_IN_SECTION_HEADER 1
#define COFF_ALIGN_IN_SFLAGS 1
#define COFF_ALIGN_IN_SFLAGS 1
 
 
#define GET_SCNHDR_FLAGS H_GET_16
#define GET_SCNHDR_FLAGS H_GET_16
#define PUT_SCNHDR_FLAGS H_PUT_16
#define PUT_SCNHDR_FLAGS H_PUT_16
 
 
static void rtype2howto
static void rtype2howto
  PARAMS ((arelent *cache_ptr, struct internal_reloc *dst));
  PARAMS ((arelent *cache_ptr, struct internal_reloc *dst));
static bfd_reloc_status_type ppbase_reloc
static bfd_reloc_status_type ppbase_reloc
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
static bfd_reloc_status_type glob15_reloc
static bfd_reloc_status_type glob15_reloc
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
static bfd_reloc_status_type glob16_reloc
static bfd_reloc_status_type glob16_reloc
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
static bfd_reloc_status_type local16_reloc
static bfd_reloc_status_type local16_reloc
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
static bfd_boolean coff_tic80_relocate_section
static bfd_boolean coff_tic80_relocate_section
  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
           struct internal_reloc *, struct internal_syment *, asection **));
           struct internal_reloc *, struct internal_syment *, asection **));
static reloc_howto_type * coff_tic80_rtype_to_howto
static reloc_howto_type * coff_tic80_rtype_to_howto
  PARAMS ((bfd *, asection *, struct internal_reloc *,
  PARAMS ((bfd *, asection *, struct internal_reloc *,
           struct coff_link_hash_entry *, struct internal_syment *,
           struct coff_link_hash_entry *, struct internal_syment *,
           bfd_vma *));
           bfd_vma *));
 
 
static reloc_howto_type tic80_howto_table[] =
static reloc_howto_type tic80_howto_table[] =
{
{
 
 
  HOWTO (R_RELLONG,                     /* type */
  HOWTO (R_RELLONG,                     /* type */
         0,                              /* rightshift */
         0,                              /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         32,                            /* bitsize */
         32,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         0,                              /* bitpos */
         0,                              /* bitpos */
         complain_overflow_bitfield,    /* complain_on_overflow */
         complain_overflow_bitfield,    /* complain_on_overflow */
         NULL,                          /* special_function */
         NULL,                          /* special_function */
         "RELLONG",                     /* name */
         "RELLONG",                     /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0xffffffff,                    /* src_mask */
         0xffffffff,                    /* src_mask */
         0xffffffff,                    /* dst_mask */
         0xffffffff,                    /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_MPPCR,                       /* type */
  HOWTO (R_MPPCR,                       /* type */
         2,                             /* rightshift */
         2,                             /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         32,                            /* bitsize */
         32,                            /* bitsize */
         TRUE,                          /* pc_relative */
         TRUE,                          /* pc_relative */
         0,                              /* bitpos */
         0,                              /* bitpos */
         complain_overflow_signed,      /* complain_on_overflow */
         complain_overflow_signed,      /* complain_on_overflow */
         NULL,                          /* special_function */
         NULL,                          /* special_function */
         "MPPCR",                       /* name */
         "MPPCR",                       /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0xffffffff,                    /* src_mask */
         0xffffffff,                    /* src_mask */
         0xffffffff,                    /* dst_mask */
         0xffffffff,                    /* dst_mask */
         TRUE),                         /* pcrel_offset */
         TRUE),                         /* pcrel_offset */
 
 
  HOWTO (R_ABS,                         /* type */
  HOWTO (R_ABS,                         /* type */
         0,                              /* rightshift */
         0,                              /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         32,                            /* bitsize */
         32,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         0,                              /* bitpos */
         0,                              /* bitpos */
         complain_overflow_bitfield,    /* complain_on_overflow */
         complain_overflow_bitfield,    /* complain_on_overflow */
         NULL,                          /* special_function */
         NULL,                          /* special_function */
         "ABS",                         /* name */
         "ABS",                         /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0xffffffff,                    /* src_mask */
         0xffffffff,                    /* src_mask */
         0xffffffff,                    /* dst_mask */
         0xffffffff,                    /* dst_mask */
         FALSE),                                /* pcrel_offset */
         FALSE),                                /* pcrel_offset */
 
 
  HOWTO (R_PPBASE,                      /* type */
  HOWTO (R_PPBASE,                      /* type */
         0,                              /* rightshift */
         0,                              /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         32,                            /* bitsize */
         32,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         0,                              /* bitpos */
         0,                              /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         ppbase_reloc,                  /* special_function */
         ppbase_reloc,                  /* special_function */
         "PPBASE",                      /* name */
         "PPBASE",                      /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0xffffffff,                    /* src_mask */
         0xffffffff,                    /* src_mask */
         0xffffffff,                    /* dst_mask */
         0xffffffff,                    /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PPLBASE,                     /* type */
  HOWTO (R_PPLBASE,                     /* type */
         0,                              /* rightshift */
         0,                              /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         32,                            /* bitsize */
         32,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         0,                              /* bitpos */
         0,                              /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         ppbase_reloc,                  /* special_function */
         ppbase_reloc,                  /* special_function */
         "PPLBASE",                     /* name */
         "PPLBASE",                     /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0xffffffff,                    /* src_mask */
         0xffffffff,                    /* src_mask */
         0xffffffff,                    /* dst_mask */
         0xffffffff,                    /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PP15,                        /* type */
  HOWTO (R_PP15,                        /* type */
         0,                              /* rightshift */
         0,                              /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         15,                            /* bitsize */
         15,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         6,                             /* bitpos */
         6,                             /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         glob15_reloc,                  /* special_function */
         glob15_reloc,                  /* special_function */
         "PP15",                        /* name */
         "PP15",                        /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x1ffc0,                       /* src_mask */
         0x1ffc0,                       /* src_mask */
         0x1ffc0,                       /* dst_mask */
         0x1ffc0,                       /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PP15W,                       /* type */
  HOWTO (R_PP15W,                       /* type */
         2,                             /* rightshift */
         2,                             /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         15,                            /* bitsize */
         15,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         6,                             /* bitpos */
         6,                             /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         glob15_reloc,                  /* special_function */
         glob15_reloc,                  /* special_function */
         "PP15W",                       /* name */
         "PP15W",                       /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x1ffc0,                       /* src_mask */
         0x1ffc0,                       /* src_mask */
         0x1ffc0,                       /* dst_mask */
         0x1ffc0,                       /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PP15H,                       /* type */
  HOWTO (R_PP15H,                       /* type */
         1,                             /* rightshift */
         1,                             /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         15,                            /* bitsize */
         15,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         6,                             /* bitpos */
         6,                             /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         glob15_reloc,                  /* special_function */
         glob15_reloc,                  /* special_function */
         "PP15H",                       /* name */
         "PP15H",                       /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x1ffc0,                       /* src_mask */
         0x1ffc0,                       /* src_mask */
         0x1ffc0,                       /* dst_mask */
         0x1ffc0,                       /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PP16B,                       /* type */
  HOWTO (R_PP16B,                       /* type */
         0,                              /* rightshift */
         0,                              /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         16,                            /* bitsize */
         16,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         6,                             /* bitpos */
         6,                             /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         glob16_reloc,                  /* special_function */
         glob16_reloc,                  /* special_function */
         "PP16B",                       /* name */
         "PP16B",                       /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x3ffc0,                       /* src_mask */
         0x3ffc0,                       /* src_mask */
         0x3ffc0,                       /* dst_mask */
         0x3ffc0,                       /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PPL15,                       /* type */
  HOWTO (R_PPL15,                       /* type */
         0,                              /* rightshift */
         0,                              /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         15,                            /* bitsize */
         15,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         0,                              /* bitpos */
         0,                              /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         NULL,                          /* special_function */
         NULL,                          /* special_function */
         "PPL15",                       /* name */
         "PPL15",                       /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x7fff,                        /* src_mask */
         0x7fff,                        /* src_mask */
         0x7fff,                        /* dst_mask */
         0x7fff,                        /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PPL15W,                      /* type */
  HOWTO (R_PPL15W,                      /* type */
         2,                             /* rightshift */
         2,                             /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         15,                            /* bitsize */
         15,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         0,                              /* bitpos */
         0,                              /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         NULL,                          /* special_function */
         NULL,                          /* special_function */
         "PPL15W",                      /* name */
         "PPL15W",                      /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x7fff,                        /* src_mask */
         0x7fff,                        /* src_mask */
         0x7fff,                        /* dst_mask */
         0x7fff,                        /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PPL15H,                      /* type */
  HOWTO (R_PPL15H,                      /* type */
         1,                             /* rightshift */
         1,                             /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         15,                            /* bitsize */
         15,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         0,                              /* bitpos */
         0,                              /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         NULL,                          /* special_function */
         NULL,                          /* special_function */
         "PPL15H",                      /* name */
         "PPL15H",                      /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x7fff,                        /* src_mask */
         0x7fff,                        /* src_mask */
         0x7fff,                        /* dst_mask */
         0x7fff,                        /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PPL16B,                      /* type */
  HOWTO (R_PPL16B,                      /* type */
         0,                              /* rightshift */
         0,                              /* rightshift */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         2,                             /* size (0 = byte, 1 = short, 2 = long) */
         16,                            /* bitsize */
         16,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         0,                              /* bitpos */
         0,                              /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         local16_reloc,                 /* special_function */
         local16_reloc,                 /* special_function */
         "PPL16B",                      /* name */
         "PPL16B",                      /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0xffff,                        /* src_mask */
         0xffff,                        /* src_mask */
         0xffff,                        /* dst_mask */
         0xffff,                        /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PPN15,                       /* type */
  HOWTO (R_PPN15,                       /* type */
         0,                              /* rightshift */
         0,                              /* rightshift */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         15,                            /* bitsize */
         15,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         6,                             /* bitpos */
         6,                             /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         glob15_reloc,                  /* special_function */
         glob15_reloc,                  /* special_function */
         "PPN15",                       /* name */
         "PPN15",                       /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x1ffc0,                       /* src_mask */
         0x1ffc0,                       /* src_mask */
         0x1ffc0,                       /* dst_mask */
         0x1ffc0,                       /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PPN15W,                      /* type */
  HOWTO (R_PPN15W,                      /* type */
         2,                             /* rightshift */
         2,                             /* rightshift */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         15,                            /* bitsize */
         15,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         6,                             /* bitpos */
         6,                             /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         glob15_reloc,                  /* special_function */
         glob15_reloc,                  /* special_function */
         "PPN15W",                      /* name */
         "PPN15W",                      /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x1ffc0,                       /* src_mask */
         0x1ffc0,                       /* src_mask */
         0x1ffc0,                       /* dst_mask */
         0x1ffc0,                       /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PPN15H,                      /* type */
  HOWTO (R_PPN15H,                      /* type */
         1,                             /* rightshift */
         1,                             /* rightshift */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         15,                            /* bitsize */
         15,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         6,                             /* bitpos */
         6,                             /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         glob15_reloc,                  /* special_function */
         glob15_reloc,                  /* special_function */
         "PPN15H",                      /* name */
         "PPN15H",                      /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x1ffc0,                       /* src_mask */
         0x1ffc0,                       /* src_mask */
         0x1ffc0,                       /* dst_mask */
         0x1ffc0,                       /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PPN16B,                      /* type */
  HOWTO (R_PPN16B,                      /* type */
         0,                              /* rightshift */
         0,                              /* rightshift */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         16,                            /* bitsize */
         16,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         6,                             /* bitpos */
         6,                             /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         glob16_reloc,                  /* special_function */
         glob16_reloc,                  /* special_function */
         "PPN16B",                      /* name */
         "PPN16B",                      /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x3ffc0,                       /* src_mask */
         0x3ffc0,                       /* src_mask */
         0x3ffc0,                       /* dst_mask */
         0x3ffc0,                       /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PPLN15,                      /* type */
  HOWTO (R_PPLN15,                      /* type */
         0,                              /* rightshift */
         0,                              /* rightshift */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         15,                            /* bitsize */
         15,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         0,                              /* bitpos */
         0,                              /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         NULL,                          /* special_function */
         NULL,                          /* special_function */
         "PPLN15",                      /* name */
         "PPLN15",                      /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x7fff,                        /* src_mask */
         0x7fff,                        /* src_mask */
         0x7fff,                        /* dst_mask */
         0x7fff,                        /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PPLN15W,                     /* type */
  HOWTO (R_PPLN15W,                     /* type */
         2,                             /* rightshift */
         2,                             /* rightshift */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         15,                            /* bitsize */
         15,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         0,                              /* bitpos */
         0,                              /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         NULL,                          /* special_function */
         NULL,                          /* special_function */
         "PPLN15W",                     /* name */
         "PPLN15W",                     /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x7fff,                        /* src_mask */
         0x7fff,                        /* src_mask */
         0x7fff,                        /* dst_mask */
         0x7fff,                        /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PPLN15H,                     /* type */
  HOWTO (R_PPLN15H,                     /* type */
         1,                             /* rightshift */
         1,                             /* rightshift */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         15,                            /* bitsize */
         15,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         0,                              /* bitpos */
         0,                              /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         NULL,                          /* special_function */
         NULL,                          /* special_function */
         "PPLN15H",                     /* name */
         "PPLN15H",                     /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0x7fff,                        /* src_mask */
         0x7fff,                        /* src_mask */
         0x7fff,                        /* dst_mask */
         0x7fff,                        /* dst_mask */
         FALSE),                        /* pcrel_offset */
         FALSE),                        /* pcrel_offset */
 
 
  HOWTO (R_PPLN16B,                     /* type */
  HOWTO (R_PPLN16B,                     /* type */
         0,                              /* rightshift */
         0,                              /* rightshift */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         -2,                            /* size (0 = byte, 1 = short, 2 = long) */
         15,                            /* bitsize */
         15,                            /* bitsize */
         FALSE,                         /* pc_relative */
         FALSE,                         /* pc_relative */
         0,                              /* bitpos */
         0,                              /* bitpos */
         complain_overflow_dont,        /* complain_on_overflow */
         complain_overflow_dont,        /* complain_on_overflow */
         local16_reloc,                 /* special_function */
         local16_reloc,                 /* special_function */
         "PPLN16B",                     /* name */
         "PPLN16B",                     /* name */
         TRUE,                          /* partial_inplace */
         TRUE,                          /* partial_inplace */
         0xffff,                        /* src_mask */
         0xffff,                        /* src_mask */
         0xffff,                        /* dst_mask */
         0xffff,                        /* dst_mask */
         FALSE)                         /* pcrel_offset */
         FALSE)                         /* pcrel_offset */
};
};


/* Special relocation functions, used when the output file is not
/* Special relocation functions, used when the output file is not
   itself a COFF TIc80 file.  */
   itself a COFF TIc80 file.  */
 
 
/* This special function is used for the base address type
/* This special function is used for the base address type
   relocations.  */
   relocations.  */
 
 
static bfd_reloc_status_type
static bfd_reloc_status_type
ppbase_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
ppbase_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
              error_message)
              error_message)
     bfd *abfd ATTRIBUTE_UNUSED;
     bfd *abfd ATTRIBUTE_UNUSED;
     arelent *reloc_entry ATTRIBUTE_UNUSED;
     arelent *reloc_entry ATTRIBUTE_UNUSED;
     asymbol *symbol_in ATTRIBUTE_UNUSED;
     asymbol *symbol_in ATTRIBUTE_UNUSED;
     PTR data ATTRIBUTE_UNUSED;
     PTR data ATTRIBUTE_UNUSED;
     asection *input_section ATTRIBUTE_UNUSED;
     asection *input_section ATTRIBUTE_UNUSED;
     bfd *output_bfd ATTRIBUTE_UNUSED;
     bfd *output_bfd ATTRIBUTE_UNUSED;
     char **error_message ATTRIBUTE_UNUSED;
     char **error_message ATTRIBUTE_UNUSED;
{
{
  /* FIXME.  */
  /* FIXME.  */
  abort ();
  abort ();
}
}
 
 
/* This special function is used for the global 15 bit relocations.  */
/* This special function is used for the global 15 bit relocations.  */
 
 
static bfd_reloc_status_type
static bfd_reloc_status_type
glob15_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
glob15_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
              error_message)
              error_message)
     bfd *abfd ATTRIBUTE_UNUSED;
     bfd *abfd ATTRIBUTE_UNUSED;
     arelent *reloc_entry ATTRIBUTE_UNUSED;
     arelent *reloc_entry ATTRIBUTE_UNUSED;
     asymbol *symbol_in ATTRIBUTE_UNUSED;
     asymbol *symbol_in ATTRIBUTE_UNUSED;
     PTR data ATTRIBUTE_UNUSED;
     PTR data ATTRIBUTE_UNUSED;
     asection *input_section ATTRIBUTE_UNUSED;
     asection *input_section ATTRIBUTE_UNUSED;
     bfd *output_bfd ATTRIBUTE_UNUSED;
     bfd *output_bfd ATTRIBUTE_UNUSED;
     char **error_message ATTRIBUTE_UNUSED;
     char **error_message ATTRIBUTE_UNUSED;
{
{
  /* FIXME.  */
  /* FIXME.  */
  abort ();
  abort ();
}
}
 
 
/* This special function is used for the global 16 bit relocations.  */
/* This special function is used for the global 16 bit relocations.  */
 
 
static bfd_reloc_status_type
static bfd_reloc_status_type
glob16_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
glob16_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
              error_message)
              error_message)
     bfd *abfd ATTRIBUTE_UNUSED;
     bfd *abfd ATTRIBUTE_UNUSED;
     arelent *reloc_entry ATTRIBUTE_UNUSED;
     arelent *reloc_entry ATTRIBUTE_UNUSED;
     asymbol *symbol_in ATTRIBUTE_UNUSED;
     asymbol *symbol_in ATTRIBUTE_UNUSED;
     PTR data ATTRIBUTE_UNUSED;
     PTR data ATTRIBUTE_UNUSED;
     asection *input_section ATTRIBUTE_UNUSED;
     asection *input_section ATTRIBUTE_UNUSED;
     bfd *output_bfd ATTRIBUTE_UNUSED;
     bfd *output_bfd ATTRIBUTE_UNUSED;
     char **error_message ATTRIBUTE_UNUSED;
     char **error_message ATTRIBUTE_UNUSED;
{
{
  /* FIXME.  */
  /* FIXME.  */
  abort ();
  abort ();
}
}
 
 
/* This special function is used for the local 16 bit relocations.  */
/* This special function is used for the local 16 bit relocations.  */
 
 
static bfd_reloc_status_type
static bfd_reloc_status_type
local16_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
local16_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
              error_message)
              error_message)
     bfd *abfd ATTRIBUTE_UNUSED;
     bfd *abfd ATTRIBUTE_UNUSED;
     arelent *reloc_entry ATTRIBUTE_UNUSED;
     arelent *reloc_entry ATTRIBUTE_UNUSED;
     asymbol *symbol_in ATTRIBUTE_UNUSED;
     asymbol *symbol_in ATTRIBUTE_UNUSED;
     PTR data ATTRIBUTE_UNUSED;
     PTR data ATTRIBUTE_UNUSED;
     asection *input_section ATTRIBUTE_UNUSED;
     asection *input_section ATTRIBUTE_UNUSED;
     bfd *output_bfd ATTRIBUTE_UNUSED;
     bfd *output_bfd ATTRIBUTE_UNUSED;
     char **error_message ATTRIBUTE_UNUSED;
     char **error_message ATTRIBUTE_UNUSED;
{
{
  /* FIXME.  */
  /* FIXME.  */
  abort ();
  abort ();
}
}


/* Code to turn an external r_type into a pointer to an entry in the howto_table.
/* Code to turn an external r_type into a pointer to an entry in the howto_table.
   If passed an r_type we don't recognize the abort rather than silently failing
   If passed an r_type we don't recognize the abort rather than silently failing
   to generate an output file.  */
   to generate an output file.  */
 
 
static void
static void
rtype2howto (cache_ptr, dst)
rtype2howto (cache_ptr, dst)
     arelent *cache_ptr;
     arelent *cache_ptr;
     struct internal_reloc *dst;
     struct internal_reloc *dst;
{
{
  unsigned int i;
  unsigned int i;
 
 
  for (i = 0; i < sizeof tic80_howto_table / sizeof tic80_howto_table[0]; i++)
  for (i = 0; i < sizeof tic80_howto_table / sizeof tic80_howto_table[0]; i++)
    {
    {
      if (tic80_howto_table[i].type == dst->r_type)
      if (tic80_howto_table[i].type == dst->r_type)
        {
        {
          cache_ptr->howto = tic80_howto_table + i;
          cache_ptr->howto = tic80_howto_table + i;
          return;
          return;
        }
        }
    }
    }
 
 
  (*_bfd_error_handler) (_("Unrecognized reloc type 0x%x"),
  (*_bfd_error_handler) (_("Unrecognized reloc type 0x%x"),
                         (unsigned int) dst->r_type);
                         (unsigned int) dst->r_type);
  cache_ptr->howto = tic80_howto_table + 0;
  cache_ptr->howto = tic80_howto_table + 0;
}
}
 
 
#define RTYPE2HOWTO(cache_ptr, dst) rtype2howto (cache_ptr, dst)
#define RTYPE2HOWTO(cache_ptr, dst) rtype2howto (cache_ptr, dst)
#define coff_rtype_to_howto coff_tic80_rtype_to_howto
#define coff_rtype_to_howto coff_tic80_rtype_to_howto
 
 
static reloc_howto_type *
static reloc_howto_type *
coff_tic80_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
coff_tic80_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
     bfd *abfd ATTRIBUTE_UNUSED;
     bfd *abfd ATTRIBUTE_UNUSED;
     asection *sec;
     asection *sec;
     struct internal_reloc *rel;
     struct internal_reloc *rel;
     struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
     struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
     struct internal_syment *sym ATTRIBUTE_UNUSED;
     struct internal_syment *sym ATTRIBUTE_UNUSED;
     bfd_vma *addendp;
     bfd_vma *addendp;
{
{
  arelent genrel;
  arelent genrel;
 
 
  if (rel -> r_symndx == -1 && addendp != NULL)
  if (rel -> r_symndx == -1 && addendp != NULL)
    {
    {
      /* This is a TI "internal relocation", which means that the relocation
      /* This is a TI "internal relocation", which means that the relocation
         amount is the amount by which the current section is being relocated
         amount is the amount by which the current section is being relocated
         in the output section.  */
         in the output section.  */
      *addendp = (sec -> output_section -> vma + sec -> output_offset) - sec -> vma;
      *addendp = (sec -> output_section -> vma + sec -> output_offset) - sec -> vma;
    }
    }
  RTYPE2HOWTO (&genrel, rel);
  RTYPE2HOWTO (&genrel, rel);
  return genrel.howto;
  return genrel.howto;
}
}
 
 
#ifndef BADMAG
#ifndef BADMAG
#define BADMAG(x) TIC80BADMAG(x)
#define BADMAG(x) TIC80BADMAG(x)
#endif
#endif


#define coff_relocate_section coff_tic80_relocate_section
#define coff_relocate_section coff_tic80_relocate_section
 
 
/* We need a special relocation routine to handle the PP relocs.  Most
/* We need a special relocation routine to handle the PP relocs.  Most
   of this is a copy of _bfd_coff_generic_relocate_section.  */
   of this is a copy of _bfd_coff_generic_relocate_section.  */
 
 
static bfd_boolean
static bfd_boolean
coff_tic80_relocate_section (output_bfd, info, input_bfd,
coff_tic80_relocate_section (output_bfd, info, input_bfd,
                             input_section, contents, relocs, syms,
                             input_section, contents, relocs, syms,
                             sections)
                             sections)
     bfd *output_bfd;
     bfd *output_bfd;
     struct bfd_link_info *info;
     struct bfd_link_info *info;
     bfd *input_bfd;
     bfd *input_bfd;
     asection *input_section;
     asection *input_section;
     bfd_byte *contents;
     bfd_byte *contents;
     struct internal_reloc *relocs;
     struct internal_reloc *relocs;
     struct internal_syment *syms;
     struct internal_syment *syms;
     asection **sections;
     asection **sections;
{
{
  struct internal_reloc *rel;
  struct internal_reloc *rel;
  struct internal_reloc *relend;
  struct internal_reloc *relend;
 
 
  rel = relocs;
  rel = relocs;
  relend = rel + input_section->reloc_count;
  relend = rel + input_section->reloc_count;
  for (; rel < relend; rel++)
  for (; rel < relend; rel++)
    {
    {
      long symndx;
      long symndx;
      struct coff_link_hash_entry *h;
      struct coff_link_hash_entry *h;
      struct internal_syment *sym;
      struct internal_syment *sym;
      bfd_vma addend;
      bfd_vma addend;
      bfd_vma val;
      bfd_vma val;
      reloc_howto_type *howto;
      reloc_howto_type *howto;
      bfd_reloc_status_type rstat;
      bfd_reloc_status_type rstat;
      bfd_vma addr;
      bfd_vma addr;
 
 
      symndx = rel->r_symndx;
      symndx = rel->r_symndx;
 
 
      if (symndx == -1)
      if (symndx == -1)
        {
        {
          h = NULL;
          h = NULL;
          sym = NULL;
          sym = NULL;
        }
        }
      else
      else
        {
        {
          h = obj_coff_sym_hashes (input_bfd)[symndx];
          h = obj_coff_sym_hashes (input_bfd)[symndx];
          sym = syms + symndx;
          sym = syms + symndx;
        }
        }
 
 
      /* COFF treats common symbols in one of two ways.  Either the
      /* COFF treats common symbols in one of two ways.  Either the
         size of the symbol is included in the section contents, or it
         size of the symbol is included in the section contents, or it
         is not.  We assume that the size is not included, and force
         is not.  We assume that the size is not included, and force
         the rtype_to_howto function to adjust the addend as needed.  */
         the rtype_to_howto function to adjust the addend as needed.  */
 
 
      if (sym != NULL && sym->n_scnum != 0)
      if (sym != NULL && sym->n_scnum != 0)
        addend = - sym->n_value;
        addend = - sym->n_value;
      else
      else
        addend = 0;
        addend = 0;
 
 
      howto = bfd_coff_rtype_to_howto (input_bfd, input_section, rel, h,
      howto = bfd_coff_rtype_to_howto (input_bfd, input_section, rel, h,
                                       sym, &addend);
                                       sym, &addend);
      if (howto == NULL)
      if (howto == NULL)
        return FALSE;
        return FALSE;
 
 
      val = 0;
      val = 0;
 
 
      if (h == NULL)
      if (h == NULL)
        {
        {
          asection *sec;
          asection *sec;
 
 
          if (symndx == -1)
          if (symndx == -1)
            {
            {
              sec = bfd_abs_section_ptr;
              sec = bfd_abs_section_ptr;
              val = 0;
              val = 0;
            }
            }
          else
          else
            {
            {
              sec = sections[symndx];
              sec = sections[symndx];
              val = (sec->output_section->vma
              val = (sec->output_section->vma
                     + sec->output_offset
                     + sec->output_offset
                     + sym->n_value);
                     + sym->n_value);
              if (! obj_pe (output_bfd))
              if (! obj_pe (output_bfd))
                val -= sec->vma;
                val -= sec->vma;
            }
            }
        }
        }
      else
      else
        {
        {
          if (h->root.type == bfd_link_hash_defined
          if (h->root.type == bfd_link_hash_defined
              || h->root.type == bfd_link_hash_defweak)
              || h->root.type == bfd_link_hash_defweak)
            {
            {
              asection *sec;
              asection *sec;
 
 
              sec = h->root.u.def.section;
              sec = h->root.u.def.section;
              val = (h->root.u.def.value
              val = (h->root.u.def.value
                     + sec->output_section->vma
                     + sec->output_section->vma
                     + sec->output_offset);
                     + sec->output_offset);
              }
              }
 
 
          else if (! info->relocatable)
          else if (! info->relocatable)
            {
            {
              if (! ((*info->callbacks->undefined_symbol)
              if (! ((*info->callbacks->undefined_symbol)
                     (info, h->root.root.string, input_bfd, input_section,
                     (info, h->root.root.string, input_bfd, input_section,
                      rel->r_vaddr - input_section->vma, TRUE)))
                      rel->r_vaddr - input_section->vma, TRUE)))
                return FALSE;
                return FALSE;
            }
            }
        }
        }
 
 
      addr = rel->r_vaddr - input_section->vma;
      addr = rel->r_vaddr - input_section->vma;
 
 
      /* FIXME: This code assumes little endian, but the PP can
      /* FIXME: This code assumes little endian, but the PP can
         apparently be bi-endian.  I don't know if the bi-endianness
         apparently be bi-endian.  I don't know if the bi-endianness
         applies to the instruction set or just to the data.  */
         applies to the instruction set or just to the data.  */
      switch (howto->type)
      switch (howto->type)
        {
        {
        default:
        default:
        case R_ABS:
        case R_ABS:
        case R_RELLONGX:
        case R_RELLONGX:
        case R_PPL15:
        case R_PPL15:
        case R_PPL15W:
        case R_PPL15W:
        case R_PPL15H:
        case R_PPL15H:
        case R_PPLN15:
        case R_PPLN15:
        case R_PPLN15W:
        case R_PPLN15W:
        case R_PPLN15H:
        case R_PPLN15H:
          rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
          rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
                                            contents, addr, val, addend);
                                            contents, addr, val, addend);
          break;
          break;
 
 
        case R_PP15:
        case R_PP15:
        case R_PP15W:
        case R_PP15W:
        case R_PP15H:
        case R_PP15H:
        case R_PPN15:
        case R_PPN15:
        case R_PPN15W:
        case R_PPN15W:
        case R_PPN15H:
        case R_PPN15H:
          /* Offset the address so that we can use 4 byte relocations.  */
          /* Offset the address so that we can use 4 byte relocations.  */
          rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
          rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
                                            contents + 2, addr, val, addend);
                                            contents + 2, addr, val, addend);
          break;
          break;
 
 
        case R_PP16B:
        case R_PP16B:
        case R_PPN16B:
        case R_PPN16B:
          {
          {
            /* The most significant bit is stored in bit 6.  */
            /* The most significant bit is stored in bit 6.  */
            bfd_byte hold;
            bfd_byte hold;
 
 
            hold = contents[addr + 4];
            hold = contents[addr + 4];
            contents[addr + 4] &=~ 0x20;
            contents[addr + 4] &=~ 0x20;
            contents[addr + 4] |= (contents[addr] >> 1) & 0x20;
            contents[addr + 4] |= (contents[addr] >> 1) & 0x20;
            rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
            rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
                                              contents + 2, addr,
                                              contents + 2, addr,
                                              val, addend);
                                              val, addend);
            contents[addr] &=~ 0x40;
            contents[addr] &=~ 0x40;
            contents[addr] |= (contents[addr + 4] << 1) & 0x40;
            contents[addr] |= (contents[addr + 4] << 1) & 0x40;
            contents[addr + 4] &=~ 0x20;
            contents[addr + 4] &=~ 0x20;
            contents[addr + 4] |= hold & 0x20;
            contents[addr + 4] |= hold & 0x20;
            break;
            break;
          }
          }
 
 
        case R_PPL16B:
        case R_PPL16B:
        case R_PPLN16B:
        case R_PPLN16B:
          {
          {
            /* The most significant bit is stored in bit 28.  */
            /* The most significant bit is stored in bit 28.  */
            bfd_byte hold;
            bfd_byte hold;
 
 
            hold = contents[addr + 1];
            hold = contents[addr + 1];
            contents[addr + 1] &=~ 0x80;
            contents[addr + 1] &=~ 0x80;
            contents[addr + 1] |= (contents[addr + 3] << 3) & 0x80;
            contents[addr + 1] |= (contents[addr + 3] << 3) & 0x80;
            rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
            rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
                                              contents, addr,
                                              contents, addr,
                                              val, addend);
                                              val, addend);
            contents[addr + 3] &= ~0x10;
            contents[addr + 3] &= ~0x10;
            contents[addr + 3] |= (contents[addr + 1] >> 3) & 0x10;
            contents[addr + 3] |= (contents[addr + 1] >> 3) & 0x10;
            contents[addr + 1] &=~ 0x80;
            contents[addr + 1] &=~ 0x80;
            contents[addr + 1] |= hold & 0x80;
            contents[addr + 1] |= hold & 0x80;
            break;
            break;
          }
          }
 
 
        case R_PPBASE:
        case R_PPBASE:
          /* Parameter RAM is from 0x1000000 to 0x1000800.  */
          /* Parameter RAM is from 0x1000000 to 0x1000800.  */
          contents[addr] &=~ 0x3;
          contents[addr] &=~ 0x3;
          if (val >= 0x1000000 && val < 0x1000800)
          if (val >= 0x1000000 && val < 0x1000800)
            contents[addr] |= 0x3;
            contents[addr] |= 0x3;
          else
          else
            contents[addr] |= 0x2;
            contents[addr] |= 0x2;
          rstat = bfd_reloc_ok;
          rstat = bfd_reloc_ok;
          break;
          break;
 
 
        case R_PPLBASE:
        case R_PPLBASE:
          /* Parameter RAM is from 0x1000000 to 0x1000800.  */
          /* Parameter RAM is from 0x1000000 to 0x1000800.  */
          contents[addr + 2] &= ~0xc0;
          contents[addr + 2] &= ~0xc0;
          if (val >= 0x1000000 && val < 0x1000800)
          if (val >= 0x1000000 && val < 0x1000800)
            contents[addr + 2] |= 0xc0;
            contents[addr + 2] |= 0xc0;
          else
          else
            contents[addr + 2] |= 0x80;
            contents[addr + 2] |= 0x80;
          rstat = bfd_reloc_ok;
          rstat = bfd_reloc_ok;
          break;
          break;
        }
        }
 
 
      switch (rstat)
      switch (rstat)
        {
        {
        default:
        default:
          abort ();
          abort ();
        case bfd_reloc_ok:
        case bfd_reloc_ok:
          break;
          break;
        case bfd_reloc_outofrange:
        case bfd_reloc_outofrange:
          (*_bfd_error_handler)
          (*_bfd_error_handler)
            (_("%B: bad reloc address 0x%lx in section `%A'"),
            (_("%B: bad reloc address 0x%lx in section `%A'"),
             input_bfd, input_section, (unsigned long) rel->r_vaddr);
             input_bfd, input_section, (unsigned long) rel->r_vaddr);
          return FALSE;
          return FALSE;
        case bfd_reloc_overflow:
        case bfd_reloc_overflow:
          {
          {
            const char *name;
            const char *name;
            char buf[SYMNMLEN + 1];
            char buf[SYMNMLEN + 1];
 
 
            if (symndx == -1)
            if (symndx == -1)
              name = "*ABS*";
              name = "*ABS*";
            else if (h != NULL)
            else if (h != NULL)
              name = NULL;
              name = NULL;
            else
            else
              {
              {
                name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
                name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
                if (name == NULL)
                if (name == NULL)
                  return FALSE;
                  return FALSE;
              }
              }
 
 
            if (! ((*info->callbacks->reloc_overflow)
            if (! ((*info->callbacks->reloc_overflow)
                   (info, (h ? &h->root : NULL), name, howto->name,
                   (info, (h ? &h->root : NULL), name, howto->name,
                    (bfd_vma) 0, input_bfd, input_section,
                    (bfd_vma) 0, input_bfd, input_section,
                    rel->r_vaddr - input_section->vma)))
                    rel->r_vaddr - input_section->vma)))
              return FALSE;
              return FALSE;
          }
          }
        }
        }
    }
    }
  return TRUE;
  return TRUE;
}
}


/* Clear the r_reserved field in relocs.  */
/* Clear the r_reserved field in relocs.  */
#define SWAP_OUT_RELOC_EXTRA(abfd,src,dst) \
#define SWAP_OUT_RELOC_EXTRA(abfd,src,dst) \
  do \
  do \
    { \
    { \
      dst->r_reserved[0] = 0; \
      dst->r_reserved[0] = 0; \
      dst->r_reserved[1] = 0; \
      dst->r_reserved[1] = 0; \
    } \
    } \
  while (0)
  while (0)
 
 
#define TIC80COFF 1             /* Customize coffcode.h */
#define TIC80COFF 1             /* Customize coffcode.h */
#undef C_AUTOARG                /* Clashes with TIc80's C_UEXT */
#undef C_AUTOARG                /* Clashes with TIc80's C_UEXT */
#undef C_LASTENT                /* Clashes with TIc80's C_STATLAB */
#undef C_LASTENT                /* Clashes with TIc80's C_STATLAB */
#include "coffcode.h"
#include "coffcode.h"
 
 
CREATE_LITTLE_COFF_TARGET_VEC (tic80coff_vec, "coff-tic80", D_PAGED, 0, '_', NULL, COFF_SWAP_TABLE)
CREATE_LITTLE_COFF_TARGET_VEC (tic80coff_vec, "coff-tic80", D_PAGED, 0, '_', NULL, COFF_SWAP_TABLE)
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.