X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf32-sh64-com.c;h=1b6a8f5aad295ae338d3812ee60d0813f17ab32d;hb=0bf60745767d2465c81ee57ae7705a62d6d8fafe;hp=ae2cab4e6909efa95ad04ee471e48c4b0af314c9;hpb=2ee563b53258d390d7446e90a67f465d504ae44c;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-sh64-com.c b/bfd/elf32-sh64-com.c index ae2cab4e69..1b6a8f5aad 100644 --- a/bfd/elf32-sh64-com.c +++ b/bfd/elf32-sh64-com.c @@ -1,21 +1,21 @@ -/* Hitachi SH64-specific support for 32-bit ELF - Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. - +/* SuperH SH64-specific support for 32-bit ELF + Copyright 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + 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 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. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ #define SH64_ELF @@ -24,18 +24,17 @@ #include "libbfd.h" #include "elf-bfd.h" #include "elf/sh.h" +#include "elf32-sh64.h" #include "../opcodes/sh64-opc.h" -static boolean sh64_address_in_cranges - PARAMS ((asection *cranges, bfd_vma, sh64_elf_crange *)); +static bfd_boolean sh64_address_in_cranges + (asection *cranges, bfd_vma, sh64_elf_crange *); /* Ordering functions of a crange, for the qsort and bsearch calls and for different endianness. */ int -_bfd_sh64_crange_qsort_cmpb (p1, p2) - const PTR p1; - const PTR p2; +_bfd_sh64_crange_qsort_cmpb (const void *p1, const void *p2) { bfd_vma a1 = bfd_getb32 (p1); bfd_vma a2 = bfd_getb32 (p2); @@ -48,9 +47,7 @@ _bfd_sh64_crange_qsort_cmpb (p1, p2) } int -_bfd_sh64_crange_qsort_cmpl (p1, p2) - const PTR p1; - const PTR p2; +_bfd_sh64_crange_qsort_cmpl (const void *p1, const void *p2) { bfd_vma a1 = (bfd_vma) bfd_getl32 (p1); bfd_vma a2 = (bfd_vma) bfd_getl32 (p2); @@ -63,9 +60,7 @@ _bfd_sh64_crange_qsort_cmpl (p1, p2) } int -_bfd_sh64_crange_bsearch_cmpb (p1, p2) - const PTR p1; - const PTR p2; +_bfd_sh64_crange_bsearch_cmpb (const void *p1, const void *p2) { bfd_vma a1 = *(bfd_vma *) p1; bfd_vma a2 = (bfd_vma) bfd_getb32 (p2); @@ -80,9 +75,7 @@ _bfd_sh64_crange_bsearch_cmpb (p1, p2) } int -_bfd_sh64_crange_bsearch_cmpl (p1, p2) - const PTR p1; - const PTR p2; +_bfd_sh64_crange_bsearch_cmpl (const void *p1, const void *p2) { bfd_vma a1 = *(bfd_vma *) p1; bfd_vma a2 = (bfd_vma) bfd_getl32 (p2); @@ -100,24 +93,22 @@ _bfd_sh64_crange_bsearch_cmpl (p1, p2) section. Return FALSE if not found, and TRUE if found, and the region filled into RANGEP if non-NULL. */ -static boolean -sh64_address_in_cranges (cranges, addr, rangep) - asection *cranges; - bfd_vma addr; - sh64_elf_crange *rangep; +static bfd_boolean +sh64_address_in_cranges (asection *cranges, bfd_vma addr, + sh64_elf_crange *rangep) { bfd_byte *cranges_contents; bfd_byte *found_rangep; - bfd_size_type cranges_size = bfd_section_size (cranges->owner, cranges); + bfd_size_type cranges_size = cranges->size; /* If the size is not a multiple of the cranges entry size, then something is badly wrong. */ if ((cranges_size % SH64_CRANGE_SIZE) != 0) - return false; + return FALSE; /* If this section has relocations, then we can't do anything sane. */ if (bfd_get_section_flags (cranges->owner, cranges) & SEC_RELOC) - return false; + return FALSE; /* Has some kind soul (or previous call) left processed, sorted contents for us? */ @@ -126,15 +117,8 @@ sh64_address_in_cranges (cranges, addr, rangep) cranges_contents = cranges->contents; else { - cranges_contents - = bfd_malloc (cranges->_cooked_size == 0 - ? cranges->_cooked_size : cranges->_raw_size); - if (cranges_contents == NULL) - return false; - - if (! bfd_get_section_contents (cranges->owner, cranges, - cranges_contents, (file_ptr) 0, - cranges_size)) + if (!bfd_malloc_and_get_section (cranges->owner, cranges, + &cranges_contents)) goto error_return; /* Is it sorted? */ @@ -183,26 +167,24 @@ sh64_address_in_cranges (cranges, addr, rangep) rangep->cr_size = cr_size; rangep->cr_type = cr_type; - return true; + return TRUE; } /* There is a .cranges section, but it does not have a descriptor matching this address. */ - return false; + return FALSE; error_return: - free (cranges_contents); - return false; + if (cranges_contents != NULL) + free (cranges_contents); + return FALSE; } /* Determine what ADDR points to in SEC, and fill in a range descriptor in *RANGEP if it's non-NULL. */ enum sh64_elf_cr_type -sh64_get_contents_type (sec, addr, rangep) - asection *sec; - bfd_vma addr; - sh64_elf_crange *rangep; +sh64_get_contents_type (asection *sec, bfd_vma addr, sh64_elf_crange *rangep) { asection *cranges; @@ -211,11 +193,11 @@ sh64_get_contents_type (sec, addr, rangep) && elf_elfheader (sec->owner)->e_type == ET_EXEC) { rangep->cr_addr = bfd_get_section_vma (sec->owner, sec); - rangep->cr_size = bfd_section_size (sec->owner, sec); + rangep->cr_size = sec->size; rangep->cr_type = CRT_NONE; } else - return false; + return FALSE; /* If none of the pertinent bits are set, then it's a SHcompact (or at least not SHmedia). */ @@ -254,10 +236,8 @@ sh64_get_contents_type (sec, addr, rangep) /* This is a simpler exported interface for the benefit of gdb et al. */ -boolean -sh64_address_is_shmedia (sec, addr) - asection *sec; - bfd_vma addr; +bfd_boolean +sh64_address_is_shmedia (asection *sec, bfd_vma addr) { sh64_elf_crange dummy; return sh64_get_contents_type (sec, addr, &dummy) == CRT_SH5_ISA32;