X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ffindcmd.c;h=99cecb33348cd0a78d1c18fff894750c12e0fe6c;hb=2608dbf8a3ee666ac0a7d5d7c45611d489edcda5;hp=a1dfaf3bb2cfe97ce74c7c054cd13d8ad60891c2;hpb=5e1471f57fac8ea99e40cfb4be212e896bac56ff;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/findcmd.c b/gdb/findcmd.c index a1dfaf3bb2..99cecb3334 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-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -18,16 +18,17 @@ along with this program. If not, see . */ #include "defs.h" +#include "arch-utils.h" #include -#include "gdb_string.h" #include "gdbcmd.h" #include "value.h" #include "target.h" +#include "cli/cli-utils.h" /* Copied from bfd_put_bits. */ static void -put_bits (bfd_uint64_t data, char *buf, int bits, bfd_boolean big_p) +put_bits (bfd_uint64_t data, gdb_byte *buf, int bits, bfd_boolean big_p) { int i; int bytes; @@ -49,25 +50,25 @@ 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) + gdb_byte **pattern_bufp, ULONGEST *pattern_lenp, + CORE_ADDR *start_addrp, ULONGEST *search_space_lenp, + bfd_boolean big_p) { /* Default to using the specified type. */ char size = '\0'; ULONGEST max_count = ~(ULONGEST) 0; /* Buffer to hold the search pattern. */ - char *pattern_buf; + gdb_byte *pattern_buf; /* Current size of search pattern buffer. We realloc space as needed. */ #define INITIAL_PATTERN_BUF_SIZE 100 ULONGEST pattern_buf_size = INITIAL_PATTERN_BUF_SIZE; /* Pointer to one past the last in-use part of pattern_buf. */ - char *pattern_buf_end; + gdb_byte *pattern_buf_end; ULONGEST pattern_len; CORE_ADDR start_addr; ULONGEST search_space_len; - char *s = args; - bfd_boolean big_p = gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG; + const char *s = args; struct cleanup *old_cleanups; struct value *v; @@ -108,8 +109,7 @@ parse_find_args (char *args, ULONGEST *max_countp, } } - while (isspace (*s)) - ++s; + s = skip_spaces_const (s); } /* Get the search range. */ @@ -119,17 +119,18 @@ parse_find_args (char *args, ULONGEST *max_countp, if (*s == ',') ++s; - while (isspace (*s)) - ++s; + s = skip_spaces_const (s); 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 +145,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 == ',') @@ -164,21 +167,23 @@ parse_find_args (char *args, ULONGEST *max_countp, while (*s != '\0') { LONGEST x; - int val_bytes; + struct type *t; + ULONGEST pattern_buf_size_need; - while (isspace (*s)) - ++s; + s = skip_spaces_const (s); v = parse_to_comma_and_eval (&s); - val_bytes = TYPE_LENGTH (value_type (v)); + t = value_type (v); /* Keep it simple and assume size == 'g' when watching for when we need to grow the pattern buf. */ - if ((pattern_buf_end - pattern_buf + max (val_bytes, sizeof (int64_t))) - > pattern_buf_size) + pattern_buf_size_need = (pattern_buf_end - pattern_buf + + max (TYPE_LENGTH (t), sizeof (int64_t))); + if (pattern_buf_size_need > pattern_buf_size) { size_t current_offset = pattern_buf_end - pattern_buf; - pattern_buf_size *= 2; + + pattern_buf_size = pattern_buf_size_need * 2; pattern_buf = xrealloc (pattern_buf, pattern_buf_size); pattern_buf_end = pattern_buf + current_offset; } @@ -207,14 +212,13 @@ parse_find_args (char *args, ULONGEST *max_countp, } else { - memcpy (pattern_buf_end, value_contents_raw (v), val_bytes); - pattern_buf_end += val_bytes; + memcpy (pattern_buf_end, value_contents (v), TYPE_LENGTH (t)); + pattern_buf_end += TYPE_LENGTH (t); } if (*s == ',') ++s; - while (isspace (*s)) - ++s; + s = skip_spaces_const (s); } if (pattern_buf_end == pattern_buf) @@ -239,10 +243,12 @@ 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; - char *pattern_buf = 0; + gdb_byte *pattern_buf = 0; ULONGEST pattern_len = 0; CORE_ADDR start_addr = 0; ULONGEST search_space_len = 0; @@ -252,7 +258,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 +279,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,14 +297,13 @@ find_command (char *args, int from_tty) /* Record and print the results. */ - set_internalvar (lookup_internalvar ("numfound"), - value_from_longest (builtin_type_int, - (LONGEST) found_count)); + set_internalvar_integer (lookup_internalvar ("numfound"), found_count); if (found_count > 0) { + struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr; + set_internalvar (lookup_internalvar ("_"), - value_from_pointer (builtin_type_void_data_ptr, - last_found_addr)); + value_from_pointer (ptr_type, last_found_addr)); } if (found_count == 0) @@ -310,13 +315,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\