X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fcoff-h8500.c;h=7e5844c316dd4973bca1320878ef96b4fa84d555;hb=5430098f1807e084fe4ff5057040d68435f3d8a2;hp=c54d977f26b49d131a15f6379964e00631fd9072;hpb=b34976b65aea8f33690229600bbf4527ec3118e1;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/coff-h8500.c b/bfd/coff-h8500.c index c54d977f26..7e5844c316 100644 --- a/bfd/coff-h8500.c +++ b/bfd/coff-h8500.c @@ -1,37 +1,33 @@ -/* BFD back-end for Hitachi H8/500 COFF binaries. - Copyright 1993, 1994, 1995, 1997, 1999, 2000, 2001, 2002 - Free Software Foundation, Inc. +/* BFD back-end for Renesas H8/500 COFF binaries. + Copyright (C) 1993-2017 Free Software Foundation, Inc. Contributed by Cygnus Support. Written by Steve Chamberlain, . -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 -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + 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 + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ -#include "bfd.h" #include "sysdep.h" +#include "bfd.h" #include "libbfd.h" #include "bfdlink.h" #include "coff/h8500.h" #include "coff/internal.h" #include "libcoff.h" -static int coff_h8500_select_reloc PARAMS ((reloc_howto_type *)); -static void rtype2howto PARAMS ((arelent *, struct internal_reloc *)); -static void reloc_processing PARAMS ((arelent *, struct internal_reloc *, asymbol **, bfd *, asection *)); -static void extra_case PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *, bfd_byte *, unsigned int *, unsigned int *)); #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1) @@ -72,8 +68,7 @@ HOWTO (R_H8500_HIGH16, 0, 1, 8, FALSE, 0, /* Turn a howto into a reloc number. */ static int -coff_h8500_select_reloc (howto) - reloc_howto_type *howto; +coff_h8500_select_reloc (reloc_howto_type *howto) { return howto->type; } @@ -95,14 +90,12 @@ coff_h8500_select_reloc (howto) /* Code to turn a r_type into a howto ptr, uses the above howto table. */ static void -rtype2howto (internal, dst) - arelent * internal; - struct internal_reloc *dst; +rtype2howto (arelent * internal, struct internal_reloc *dst) { switch (dst->r_type) { default: - abort (); + internal->howto = NULL; break; case R_H8500_IMM8: internal->howto = &r_imm8; @@ -144,12 +137,12 @@ rtype2howto (internal, dst) #define RELOC_PROCESSING(relent,reloc,symbols,abfd,section) \ reloc_processing(relent, reloc, symbols, abfd, section) -static void reloc_processing (relent, reloc, symbols, abfd, section) - arelent * relent; - struct internal_reloc *reloc; - asymbol ** symbols; - bfd * abfd; - asection * section; +static void +reloc_processing (arelent * relent, + struct internal_reloc *reloc, + asymbol ** symbols, + bfd * abfd, + asection * section) { relent->address = reloc->r_vaddr; rtype2howto (relent, reloc); @@ -164,14 +157,13 @@ static void reloc_processing (relent, reloc, symbols, abfd, section) } static void -extra_case (in_abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr) - bfd *in_abfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - arelent *reloc; - bfd_byte *data; - unsigned int *src_ptr; - unsigned int *dst_ptr; +extra_case (bfd *in_abfd, + struct bfd_link_info *link_info, + struct bfd_link_order *link_order, + arelent *reloc, + bfd_byte *data, + unsigned int *src_ptr, + unsigned int *dst_ptr) { bfd_byte *d = data+*dst_ptr; asection *input_section = link_order->u.indirect.section; @@ -229,7 +221,7 @@ extra_case (in_abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr) v = (v & 0x00ffffff) | (o & 0xff00000); bfd_put_32 (in_abfd, (bfd_vma) v, data + *dst_ptr -1); (*dst_ptr) += 3; - (*src_ptr) += 3;; + (*src_ptr) += 3; } break; case R_H8500_IMM32: @@ -237,7 +229,7 @@ extra_case (in_abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr) int v = bfd_coff_reloc16_get_value (reloc, link_info, input_section); bfd_put_32 (in_abfd, (bfd_vma) v, data + *dst_ptr); (*dst_ptr) += 4; - (*src_ptr) += 4;; + (*src_ptr) += 4; } break; @@ -245,20 +237,18 @@ extra_case (in_abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr) { bfd_vma dst = bfd_coff_reloc16_get_value (reloc, link_info, input_section); - bfd_vma dot = link_order->offset - + *dst_ptr - + link_order->u.indirect.section->output_section->vma; + bfd_vma dot = (*dst_ptr + + input_section->output_offset + + input_section->output_section->vma); int gap = dst - dot - 1; /* -1 since were in the odd byte of the word and the pc's been incremented. */ if (gap > 128 || gap < -128) - { - if (! ((*link_info->callbacks->reloc_overflow) - (link_info, bfd_asymbol_name (*reloc->sym_ptr_ptr), - reloc->howto->name, reloc->addend, input_section->owner, - input_section, reloc->address))) - abort (); - } + (*link_info->callbacks->reloc_overflow) + (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr), + reloc->howto->name, reloc->addend, input_section->owner, + input_section, reloc->address); + bfd_put_8 (in_abfd, gap, data + *dst_ptr); (*dst_ptr)++; (*src_ptr)++; @@ -268,20 +258,18 @@ extra_case (in_abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr) { bfd_vma dst = bfd_coff_reloc16_get_value (reloc, link_info, input_section); - bfd_vma dot = link_order->offset - + *dst_ptr - + link_order->u.indirect.section->output_section->vma; + bfd_vma dot = (*dst_ptr + + input_section->output_offset + + input_section->output_section->vma); int gap = dst - dot - 1; /* -1 since were in the odd byte of the word and the pc's been incremented. */ if (gap > 32767 || gap < -32768) - { - if (! ((*link_info->callbacks->reloc_overflow) - (link_info, bfd_asymbol_name (*reloc->sym_ptr_ptr), - reloc->howto->name, reloc->addend, input_section->owner, - input_section, reloc->address))) - abort (); - } + (*link_info->callbacks->reloc_overflow) + (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr), + reloc->howto->name, reloc->addend, input_section->owner, + input_section, reloc->address); + bfd_put_16 (in_abfd, (bfd_vma) gap, data + *dst_ptr); (*dst_ptr) += 2; (*src_ptr) += 2; @@ -295,6 +283,10 @@ extra_case (in_abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr) #define coff_reloc16_extra_cases extra_case +#ifndef bfd_pe_print_pdata +#define bfd_pe_print_pdata NULL +#endif + #include "coffcode.h" #undef coff_bfd_get_relocated_section_contents @@ -303,4 +295,4 @@ extra_case (in_abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr) bfd_coff_reloc16_get_relocated_section_contents #define coff_bfd_relax_section bfd_coff_reloc16_relax_section -CREATE_BIG_COFF_TARGET_VEC (h8500coff_vec, "coff-h8500", 0, 0, '_', NULL) +CREATE_BIG_COFF_TARGET_VEC (h8500_coff_vec, "coff-h8500", 0, 0, '_', NULL, COFF_SWAP_TABLE)