X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fvalprint.c;h=10020901c2df781033c31d6ee27dbaedae6514d1;hb=3d6e9d2336c9ffcedb10f89631981a23dd518e8e;hp=bed2cecf2c8207c735069366c9a6f133f401c995;hpb=f6ac5f3d63e03a81c4ff3749aba234961cc9090e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/valprint.c b/gdb/valprint.c index bed2cecf2c..10020901c2 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -1,6 +1,6 @@ /* Print values for GDB, the GNU debugger. - Copyright (C) 1986-2018 Free Software Foundation, Inc. + Copyright (C) 1986-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -986,7 +986,6 @@ generic_val_print (struct type *type, error (_("Unhandled type code %d in symbol table."), TYPE_CODE (type)); } - gdb_flush (stream); } /* Print using the given LANGUAGE the data of type TYPE located at @@ -1032,7 +1031,6 @@ val_print (struct type *type, LONGEST embedded_offset, if (TYPE_STUB (real_type)) { fprintf_filtered (stream, _("")); - gdb_flush (stream); return; } @@ -1604,6 +1602,7 @@ maybe_negate_by_bytes (const gdb_byte *bytes, unsigned len, gdb::byte_vector *out_vec) { gdb_byte sign_byte; + gdb_assert (len > 0); if (byte_order == BFD_ENDIAN_BIG) sign_byte = bytes[0]; else @@ -1885,7 +1884,7 @@ print_function_pointer_address (const struct value_print_options *options, { CORE_ADDR func_addr = gdbarch_convert_from_func_ptr_addr (gdbarch, address, - target_stack); + current_top_target ()); /* If the function pointer is represented by a description, print the address of the description. */ @@ -2096,10 +2095,10 @@ partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr, return (nread); } -/* Read a string from the inferior, at ADDR, with LEN characters of WIDTH bytes - each. Fetch at most FETCHLIMIT characters. BUFFER will be set to a newly - allocated buffer containing the string, which the caller is responsible to - free, and BYTES_READ will be set to the number of bytes read. Returns 0 on +/* Read a string from the inferior, at ADDR, with LEN characters of + WIDTH bytes each. Fetch at most FETCHLIMIT characters. BUFFER + will be set to a newly allocated buffer containing the string, and + BYTES_READ will be set to the number of bytes read. Returns 0 on success, or a target_xfer_status on failure. If LEN > 0, reads the lesser of LEN or FETCHLIMIT characters @@ -2122,20 +2121,18 @@ partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr, int read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit, - enum bfd_endian byte_order, gdb_byte **buffer, int *bytes_read) + enum bfd_endian byte_order, gdb::unique_xmalloc_ptr *buffer, + int *bytes_read) { int errcode; /* Errno returned from bad reads. */ unsigned int nfetch; /* Chars to fetch / chars fetched. */ gdb_byte *bufptr; /* Pointer to next available byte in buffer. */ - struct cleanup *old_chain = NULL; /* Top of the old cleanup chain. */ /* Loop until we either have all the characters, or we encounter some error, such as bumping into the end of the address space. */ - *buffer = NULL; - - old_chain = make_cleanup (free_current_contents, buffer); + buffer->reset (nullptr); if (len > 0) { @@ -2143,8 +2140,8 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit, one operation. */ unsigned int fetchlen = std::min ((unsigned) len, fetchlimit); - *buffer = (gdb_byte *) xmalloc (fetchlen * width); - bufptr = *buffer; + buffer->reset ((gdb_byte *) xmalloc (fetchlen * width)); + bufptr = buffer->get (); nfetch = partial_memory_read (addr, bufptr, fetchlen * width, &errcode) / width; @@ -2173,12 +2170,12 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit, nfetch = std::min ((unsigned long) chunksize, fetchlimit - bufsize); if (*buffer == NULL) - *buffer = (gdb_byte *) xmalloc (nfetch * width); + buffer->reset ((gdb_byte *) xmalloc (nfetch * width)); else - *buffer = (gdb_byte *) xrealloc (*buffer, - (nfetch + bufsize) * width); + buffer->reset ((gdb_byte *) xrealloc (buffer->release (), + (nfetch + bufsize) * width)); - bufptr = *buffer + bufsize * width; + bufptr = buffer->get () + bufsize * width; bufsize += nfetch; /* Read as much as we can. */ @@ -2210,24 +2207,23 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit, } } while (errcode == 0 /* no error */ - && bufptr - *buffer < fetchlimit * width /* no overrun */ + && bufptr - buffer->get () < fetchlimit * width /* no overrun */ && !found_nul); /* haven't found NUL yet */ } else { /* Length of string is really 0! */ /* We always allocate *buffer. */ - *buffer = bufptr = (gdb_byte *) xmalloc (1); + buffer->reset ((gdb_byte *) xmalloc (1)); + bufptr = buffer->get (); errcode = 0; } /* bufptr and addr now point immediately beyond the last byte which we consider part of the string (including a '\0' which ends the string). */ - *bytes_read = bufptr - *buffer; + *bytes_read = bufptr - buffer->get (); QUIT; - discard_cleanups (old_chain); - return errcode; } @@ -2363,13 +2359,13 @@ generic_emit_char (int c, struct type *type, struct ui_file *stream, { enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type)); - gdb_byte *buf; + gdb_byte *c_buf; int need_escape = 0; - buf = (gdb_byte *) alloca (TYPE_LENGTH (type)); - pack_long (buf, type, c); + c_buf = (gdb_byte *) alloca (TYPE_LENGTH (type)); + pack_long (c_buf, type, c); - wchar_iterator iter (buf, TYPE_LENGTH (type), encoding, TYPE_LENGTH (type)); + wchar_iterator iter (c_buf, TYPE_LENGTH (type), encoding, TYPE_LENGTH (type)); /* This holds the printable form of the wchar_t data. */ auto_obstack wchar_buf; @@ -2515,7 +2511,7 @@ count_next_character (wchar_iterator *iter, /* Print the characters in CHARS to the OBSTACK. QUOTE_CHAR is the quote character to use with string output. WIDTH is the size of the output - character type. BYTE_ORDER is the the target byte order. OPTIONS + character type. BYTE_ORDER is the target byte order. OPTIONS is the user's print options. */ static void @@ -2575,7 +2571,6 @@ print_converted_chars_to_obstack (struct obstack *obstack, case REPEAT: { int j; - char *s; /* We are outputting a character with a repeat count greater than options->repeat_count_threshold. */ @@ -2598,13 +2593,13 @@ print_converted_chars_to_obstack (struct obstack *obstack, print_wchar (gdb_WEOF, elem->buf, elem->buflen, width, byte_order, obstack, quote_char, &need_escape); obstack_grow_wstr (obstack, LCST ("'")); - s = xstrprintf (_(" "), elem->repeat_count); + std::string s = string_printf (_(" "), + elem->repeat_count); for (j = 0; s[j]; ++j) { gdb_wchar_t w = gdb_btowc (s[j]); obstack_grow (obstack, &w, sizeof (gdb_wchar_t)); } - xfree (s); } break; @@ -2793,8 +2788,7 @@ val_print_string (struct type *elttype, const char *encoding, int found_nul; /* Non-zero if we found the nul char. */ unsigned int fetchlimit; /* Maximum number of chars to print. */ int bytes_read; - gdb_byte *buffer = NULL; /* Dynamically growable fetch buffer. */ - struct cleanup *old_chain = NULL; /* Top of the old cleanup chain. */ + gdb::unique_xmalloc_ptr buffer; /* Dynamically growable fetch buffer. */ struct gdbarch *gdbarch = get_type_arch (elttype); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); int width = TYPE_LENGTH (elttype); @@ -2812,7 +2806,6 @@ val_print_string (struct type *elttype, const char *encoding, err = read_string (addr, len, width, fetchlimit, byte_order, &buffer, &bytes_read); - old_chain = make_cleanup (xfree, buffer); addr += bytes_read; @@ -2823,8 +2816,8 @@ val_print_string (struct type *elttype, const char *encoding, /* Determine found_nul by looking at the last character read. */ found_nul = 0; if (bytes_read >= width) - found_nul = extract_unsigned_integer (buffer + bytes_read - width, width, - byte_order) == 0; + found_nul = extract_unsigned_integer (buffer.get () + bytes_read - width, + width, byte_order) == 0; if (len == -1 && !found_nul) { gdb_byte *peekbuf; @@ -2852,7 +2845,7 @@ val_print_string (struct type *elttype, const char *encoding, and then the error message. */ if (err == 0 || bytes_read > 0) { - LA_PRINT_STRING (stream, elttype, buffer, bytes_read / width, + LA_PRINT_STRING (stream, elttype, buffer.get (), bytes_read / width, encoding, force_ellipsis, options); } @@ -2865,9 +2858,6 @@ val_print_string (struct type *elttype, const char *encoding, fprintf_filtered (stream, ">"); } - gdb_flush (stream); - do_cleanups (old_chain); - return (bytes_read / width); }