X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ffindcmd.c;h=3fce2695919c096297bcb5d6df77f7c8f18bc33d;hb=8775fd2d8dbaec2ffe735081cce31e259c3b0d44;hp=2996fb02bfa773206d2f2ae5e8c1400daf2001a1;hpb=8b9b9e1a3a418a932d0ab62df99466c685d7b184;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/findcmd.c b/gdb/findcmd.c index 2996fb02bf..3fce269591 100644 --- a/gdb/findcmd.c +++ b/gdb/findcmd.c @@ -1,6 +1,6 @@ /* The find command. - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008-2012 Free Software Foundation, Inc. This file is part of GDB. @@ -18,6 +18,7 @@ along with this program. If not, see . */ #include "defs.h" +#include "arch-utils.h" #include #include "gdb_string.h" #include "gdbcmd.h" @@ -50,7 +51,8 @@ put_bits (bfd_uint64_t data, char *buf, int bits, bfd_boolean big_p) static void parse_find_args (char *args, ULONGEST *max_countp, char **pattern_bufp, ULONGEST *pattern_lenp, - CORE_ADDR *start_addrp, ULONGEST *search_space_lenp) + CORE_ADDR *start_addrp, ULONGEST *search_space_lenp, + bfd_boolean big_p) { /* Default to using the specified type. */ char size = '\0'; @@ -67,7 +69,6 @@ parse_find_args (char *args, ULONGEST *max_countp, CORE_ADDR start_addr; ULONGEST search_space_len; char *s = args; - bfd_boolean big_p = gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG; struct cleanup *old_cleanups; struct value *v; @@ -125,11 +126,13 @@ parse_find_args (char *args, ULONGEST *max_countp, if (*s == '+') { LONGEST len; + ++s; v = parse_to_comma_and_eval (&s); len = value_as_long (v); if (len == 0) { + do_cleanups (old_cleanups); printf_filtered (_("Empty search range.\n")); return; } @@ -144,16 +147,18 @@ parse_find_args (char *args, ULONGEST *max_countp, else { CORE_ADDR end_addr; + v = parse_to_comma_and_eval (&s); end_addr = value_as_address (v); if (start_addr > end_addr) - error (_("Invalid search space, end preceeds start.")); + error (_("Invalid search space, end precedes start.")); search_space_len = end_addr - start_addr + 1; /* We don't support searching all of memory (i.e. start=0, end = 0xff..ff). Bail to avoid overflows later on. */ if (search_space_len == 0) - error (_("Overflow in address range computation, choose smaller range.")); + error (_("Overflow in address range " + "computation, choose smaller range.")); } if (*s == ',') @@ -178,6 +183,7 @@ parse_find_args (char *args, ULONGEST *max_countp, > pattern_buf_size) { size_t current_offset = pattern_buf_end - pattern_buf; + pattern_buf_size *= 2; pattern_buf = xrealloc (pattern_buf, pattern_buf_size); pattern_buf_end = pattern_buf + current_offset; @@ -207,7 +213,7 @@ parse_find_args (char *args, ULONGEST *max_countp, } else { - memcpy (pattern_buf_end, value_contents_raw (v), val_bytes); + memcpy (pattern_buf_end, value_contents (v), val_bytes); pattern_buf_end += val_bytes; } @@ -239,6 +245,8 @@ parse_find_args (char *args, ULONGEST *max_countp, static void find_command (char *args, int from_tty) { + struct gdbarch *gdbarch = get_current_arch (); + bfd_boolean big_p = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG; /* Command line parameters. These are initialized to avoid uninitialized warnings from -Wall. */ ULONGEST max_count = 0; @@ -252,7 +260,7 @@ find_command (char *args, int from_tty) struct cleanup *old_cleanups; parse_find_args (args, &max_count, &pattern_buf, &pattern_len, - &start_addr, &search_space_len); + &start_addr, &search_space_len, big_p); old_cleanups = make_cleanup (free_current_contents, &pattern_buf); @@ -273,7 +281,7 @@ find_command (char *args, int from_tty) if (found <= 0) break; - print_address (found_addr, gdb_stdout); + print_address (gdbarch, found_addr, gdb_stdout); printf_filtered ("\n"); ++found_count; last_found_addr = found_addr; @@ -291,13 +299,11 @@ find_command (char *args, int from_tty) /* Record and print the results. */ - set_internalvar (lookup_internalvar ("numfound"), - value_from_longest (builtin_type_int32, - (LONGEST) found_count)); + set_internalvar_integer (lookup_internalvar ("numfound"), found_count); if (found_count > 0) { - struct gdbarch *gdbarch = current_gdbarch; struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr; + set_internalvar (lookup_internalvar ("_"), value_from_pointer (ptr_type, last_found_addr)); } @@ -311,13 +317,16 @@ find_command (char *args, int from_tty) do_cleanups (old_cleanups); } +/* Provide a prototype to silence -Wmissing-prototypes. */ +extern initialize_file_ftype _initialize_mem_search; + void _initialize_mem_search (void) { add_cmd ("find", class_vars, find_command, _("\ Search memory for a sequence of bytes.\n\ -Usage:\n\ -find [/size-char] [/max-count] start-address, end-address, expr1 [, expr2 ...]\n\ +Usage:\nfind \ +[/size-char] [/max-count] start-address, end-address, expr1 [, expr2 ...]\n\ find [/size-char] [/max-count] start-address, +length, expr1 [, expr2 ...]\n\ size-char is one of b,h,w,g for 8,16,32,64 bit values respectively,\n\ and if not specified the size is taken from the type of the expression\n\