forked from Imagelibrary/binutils-gdb
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.
This commit is contained in:
committed by
Simon Marchi
parent
43193fe9fc
commit
9018be22e0
@@ -1420,47 +1420,41 @@ linux_spu_make_corefile_notes (bfd *obfd, char *note_data, int *note_size)
|
||||
};
|
||||
|
||||
enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
||||
gdb_byte *spu_ids;
|
||||
LONGEST i, j, size;
|
||||
|
||||
/* Determine list of SPU ids. */
|
||||
size = target_read_alloc (¤t_target, TARGET_OBJECT_SPU,
|
||||
NULL, &spu_ids);
|
||||
gdb::optional<gdb::byte_vector>
|
||||
spu_ids = target_read_alloc (¤t_target, TARGET_OBJECT_SPU, NULL);
|
||||
|
||||
if (!spu_ids)
|
||||
return nullptr;
|
||||
|
||||
/* Generate corefile notes for each SPU file. */
|
||||
for (i = 0; i < size; i += 4)
|
||||
for (size_t i = 0; i < spu_ids->size (); i += 4)
|
||||
{
|
||||
int fd = extract_unsigned_integer (spu_ids + i, 4, byte_order);
|
||||
int fd = extract_unsigned_integer (spu_ids->data () + i, 4, byte_order);
|
||||
|
||||
for (j = 0; j < sizeof (spu_files) / sizeof (spu_files[0]); j++)
|
||||
for (size_t j = 0; j < sizeof (spu_files) / sizeof (spu_files[0]); j++)
|
||||
{
|
||||
char annex[32], note_name[32];
|
||||
gdb_byte *spu_data;
|
||||
LONGEST spu_len;
|
||||
|
||||
xsnprintf (annex, sizeof annex, "%d/%s", fd, spu_files[j]);
|
||||
spu_len = target_read_alloc (¤t_target, TARGET_OBJECT_SPU,
|
||||
annex, &spu_data);
|
||||
if (spu_len > 0)
|
||||
gdb::optional<gdb::byte_vector> spu_data
|
||||
= target_read_alloc (¤t_target, TARGET_OBJECT_SPU, annex);
|
||||
|
||||
if (spu_data && !spu_data->empty ())
|
||||
{
|
||||
xsnprintf (note_name, sizeof note_name, "SPU/%s", annex);
|
||||
note_data = elfcore_write_note (obfd, note_data, note_size,
|
||||
note_name, NT_SPU,
|
||||
spu_data, spu_len);
|
||||
xfree (spu_data);
|
||||
spu_data->data (),
|
||||
spu_data->size ());
|
||||
|
||||
if (!note_data)
|
||||
{
|
||||
xfree (spu_ids);
|
||||
return NULL;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (size > 0)
|
||||
xfree (spu_ids);
|
||||
|
||||
return note_data;
|
||||
}
|
||||
|
||||
@@ -1911,8 +1905,6 @@ linux_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
|
||||
struct linux_corefile_thread_data thread_args;
|
||||
struct elf_internal_linux_prpsinfo prpsinfo;
|
||||
char *note_data = NULL;
|
||||
gdb_byte *auxv;
|
||||
int auxv_len;
|
||||
struct thread_info *curr_thr, *signalled_thr, *thr;
|
||||
|
||||
if (! gdbarch_iterate_over_regset_sections_p (gdbarch))
|
||||
@@ -1977,13 +1969,13 @@ linux_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
|
||||
return NULL;
|
||||
|
||||
/* Auxillary vector. */
|
||||
auxv_len = target_read_alloc (¤t_target, TARGET_OBJECT_AUXV,
|
||||
NULL, &auxv);
|
||||
if (auxv_len > 0)
|
||||
gdb::optional<gdb::byte_vector> auxv =
|
||||
target_read_alloc (¤t_target, TARGET_OBJECT_AUXV, NULL);
|
||||
if (auxv && !auxv->empty ())
|
||||
{
|
||||
note_data = elfcore_write_note (obfd, note_data, note_size,
|
||||
"CORE", NT_AUXV, auxv, auxv_len);
|
||||
xfree (auxv);
|
||||
"CORE", NT_AUXV, auxv->data (),
|
||||
auxv->size ());
|
||||
|
||||
if (!note_data)
|
||||
return NULL;
|
||||
|
||||
Reference in New Issue
Block a user