diff options
author | Simon Marchi <simon.marchi@ericsson.com> | 2018-04-07 13:19:12 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2018-04-07 13:19:12 -0400 |
commit | 9018be22e022e6db2ba07c4e407c7244022bc69a (patch) | |
tree | 67481122825082aeabe06a4ed0f9e77f1a8c4d91 /gdb/auxv.c | |
parent | 43193fe9fc39138c912095ba6f21c4302abafe5e (diff) | |
download | gdb-9018be22e022e6db2ba07c4e407c7244022bc69a.zip gdb-9018be22e022e6db2ba07c4e407c7244022bc69a.tar.gz gdb-9018be22e022e6db2ba07c4e407c7244022bc69a.tar.bz2 |
Make target_read_alloc & al return vectors
This patch started by changing target_read_alloc_1 to return a
byte_vector, to avoid manual memory management (in target_read_alloc_1
and in the callers). To communicate failures to the callers, it
actually returns a gdb::optional<gdb::byte_vector>.
Adjusting target_read_stralloc was a bit more tricky, since it wants to
return a buffer of char, and not gdb_byte. Since you can't just cast a
gdb::byte_vector into a gdb::def_vector<char>, I made
target_read_alloc_1 templated, so both versions (that return vectors of
gdb_byte and char) are generated. Since target_read_stralloc now
returns a gdb::char_vector instead of a gdb::unique_xmalloc_ptr<char>, a
few callers need to be adjusted.
gdb/ChangeLog:
* common/byte-vector.h (char_vector): New type.
* target.h (target_read_alloc): Return
gdb::optional<byte_vector>.
(target_read_stralloc): Return gdb::optional<char_vector>.
(target_get_osdata): Return gdb::optional<char_vector>.
* target.c (target_read_alloc_1): Templatize. Replacement
manual memory management with vector.
(target_read_alloc): Change return type, adjust.
(target_read_stralloc): Change return type, adjust.
(target_get_osdata): Change return type, adjust.
* auxv.c (struct auxv_info) <length>: Remove.
<data>: Change type to gdb::optional<byte_vector>.
(auxv_inferior_data_cleanup): Free auxv_info with delete.
(get_auxv_inferior_data): Allocate auxv_info with new, adjust.
(target_auxv_search): Adjust.
(fprint_target_auxv): Adjust.
* avr-tdep.c (avr_io_reg_read_command): Adjust.
* linux-tdep.c (linux_spu_make_corefile_notes): Adjust.
(linux_make_corefile_notes): Adjust.
* osdata.c (get_osdata): Adjust.
* remote.c (remote_get_threads_with_qxfer): Adjust.
(remote_memory_map): Adjust.
(remote_traceframe_info): Adjust.
(btrace_read_config): Adjust.
(remote_read_btrace): Adjust.
(remote_pid_to_exec_file): Adjust.
* solib-aix.c (solib_aix_get_library_list): Adjust.
* solib-dsbt.c (decode_loadmap): Don't free buf.
(dsbt_get_initial_loadmaps): Adjust.
* solib-svr4.c (svr4_current_sos_via_xfer_libraries): Adjust.
* solib-target.c (solib_target_current_sos): Adjust.
* tracepoint.c (sdata_make_value): Adjust.
* xml-support.c (xinclude_start_include): Adjust.
(xml_fetch_content_from_file): Adjust.
* xml-support.h (xml_fetch_another): Change return type.
(xml_fetch_content_from_file): Change return type.
* xml-syscall.c (xml_init_syscalls_info): Adjust.
* xml-tdesc.c (file_read_description_xml): Adjust.
(fetch_available_features_from_target): Change return type.
(target_fetch_description_xml): Adjust.
(target_read_description_xml): Adjust.
Diffstat (limited to 'gdb/auxv.c')
-rw-r--r-- | gdb/auxv.c | 44 |
1 files changed, 18 insertions, 26 deletions
@@ -304,8 +304,7 @@ static const struct inferior_data *auxv_inferior_data; overhead of transfering data from a remote target to the local host. */ struct auxv_info { - LONGEST length; - gdb_byte *data; + gdb::optional<gdb::byte_vector> data; }; /* Handles the cleanup of the auxv cache for inferior INF. ARG is ignored. @@ -323,8 +322,7 @@ auxv_inferior_data_cleanup (struct inferior *inf, void *arg) info = (struct auxv_info *) inferior_data (inf, auxv_inferior_data); if (info != NULL) { - xfree (info->data); - xfree (info); + delete info; set_inferior_data (inf, auxv_inferior_data, NULL); } } @@ -358,9 +356,8 @@ get_auxv_inferior_data (struct target_ops *ops) info = (struct auxv_info *) inferior_data (inf, auxv_inferior_data); if (info == NULL) { - info = XCNEW (struct auxv_info); - info->length = target_read_alloc (ops, TARGET_OBJECT_AUXV, - NULL, &info->data); + info = new auxv_info; + info->data = target_read_alloc (ops, TARGET_OBJECT_AUXV, NULL); set_inferior_data (inf, auxv_inferior_data, info); } @@ -375,20 +372,17 @@ int target_auxv_search (struct target_ops *ops, CORE_ADDR match, CORE_ADDR *valp) { CORE_ADDR type, val; - gdb_byte *data; - gdb_byte *ptr; - struct auxv_info *info; - - info = get_auxv_inferior_data (ops); + auxv_info *info = get_auxv_inferior_data (ops); - data = info->data; - ptr = data; + if (!info->data) + return -1; - if (info->length <= 0) - return info->length; + gdb_byte *data = info->data->data (); + gdb_byte *ptr = data; + size_t len = info->data->size (); while (1) - switch (target_auxv_parse (ops, &ptr, data + info->length, &type, &val)) + switch (target_auxv_parse (ops, &ptr, data + len, &type, &val)) { case 1: /* Here's an entry, check it. */ if (type == match) @@ -528,19 +522,17 @@ fprint_target_auxv (struct ui_file *file, struct target_ops *ops) { struct gdbarch *gdbarch = target_gdbarch (); CORE_ADDR type, val; - gdb_byte *data; - gdb_byte *ptr; - struct auxv_info *info; int ents = 0; + auxv_info *info = get_auxv_inferior_data (ops); - info = get_auxv_inferior_data (ops); + if (!info->data) + return -1; - data = info->data; - ptr = data; - if (info->length <= 0) - return info->length; + gdb_byte *data = info->data->data (); + gdb_byte *ptr = data; + size_t len = info->data->size (); - while (target_auxv_parse (ops, &ptr, data + info->length, &type, &val) > 0) + while (target_auxv_parse (ops, &ptr, data + len, &type, &val) > 0) { gdbarch_print_auxv_entry (gdbarch, file, type, val); ++ents; |