coff-tic80.c

来自「基于4个mips核的noc设计」· C语言 代码 · 共 719 行 · 第 1/2 页

C
719
字号
	      error_message)     bfd *abfd ATTRIBUTE_UNUSED;     arelent *reloc_entry ATTRIBUTE_UNUSED;     asymbol *symbol_in ATTRIBUTE_UNUSED;     PTR data ATTRIBUTE_UNUSED;     asection *input_section ATTRIBUTE_UNUSED;     bfd *output_bfd ATTRIBUTE_UNUSED;     char **error_message ATTRIBUTE_UNUSED;{  /* FIXME.  */  abort ();}/* This special function is used for the global 15 bit relocations.  */static bfd_reloc_status_typeglob15_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,	      error_message)     bfd *abfd ATTRIBUTE_UNUSED;     arelent *reloc_entry ATTRIBUTE_UNUSED;     asymbol *symbol_in ATTRIBUTE_UNUSED;     PTR data ATTRIBUTE_UNUSED;     asection *input_section ATTRIBUTE_UNUSED;     bfd *output_bfd ATTRIBUTE_UNUSED;     char **error_message ATTRIBUTE_UNUSED;{  /* FIXME.  */  abort ();}/* This special function is used for the global 16 bit relocations.  */static bfd_reloc_status_typeglob16_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,	      error_message)     bfd *abfd ATTRIBUTE_UNUSED;     arelent *reloc_entry ATTRIBUTE_UNUSED;     asymbol *symbol_in ATTRIBUTE_UNUSED;     PTR data ATTRIBUTE_UNUSED;     asection *input_section ATTRIBUTE_UNUSED;     bfd *output_bfd ATTRIBUTE_UNUSED;     char **error_message ATTRIBUTE_UNUSED;{  /* FIXME.  */  abort ();}/* This special function is used for the local 16 bit relocations.  */static bfd_reloc_status_typelocal16_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,	      error_message)     bfd *abfd ATTRIBUTE_UNUSED;     arelent *reloc_entry ATTRIBUTE_UNUSED;     asymbol *symbol_in ATTRIBUTE_UNUSED;     PTR data ATTRIBUTE_UNUSED;     asection *input_section ATTRIBUTE_UNUSED;     bfd *output_bfd ATTRIBUTE_UNUSED;     char **error_message ATTRIBUTE_UNUSED;{  /* FIXME.  */  abort ();}/* 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   to generate an output file.  */static voidrtype2howto (cache_ptr, dst)     arelent *cache_ptr;     struct internal_reloc *dst;{  unsigned int i;  for (i = 0; i < sizeof tic80_howto_table / sizeof tic80_howto_table[0]; i++)    {      if (tic80_howto_table[i].type == dst->r_type)	{	  cache_ptr->howto = tic80_howto_table + i;	  return;	}    }  (*_bfd_error_handler) (_("Unrecognized reloc type 0x%x"),			 (unsigned int) dst->r_type);  cache_ptr->howto = tic80_howto_table + 0;}#define RTYPE2HOWTO(cache_ptr, dst) rtype2howto (cache_ptr, dst)#define coff_rtype_to_howto coff_tic80_rtype_to_howtostatic reloc_howto_type *coff_tic80_rtype_to_howto (abfd, sec, rel, h, sym, addendp)     bfd *abfd ATTRIBUTE_UNUSED;     asection *sec;     struct internal_reloc *rel;     struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;     struct internal_syment *sym ATTRIBUTE_UNUSED;     bfd_vma *addendp;{  arelent genrel;  if (rel -> r_symndx == -1 && addendp != NULL)    {      /* This is a TI "internal relocation", which means that the relocation	 amount is the amount by which the current section is being relocated	 in the output section.  */      *addendp = (sec -> output_section -> vma + sec -> output_offset) - sec -> vma;    }  RTYPE2HOWTO (&genrel, rel);  return genrel.howto;}#ifndef BADMAG#define BADMAG(x) TIC80BADMAG(x)#endif#define coff_relocate_section coff_tic80_relocate_section/* We need a special relocation routine to handle the PP relocs.  Most   of this is a copy of _bfd_coff_generic_relocate_section.  */static booleancoff_tic80_relocate_section (output_bfd, info, input_bfd,			     input_section, contents, relocs, syms,			     sections)     bfd *output_bfd;     struct bfd_link_info *info;     bfd *input_bfd;     asection *input_section;     bfd_byte *contents;     struct internal_reloc *relocs;     struct internal_syment *syms;     asection **sections;{  struct internal_reloc *rel;  struct internal_reloc *relend;  rel = relocs;  relend = rel + input_section->reloc_count;  for (; rel < relend; rel++)    {      long symndx;      struct coff_link_hash_entry *h;      struct internal_syment *sym;      bfd_vma addend;      bfd_vma val;      reloc_howto_type *howto;      bfd_reloc_status_type rstat;      bfd_vma addr;      symndx = rel->r_symndx;      if (symndx == -1)	{	  h = NULL;	  sym = NULL;	}      else	{	  h = obj_coff_sym_hashes (input_bfd)[symndx];	  sym = syms + symndx;	}      /* COFF treats common symbols in one of two ways.  Either the         size of the symbol is included in the section contents, or it         is not.  We assume that the size is not included, and force         the rtype_to_howto function to adjust the addend as needed.  */      if (sym != NULL && sym->n_scnum != 0)	addend = - sym->n_value;      else	addend = 0;      howto = bfd_coff_rtype_to_howto (input_bfd, input_section, rel, h,				       sym, &addend);      if (howto == NULL)	return false;      val = 0;      if (h == NULL)	{	  asection *sec;	  if (symndx == -1)	    {	      sec = bfd_abs_section_ptr;	      val = 0;	    }	  else	    {	      sec = sections[symndx];              val = (sec->output_section->vma		     + sec->output_offset		     + sym->n_value);	      if (! obj_pe (output_bfd))		val -= sec->vma;	    }	}      else	{	  if (h->root.type == bfd_link_hash_defined	      || h->root.type == bfd_link_hash_defweak)	    {	      asection *sec;	      sec = h->root.u.def.section;	      val = (h->root.u.def.value		     + sec->output_section->vma		     + sec->output_offset);	      }	  else if (! info->relocateable)	    {	      if (! ((*info->callbacks->undefined_symbol)		     (info, h->root.root.string, input_bfd, input_section,		      rel->r_vaddr - input_section->vma, true)))		return false;	    }	}      addr = rel->r_vaddr - input_section->vma;      /* FIXME: This code assumes little endian, but the PP can         apparently be bi-endian.  I don't know if the bi-endianness         applies to the instruction set or just to the data.  */      switch (howto->type)	{	default:	case R_ABS:	case R_RELLONGX:	case R_PPL15:	case R_PPL15W:	case R_PPL15H:	case R_PPLN15:	case R_PPLN15W:	case R_PPLN15H:	  rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,					    contents, addr, val, addend);	  break;	case R_PP15:	case R_PP15W:	case R_PP15H:	case R_PPN15:	case R_PPN15W:	case R_PPN15H:	  /* Offset the address so that we can use 4 byte relocations.  */	  rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,					    contents + 2, addr, val, addend);	  break;	case R_PP16B:	case R_PPN16B:	  {	    /* The most significant bit is stored in bit 6.  */	    bfd_byte hold;	    hold = contents[addr + 4];	    contents[addr + 4] &=~ 0x20;	    contents[addr + 4] |= (contents[addr] >> 1) & 0x20;	    rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,					      contents + 2, addr,					      val, addend);	    contents[addr] &=~ 0x40;	    contents[addr] |= (contents[addr + 4] << 1) & 0x40;	    contents[addr + 4] &=~ 0x20;	    contents[addr + 4] |= hold & 0x20;	    break;	  }	case R_PPL16B:	case R_PPLN16B:	  {	    /* The most significant bit is stored in bit 28.  */	    bfd_byte hold;	    hold = contents[addr + 1];	    contents[addr + 1] &=~ 0x80;	    contents[addr + 1] |= (contents[addr + 3] << 3) & 0x80;	    rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,					      contents, addr,					      val, addend);	    contents[addr + 3] &= ~0x10;	    contents[addr + 3] |= (contents[addr + 1] >> 3) & 0x10;	    contents[addr + 1] &=~ 0x80;	    contents[addr + 1] |= hold & 0x80;	    break;	  }	case R_PPBASE:	  /* Parameter RAM is from 0x1000000 to 0x1000800.  */	  contents[addr] &=~ 0x3;	  if (val >= 0x1000000 && val < 0x1000800)	    contents[addr] |= 0x3;	  else	    contents[addr] |= 0x2;	  rstat = bfd_reloc_ok;	  break;	case R_PPLBASE:	  /* Parameter RAM is from 0x1000000 to 0x1000800.  */	  contents[addr + 2] &= ~0xc0;	  if (val >= 0x1000000 && val < 0x1000800)	    contents[addr + 2] |= 0xc0;	  else	    contents[addr + 2] |= 0x80;	  rstat = bfd_reloc_ok;	  break;	}      switch (rstat)	{	default:	  abort ();	case bfd_reloc_ok:	  break;	case bfd_reloc_outofrange:	  (*_bfd_error_handler)	    (_("%s: bad reloc address 0x%lx in section `%s'"),	     bfd_get_filename (input_bfd),	     (unsigned long) rel->r_vaddr,	     bfd_get_section_name (input_bfd, input_section));	  return false;	case bfd_reloc_overflow:	  {	    const char *name;	    char buf[SYMNMLEN + 1];	    if (symndx == -1)	      name = "*ABS*";	    else if (h != NULL)	      name = h->root.root.string;	    else	      {		name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);		if (name == NULL)		  return false;	      }	    if (! ((*info->callbacks->reloc_overflow)		   (info, name, howto->name, (bfd_vma) 0, input_bfd,		    input_section, rel->r_vaddr - input_section->vma)))	      return false;	  }	}    }  return true;}#define TIC80COFF 1		/* Customize coffcode.h */#undef C_AUTOARG		/* Clashes with TIc80's C_UEXT */#undef C_LASTENT		/* Clashes with TIc80's C_STATLAB */#include "coffcode.h"CREATE_LITTLE_COFF_TARGET_VEC (tic80coff_vec, "coff-tic80", D_PAGED, 0, '_', NULL)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?