diff options
author | Ben Cheng <bccheng@google.com> | 2013-04-09 11:29:01 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2013-04-09 11:29:01 -0700 |
commit | f226517827d64cc8f9dccb0952731601ac13ef2a (patch) | |
tree | 84b1056255b318a87b7a47b2684655660cab66f0 /binutils-2.23/opcodes/dis-buf.c | |
parent | 30fe22e2cc89991b16ab3853f95c7319574456ce (diff) | |
download | toolchain_binutils-f226517827d64cc8f9dccb0952731601ac13ef2a.tar.gz toolchain_binutils-f226517827d64cc8f9dccb0952731601ac13ef2a.tar.bz2 toolchain_binutils-f226517827d64cc8f9dccb0952731601ac13ef2a.zip |
Initial checkin for binutils 2.23.2 (needed by aarch64)
Change-Id: I7e5f319e9e632cc0ccc8a4ec1051169ed2849ca4
Diffstat (limited to 'binutils-2.23/opcodes/dis-buf.c')
-rw-r--r-- | binutils-2.23/opcodes/dis-buf.c | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/binutils-2.23/opcodes/dis-buf.c b/binutils-2.23/opcodes/dis-buf.c new file mode 100644 index 00000000..372fb96b --- /dev/null +++ b/binutils-2.23/opcodes/dis-buf.c @@ -0,0 +1,105 @@ +/* Disassemble from a buffer, for GNU. + Copyright 1993, 1994, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2005, + 2007, 2009, 2010 Free Software Foundation, Inc. + + This file is part of the GNU opcodes library. + + This library 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, or (at your option) + any later version. + + It 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., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#include "sysdep.h" +#include "dis-asm.h" +#include <errno.h> +#include "opintl.h" + +/* Get LENGTH bytes from info's buffer, at target address memaddr. + Transfer them to myaddr. */ +int +buffer_read_memory (bfd_vma memaddr, + bfd_byte *myaddr, + unsigned int length, + struct disassemble_info *info) +{ + unsigned int opb = info->octets_per_byte; + unsigned int end_addr_offset = length / opb; + unsigned int max_addr_offset = info->buffer_length / opb; + unsigned int octets = (memaddr - info->buffer_vma) * opb; + + if (memaddr < info->buffer_vma + || memaddr - info->buffer_vma > max_addr_offset + || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset) + /* Out of bounds. Use EIO because GDB uses it. */ + return EIO; + memcpy (myaddr, info->buffer + octets, length); + + return 0; +} + +/* Print an error message. We can assume that this is in response to + an error return from buffer_read_memory. */ + +void +perror_memory (int status, + bfd_vma memaddr, + struct disassemble_info *info) +{ + if (status != EIO) + /* Can't happen. */ + info->fprintf_func (info->stream, _("Unknown error %d\n"), status); + else + { + char buf[30]; + + /* Actually, address between memaddr and memaddr + len was + out of bounds. */ + sprintf_vma (buf, memaddr); + info->fprintf_func (info->stream, + _("Address 0x%s is out of bounds.\n"), buf); + } +} + +/* This could be in a separate file, to save miniscule amounts of space + in statically linked executables. */ + +/* Just print the address is hex. This is included for completeness even + though both GDB and objdump provide their own (to print symbolic + addresses). */ + +void +generic_print_address (bfd_vma addr, struct disassemble_info *info) +{ + char buf[30]; + + sprintf_vma (buf, addr); + (*info->fprintf_func) (info->stream, "0x%s", buf); +} + +/* Just return true. */ + +int +generic_symbol_at_address (bfd_vma addr ATTRIBUTE_UNUSED, + struct disassemble_info *info ATTRIBUTE_UNUSED) +{ + return 1; +} + +/* Just return TRUE. */ + +bfd_boolean +generic_symbol_is_valid (asymbol * sym ATTRIBUTE_UNUSED, + struct disassemble_info *info ATTRIBUTE_UNUSED) +{ + return TRUE; +} |