* [RFA 0/2] more cleanup removal
@ 2018-03-28 4:24 Tom Tromey
2018-03-28 4:24 ` [RFA 1/2] Change target_read_string to use unique_xmalloc_ptr Tom Tromey
2018-03-28 4:24 ` [RFA 2/2] Remove some clanups from solib-svr4.c Tom Tromey
0 siblings, 2 replies; 8+ messages in thread
From: Tom Tromey @ 2018-03-28 4:24 UTC (permalink / raw)
To: gdb-patches
This removes some more cleanups -- first converting target_read_string
to use unique_xmalloc_ptr, and then removing further cleanups from
solib-svr4.c. The second patch depends on the first in order to fully
remove all cleanups from one function.
Regression tested by the buildbot.
Tom
^ permalink raw reply [flat|nested] 8+ messages in thread
* [RFA 2/2] Remove some clanups from solib-svr4.c
2018-03-28 4:24 [RFA 0/2] more cleanup removal Tom Tromey
2018-03-28 4:24 ` [RFA 1/2] Change target_read_string to use unique_xmalloc_ptr Tom Tromey
@ 2018-03-28 4:24 ` Tom Tromey
2018-03-30 5:47 ` Simon Marchi
1 sibling, 1 reply; 8+ messages in thread
From: Tom Tromey @ 2018-03-28 4:24 UTC (permalink / raw)
To: gdb-patches; +Cc: Tom Tromey
This removes a few cleanups from solib-svr4.c in a straightforward
way.
gdb/ChangeLog
2018-03-26 Tom Tromey <tom@tromey.com>
* solib-svr4.c (lm_info_read): Use gdb::byte_vector.
(svr4_keep_data_in_core): Use gdb::unique_xmalloc_ptr.
---
gdb/ChangeLog | 5 +++++
gdb/solib-svr4.c | 47 ++++++++++-------------------------------------
2 files changed, 15 insertions(+), 37 deletions(-)
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index d8d047d394..c2170891e5 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -172,14 +172,11 @@ static lm_info_svr4 *
lm_info_read (CORE_ADDR lm_addr)
{
struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
- gdb_byte *lm;
lm_info_svr4 *lm_info;
- struct cleanup *back_to;
- lm = (gdb_byte *) xmalloc (lmo->link_map_size);
- back_to = make_cleanup (xfree, lm);
+ gdb::byte_vector lm (lmo->link_map_size);
- if (target_read_memory (lm_addr, lm, lmo->link_map_size) != 0)
+ if (target_read_memory (lm_addr, lm.data (), lmo->link_map_size) != 0)
{
warning (_("Error reading shared library list entry at %s"),
paddress (target_gdbarch (), lm_addr)),
@@ -203,8 +200,6 @@ lm_info_read (CORE_ADDR lm_addr)
ptr_type);
}
- do_cleanups (back_to);
-
return lm_info;
}
@@ -958,8 +953,6 @@ svr4_keep_data_in_core (CORE_ADDR vaddr, unsigned long size)
{
struct svr4_info *info;
CORE_ADDR ldsomap;
- struct so_list *newobj;
- struct cleanup *old_chain;
CORE_ADDR name_lm;
info = get_svr4_info ();
@@ -973,13 +966,8 @@ svr4_keep_data_in_core (CORE_ADDR vaddr, unsigned long size)
if (!ldsomap)
return 0;
- newobj = XCNEW (struct so_list);
- old_chain = make_cleanup (xfree, newobj);
- lm_info_svr4 *li = lm_info_read (ldsomap);
- newobj->lm_info = li;
- make_cleanup (xfree, newobj->lm_info);
+ gdb::unique_xmalloc_ptr<lm_info_svr4> li (lm_info_read (ldsomap));
name_lm = li != NULL ? li->l_name : 0;
- do_cleanups (old_chain);
return (name_lm >= vaddr && name_lm < vaddr + size);
}
@@ -995,8 +983,7 @@ open_symbol_file_object (int from_tty)
struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
int l_name_size = TYPE_LENGTH (ptr_type);
- gdb_byte *l_name_buf = (gdb_byte *) xmalloc (l_name_size);
- struct cleanup *cleanups = make_cleanup (xfree, l_name_buf);
+ gdb::byte_vector l_name_buf (l_name_size);
struct svr4_info *info = get_svr4_info ();
symfile_add_flags add_flags = 0;
@@ -1005,38 +992,26 @@ open_symbol_file_object (int from_tty)
if (symfile_objfile)
if (!query (_("Attempt to reload symbols from process? ")))
- {
- do_cleanups (cleanups);
- return 0;
- }
+ return 0;
/* Always locate the debug struct, in case it has moved. */
info->debug_base = 0;
if (locate_base (info) == 0)
- {
- do_cleanups (cleanups);
- return 0; /* failed somehow... */
- }
+ return 0; /* failed somehow... */
/* First link map member should be the executable. */
lm = solib_svr4_r_map (info);
if (lm == 0)
- {
- do_cleanups (cleanups);
- return 0; /* failed somehow... */
- }
+ return 0; /* failed somehow... */
/* Read address of name from target memory to GDB. */
- read_memory (lm + lmo->l_name_offset, l_name_buf, l_name_size);
+ read_memory (lm + lmo->l_name_offset, l_name_buf.data (), l_name_size);
/* Convert the address to host format. */
- l_name = extract_typed_address (l_name_buf, ptr_type);
+ l_name = extract_typed_address (l_name_buf.data (), ptr_type);
if (l_name == 0)
- {
- do_cleanups (cleanups);
- return 0; /* No filename. */
- }
+ return 0; /* No filename. */
/* Now fetch the filename from target memory. */
target_read_string (l_name, &filename, SO_NAME_MAX_PATH_SIZE - 1, &errcode);
@@ -1045,14 +1020,12 @@ open_symbol_file_object (int from_tty)
{
warning (_("failed to read exec filename from attached file: %s"),
safe_strerror (errcode));
- do_cleanups (cleanups);
return 0;
}
/* Have a pathname: read the symbol file. */
symbol_file_add_main (filename.get (), add_flags);
- do_cleanups (cleanups);
return 1;
}
--
2.13.6
^ permalink raw reply [flat|nested] 8+ messages in thread
* [RFA 1/2] Change target_read_string to use unique_xmalloc_ptr
2018-03-28 4:24 [RFA 0/2] more cleanup removal Tom Tromey
@ 2018-03-28 4:24 ` Tom Tromey
2018-03-30 5:28 ` Simon Marchi
2018-03-28 4:24 ` [RFA 2/2] Remove some clanups from solib-svr4.c Tom Tromey
1 sibling, 1 reply; 8+ messages in thread
From: Tom Tromey @ 2018-03-28 4:24 UTC (permalink / raw)
To: gdb-patches; +Cc: Tom Tromey
This changes the out parameter of target_read_string to be a
unique_xmalloc_ptr. This avoids a cleanup and sets the stage for more
cleanup removals.
This patch also removes a seemingly needless alloca from
print_subexp_standard.
gdb/ChangeLog
2018-03-27 Tom Tromey <tom@tromey.com>
* windows-nat.c (handle_output_debug_string, handle_exception):
Update.
* target.h (target_read_string): Update.
* target.c (target_read_string): Change "string" to
unique_xmalloc_ptr.
* solib-svr4.c (open_symbol_file_object, svr4_read_so_list):
Update.
* solib-frv.c (frv_current_sos): Update.
* solib-dsbt.c (dsbt_current_sos): Update.
* solib-darwin.c (darwin_current_sos): Update.
* linux-thread-db.c (inferior_has_bug): Update.
* expprint.c (print_subexp_standard) <case OP_OBJC_MSGCALL>:
Update. Remove alloca.
* ada-lang.c (ada_main_name): Update.
---
gdb/ChangeLog | 17 +++++++++++++++++
gdb/ada-lang.c | 5 ++---
gdb/expprint.c | 9 +++------
gdb/linux-thread-db.c | 7 +++----
gdb/solib-darwin.c | 5 ++---
gdb/solib-dsbt.c | 7 +++----
gdb/solib-frv.c | 8 ++++----
gdb/solib-svr4.c | 10 ++++------
gdb/target.c | 5 +++--
gdb/target.h | 3 ++-
gdb/windows-nat.c | 28 ++++++++++++----------------
11 files changed, 55 insertions(+), 49 deletions(-)
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 505d059244..11939d7798 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -913,7 +913,7 @@ char *
ada_main_name (void)
{
struct bound_minimal_symbol msym;
- static char *main_program_name = NULL;
+ static gdb::unique_xmalloc_ptr<char> main_program_name;
/* For Ada, the name of the main procedure is stored in a specific
string constant, generated by the binder. Look for that symbol,
@@ -931,13 +931,12 @@ ada_main_name (void)
if (main_program_name_addr == 0)
error (_("Invalid address for Ada main program name."));
- xfree (main_program_name);
target_read_string (main_program_name_addr, &main_program_name,
1024, &err_code);
if (err_code != 0)
return NULL;
- return main_program_name;
+ return main_program_name.get ();
}
/* The main procedure doesn't seem to be in Ada. */
diff --git a/gdb/expprint.c b/gdb/expprint.c
index 9d1884f290..c906904599 100644
--- a/gdb/expprint.c
+++ b/gdb/expprint.c
@@ -240,7 +240,7 @@ print_subexp_standard (struct expression *exp, int *pos,
case OP_OBJC_MSGCALL:
{ /* Objective C message (method) call. */
- char *selector;
+ gdb::unique_xmalloc_ptr<char> selector;
(*pos) += 3;
nargs = longest_to_int (exp->elts[pc + 2].longconst);
@@ -256,8 +256,7 @@ print_subexp_standard (struct expression *exp, int *pos,
{
char *s, *nextS;
- s = (char *) alloca (strlen (selector) + 1);
- strcpy (s, selector);
+ s = selector.get ();
for (tem = 0; tem < nargs; tem++)
{
nextS = strchr (s, ':');
@@ -270,11 +269,9 @@ print_subexp_standard (struct expression *exp, int *pos,
}
else
{
- fprintf_unfiltered (stream, " %s", selector);
+ fprintf_unfiltered (stream, " %s", selector.get ());
}
fprintf_unfiltered (stream, "]");
- /* "selector" was malloc'd by target_read_string. Free it. */
- xfree (selector);
return;
}
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
index cfedd98bd8..08e3cfbc8b 100644
--- a/gdb/linux-thread-db.c
+++ b/gdb/linux-thread-db.c
@@ -413,7 +413,7 @@ inferior_has_bug (const char *ver_symbol, int ver_major_min, int ver_minor_min)
{
struct bound_minimal_symbol version_msym;
CORE_ADDR version_addr;
- char *version;
+ gdb::unique_xmalloc_ptr<char> version;
int err, got, retval = 0;
version_msym = lookup_minimal_symbol (ver_symbol, NULL, NULL);
@@ -422,15 +422,14 @@ inferior_has_bug (const char *ver_symbol, int ver_major_min, int ver_minor_min)
version_addr = BMSYMBOL_VALUE_ADDRESS (version_msym);
got = target_read_string (version_addr, &version, 32, &err);
- if (err == 0 && memchr (version, 0, got) == &version[got -1])
+ if (err == 0 && memchr (version.get (), 0, got) == version.get () + got - 1)
{
int major, minor;
- retval = (sscanf (version, "%d.%d", &major, &minor) == 2
+ retval = (sscanf (version.get (), "%d.%d", &major, &minor) == 2
&& (major < ver_major_min
|| (major == ver_major_min && minor < ver_minor_min)));
}
- xfree (version);
return retval;
}
diff --git a/gdb/solib-darwin.c b/gdb/solib-darwin.c
index cf15148c36..d66938fb90 100644
--- a/gdb/solib-darwin.c
+++ b/gdb/solib-darwin.c
@@ -261,7 +261,7 @@ darwin_current_sos (void)
CORE_ADDR path_addr;
struct mach_o_header_external hdr;
unsigned long hdr_val;
- char *file_path;
+ gdb::unique_xmalloc_ptr<char> file_path;
int errcode;
struct so_list *newobj;
struct cleanup *old_chain;
@@ -299,10 +299,9 @@ darwin_current_sos (void)
lm_info_darwin *li = new lm_info_darwin;
newobj->lm_info = li;
- strncpy (newobj->so_name, file_path, SO_NAME_MAX_PATH_SIZE - 1);
+ strncpy (newobj->so_name, file_path.get (), SO_NAME_MAX_PATH_SIZE - 1);
newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
strcpy (newobj->so_original_name, newobj->so_name);
- xfree (file_path);
li->lm_addr = load_addr;
if (head == NULL)
diff --git a/gdb/solib-dsbt.c b/gdb/solib-dsbt.c
index d038cccb2f..b3b66baffc 100644
--- a/gdb/solib-dsbt.c
+++ b/gdb/solib-dsbt.c
@@ -696,7 +696,7 @@ dsbt_current_sos (void)
if (dsbt_index != 0)
{
int errcode;
- char *name_buf;
+ gdb::unique_xmalloc_ptr<char> name_buf;
struct int_elf32_dsbt_loadmap *loadmap;
struct so_list *sop;
CORE_ADDR addr;
@@ -727,11 +727,10 @@ dsbt_current_sos (void)
{
if (solib_dsbt_debug)
fprintf_unfiltered (gdb_stdlog, "current_sos: name = %s\n",
- name_buf);
+ name_buf.get ());
- strncpy (sop->so_name, name_buf, SO_NAME_MAX_PATH_SIZE - 1);
+ strncpy (sop->so_name, name_buf.get (), SO_NAME_MAX_PATH_SIZE - 1);
sop->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
- xfree (name_buf);
strcpy (sop->so_original_name, sop->so_name);
}
diff --git a/gdb/solib-frv.c b/gdb/solib-frv.c
index 7929efd786..e772da6115 100644
--- a/gdb/solib-frv.c
+++ b/gdb/solib-frv.c
@@ -377,7 +377,7 @@ frv_current_sos (void)
if (got_addr != mgot)
{
int errcode;
- char *name_buf;
+ gdb::unique_xmalloc_ptr<char> name_buf;
struct int_elf32_fdpic_loadmap *loadmap;
struct so_list *sop;
CORE_ADDR addr;
@@ -409,16 +409,16 @@ frv_current_sos (void)
if (solib_frv_debug)
fprintf_unfiltered (gdb_stdlog, "current_sos: name = %s\n",
- name_buf);
+ name_buf.get ());
if (errcode != 0)
warning (_("Can't read pathname for link map entry: %s."),
safe_strerror (errcode));
else
{
- strncpy (sop->so_name, name_buf, SO_NAME_MAX_PATH_SIZE - 1);
+ strncpy (sop->so_name, name_buf.get (),
+ SO_NAME_MAX_PATH_SIZE - 1);
sop->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
- xfree (name_buf);
strcpy (sop->so_original_name, sop->so_name);
}
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 29e74daa51..d8d047d394 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -990,7 +990,7 @@ static int
open_symbol_file_object (int from_tty)
{
CORE_ADDR lm, l_name;
- char *filename;
+ gdb::unique_xmalloc_ptr<char> filename;
int errcode;
struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
@@ -1040,7 +1040,6 @@ open_symbol_file_object (int from_tty)
/* Now fetch the filename from target memory. */
target_read_string (l_name, &filename, SO_NAME_MAX_PATH_SIZE - 1, &errcode);
- make_cleanup (xfree, filename);
if (errcode)
{
@@ -1051,7 +1050,7 @@ open_symbol_file_object (int from_tty)
}
/* Have a pathname: read the symbol file. */
- symbol_file_add_main (filename, add_flags);
+ symbol_file_add_main (filename.get (), add_flags);
do_cleanups (cleanups);
return 1;
@@ -1339,7 +1338,7 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
for (; lm != 0; prev_lm = lm, lm = next_lm)
{
int errcode;
- char *buffer;
+ gdb::unique_xmalloc_ptr<char> buffer;
so_list_up newobj (XCNEW (struct so_list));
@@ -1387,10 +1386,9 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
continue;
}
- strncpy (newobj->so_name, buffer, SO_NAME_MAX_PATH_SIZE - 1);
+ strncpy (newobj->so_name, buffer.get (), SO_NAME_MAX_PATH_SIZE - 1);
newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
strcpy (newobj->so_original_name, newobj->so_name);
- xfree (buffer);
/* If this entry has no name, or its name matches the name
for the main executable, don't include it in the list. */
diff --git a/gdb/target.c b/gdb/target.c
index 84f5228919..b9b2e757dd 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -993,7 +993,8 @@ target_xfer_status_to_string (enum target_xfer_status status)
read. */
int
-target_read_string (CORE_ADDR memaddr, char **string, int len, int *errnop)
+target_read_string (CORE_ADDR memaddr, gdb::unique_xmalloc_ptr<char> *string,
+ int len, int *errnop)
{
int tlen, offset, i;
gdb_byte buf[4];
@@ -1053,7 +1054,7 @@ target_read_string (CORE_ADDR memaddr, char **string, int len, int *errnop)
nbytes_read += tlen;
}
done:
- *string = buffer;
+ string->reset (buffer);
if (errnop != NULL)
*errnop = errcode;
return nbytes_read;
diff --git a/gdb/target.h b/gdb/target.h
index bfe9b826b2..51ac884e01 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -1430,7 +1430,8 @@ int target_supports_disable_randomization (void);
#define target_can_run_breakpoint_commands() \
(*current_target.to_can_run_breakpoint_commands) (¤t_target)
-extern int target_read_string (CORE_ADDR, char **, int, int *);
+extern int target_read_string (CORE_ADDR, gdb::unique_xmalloc_ptr<char> *,
+ int, int *);
/* For target_read_memory see target/target.h. */
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index 430cc60993..95e3c5816b 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -883,25 +883,25 @@ signal_event_command (const char *args, int from_tty)
static int
handle_output_debug_string (struct target_waitstatus *ourstatus)
{
- char *s = NULL;
+ gdb::unique_xmalloc_ptr<char> s;
int retval = 0;
if (!target_read_string
((CORE_ADDR) (uintptr_t) current_event.u.DebugString.lpDebugStringData,
- &s, 1024, 0)
- || !s || !*s)
+ &s, 1024, 0)
+ || !s || !*(s.get ()))
/* nothing to do */;
- else if (!startswith (s, _CYGWIN_SIGNAL_STRING))
+ else if (!startswith (s.get (), _CYGWIN_SIGNAL_STRING))
{
#ifdef __CYGWIN__
- if (!startswith (s, "cYg"))
+ if (!startswith (s.get (), "cYg"))
#endif
{
- char *p = strchr (s, '\0');
+ char *p = strchr (s.get (), '\0');
- if (p > s && *--p == '\n')
+ if (p > s.get () && *--p == '\n')
*p = '\0';
- warning (("%s"), s);
+ warning (("%s"), s.get ());
}
}
#ifdef __CYGWIN__
@@ -915,7 +915,7 @@ handle_output_debug_string (struct target_waitstatus *ourstatus)
to be stored at the given address in the inferior. Tell gdb
to treat this like a real signal. */
char *p;
- int sig = strtol (s + sizeof (_CYGWIN_SIGNAL_STRING) - 1, &p, 0);
+ int sig = strtol (s.get () + sizeof (_CYGWIN_SIGNAL_STRING) - 1, &p, 0);
gdb_signal gotasig = gdb_signal_from_host (sig);
ourstatus->value.sig = gotasig;
@@ -938,8 +938,6 @@ handle_output_debug_string (struct target_waitstatus *ourstatus)
}
#endif
- if (s)
- xfree (s);
return retval;
}
@@ -1193,18 +1191,16 @@ handle_exception (struct target_waitstatus *ourstatus)
if (named_thread != NULL)
{
int thread_name_len;
- char *thread_name;
+ gdb::unique_xmalloc_ptr<char> thread_name;
thread_name_len = target_read_string (thread_name_target,
&thread_name, 1025, NULL);
if (thread_name_len > 0)
{
- thread_name[thread_name_len - 1] = '\0';
+ thread_name.get ()[thread_name_len - 1] = '\0';
xfree (named_thread->name);
- named_thread->name = thread_name;
+ named_thread->name = thread_name.release ();
}
- else
- xfree (thread_name);
}
ourstatus->value.sig = GDB_SIGNAL_TRAP;
result = HANDLE_EXCEPTION_IGNORED;
--
2.13.6
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA 1/2] Change target_read_string to use unique_xmalloc_ptr
2018-03-28 4:24 ` [RFA 1/2] Change target_read_string to use unique_xmalloc_ptr Tom Tromey
@ 2018-03-30 5:28 ` Simon Marchi
0 siblings, 0 replies; 8+ messages in thread
From: Simon Marchi @ 2018-03-30 5:28 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
On 2018-03-28 00:24, Tom Tromey wrote:
> This changes the out parameter of target_read_string to be a
> unique_xmalloc_ptr. This avoids a cleanup and sets the stage for more
> cleanup removals.
>
> This patch also removes a seemingly needless alloca from
> print_subexp_standard.
That looks fine to me.
Simon
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA 2/2] Remove some clanups from solib-svr4.c
2018-03-28 4:24 ` [RFA 2/2] Remove some clanups from solib-svr4.c Tom Tromey
@ 2018-03-30 5:47 ` Simon Marchi
2018-03-30 19:04 ` Tom Tromey
0 siblings, 1 reply; 8+ messages in thread
From: Simon Marchi @ 2018-03-30 5:47 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
"clanups" in the title.
On 2018-03-28 00:24, Tom Tromey wrote:
> This removes a few cleanups from solib-svr4.c in a straightforward
> way.
>
> gdb/ChangeLog
> 2018-03-26 Tom Tromey <tom@tromey.com>
>
> * solib-svr4.c (lm_info_read): Use gdb::byte_vector.
> (svr4_keep_data_in_core): Use gdb::unique_xmalloc_ptr.
> ---
> gdb/ChangeLog | 5 +++++
> gdb/solib-svr4.c | 47 ++++++++++-------------------------------------
> 2 files changed, 15 insertions(+), 37 deletions(-)
>
> diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
> index d8d047d394..c2170891e5 100644
> --- a/gdb/solib-svr4.c
> +++ b/gdb/solib-svr4.c
> @@ -172,14 +172,11 @@ static lm_info_svr4 *
> lm_info_read (CORE_ADDR lm_addr)
> {
> struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
> - gdb_byte *lm;
> lm_info_svr4 *lm_info;
> - struct cleanup *back_to;
>
> - lm = (gdb_byte *) xmalloc (lmo->link_map_size);
> - back_to = make_cleanup (xfree, lm);
> + gdb::byte_vector lm (lmo->link_map_size);
>
> - if (target_read_memory (lm_addr, lm, lmo->link_map_size) != 0)
> + if (target_read_memory (lm_addr, lm.data (), lmo->link_map_size) !=
> 0)
> {
> warning (_("Error reading shared library list entry at %s"),
> paddress (target_gdbarch (), lm_addr)),
> @@ -203,8 +200,6 @@ lm_info_read (CORE_ADDR lm_addr)
> ptr_type);
> }
>
> - do_cleanups (back_to);
> -
> return lm_info;
> }
>
> @@ -958,8 +953,6 @@ svr4_keep_data_in_core (CORE_ADDR vaddr, unsigned
> long size)
> {
> struct svr4_info *info;
> CORE_ADDR ldsomap;
> - struct so_list *newobj;
> - struct cleanup *old_chain;
> CORE_ADDR name_lm;
>
> info = get_svr4_info ();
> @@ -973,13 +966,8 @@ svr4_keep_data_in_core (CORE_ADDR vaddr, unsigned
> long size)
> if (!ldsomap)
> return 0;
>
> - newobj = XCNEW (struct so_list);
> - old_chain = make_cleanup (xfree, newobj);
> - lm_info_svr4 *li = lm_info_read (ldsomap);
> - newobj->lm_info = li;
> - make_cleanup (xfree, newobj->lm_info);
> + gdb::unique_xmalloc_ptr<lm_info_svr4> li (lm_info_read (ldsomap));
This is not an error because lm_info_svr4 is trivially destructible, but
since we allocate it with "new", we might as well use a unique_ptr, it's
more future-proof. At least, with the xfree poisoning, adding something
that does not destruct trivially to lm_info_svr4 would warn us not to
use unique_xmalloc_ptr here.
How about making lm_info_read return an std::unique_ptr<lm_info_svr4>?
The patch LGTM with or without those changes.
Simon
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA 2/2] Remove some clanups from solib-svr4.c
2018-03-30 5:47 ` Simon Marchi
@ 2018-03-30 19:04 ` Tom Tromey
2018-03-30 19:12 ` Simon Marchi
0 siblings, 1 reply; 8+ messages in thread
From: Tom Tromey @ 2018-03-30 19:04 UTC (permalink / raw)
To: Simon Marchi; +Cc: Tom Tromey, gdb-patches
>> - newobj = XCNEW (struct so_list);
>> - old_chain = make_cleanup (xfree, newobj);
>> - lm_info_svr4 *li = lm_info_read (ldsomap);
>> - newobj->lm_info = li;
>> - make_cleanup (xfree, newobj->lm_info);
>> + gdb::unique_xmalloc_ptr<lm_info_svr4> li (lm_info_read (ldsomap));
Simon> This is not an error because lm_info_svr4 is trivially destructible,
Simon> but since we allocate it with "new", we might as well use a
Simon> unique_ptr, it's more future-proof.
Good catch, thanks.
Simon> How about making lm_info_read return an std::unique_ptr<lm_info_svr4>?
Simon> The patch LGTM with or without those changes.
How's this?
I re-ran it through the buildbot.
Tom
commit 0662ad7b81c11c4b23e74c1d2fcf847ca63e3a8d
Author: Tom Tromey <tom@tromey.com>
Date: Tue Mar 27 14:42:55 2018 -0600
Remove some cleanups from solib-svr4.c
This removes a few cleanups from solib-svr4.c in a straightforward
way.
gdb/ChangeLog
2018-03-30 Tom Tromey <tom@tromey.com>
* solib-svr4.c (lm_info_read): Use gdb::byte_vector. Return
std::unique_ptr.
(svr4_keep_data_in_core): Update.
(svr4_read_so_list): Update.
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d2fe40d0a7..7add93ed63 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2018-03-30 Tom Tromey <tom@tromey.com>
+
+ * solib-svr4.c (lm_info_read): Use gdb::byte_vector. Return
+ std::unique_ptr.
+ (svr4_keep_data_in_core): Update.
+ (svr4_read_so_list): Update.
+
2018-03-27 Tom Tromey <tom@tromey.com>
* windows-nat.c (handle_output_debug_string, handle_exception):
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index d8d047d394..7644c9f4a9 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -168,28 +168,24 @@ svr4_same (struct so_list *gdb, struct so_list *inferior)
return (svr4_same_1 (gdb->so_original_name, inferior->so_original_name));
}
-static lm_info_svr4 *
+static std::unique_ptr<lm_info_svr4>
lm_info_read (CORE_ADDR lm_addr)
{
struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
- gdb_byte *lm;
- lm_info_svr4 *lm_info;
- struct cleanup *back_to;
+ std::unique_ptr<lm_info_svr4> lm_info;
- lm = (gdb_byte *) xmalloc (lmo->link_map_size);
- back_to = make_cleanup (xfree, lm);
+ gdb::byte_vector lm (lmo->link_map_size);
- if (target_read_memory (lm_addr, lm, lmo->link_map_size) != 0)
+ if (target_read_memory (lm_addr, lm.data (), lmo->link_map_size) != 0)
{
warning (_("Error reading shared library list entry at %s"),
- paddress (target_gdbarch (), lm_addr)),
- lm_info = NULL;
+ paddress (target_gdbarch (), lm_addr));
}
else
{
struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
- lm_info = new lm_info_svr4;
+ lm_info.reset (new lm_info_svr4);
lm_info->lm_addr = lm_addr;
lm_info->l_addr_inferior = extract_typed_address (&lm[lmo->l_addr_offset],
@@ -203,8 +199,6 @@ lm_info_read (CORE_ADDR lm_addr)
ptr_type);
}
- do_cleanups (back_to);
-
return lm_info;
}
@@ -958,8 +952,6 @@ svr4_keep_data_in_core (CORE_ADDR vaddr, unsigned long size)
{
struct svr4_info *info;
CORE_ADDR ldsomap;
- struct so_list *newobj;
- struct cleanup *old_chain;
CORE_ADDR name_lm;
info = get_svr4_info ();
@@ -973,13 +965,8 @@ svr4_keep_data_in_core (CORE_ADDR vaddr, unsigned long size)
if (!ldsomap)
return 0;
- newobj = XCNEW (struct so_list);
- old_chain = make_cleanup (xfree, newobj);
- lm_info_svr4 *li = lm_info_read (ldsomap);
- newobj->lm_info = li;
- make_cleanup (xfree, newobj->lm_info);
+ std::unique_ptr<lm_info_svr4> li (lm_info_read (ldsomap));
name_lm = li != NULL ? li->l_name : 0;
- do_cleanups (old_chain);
return (name_lm >= vaddr && name_lm < vaddr + size);
}
@@ -995,8 +982,7 @@ open_symbol_file_object (int from_tty)
struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
int l_name_size = TYPE_LENGTH (ptr_type);
- gdb_byte *l_name_buf = (gdb_byte *) xmalloc (l_name_size);
- struct cleanup *cleanups = make_cleanup (xfree, l_name_buf);
+ gdb::byte_vector l_name_buf (l_name_size);
struct svr4_info *info = get_svr4_info ();
symfile_add_flags add_flags = 0;
@@ -1005,38 +991,26 @@ open_symbol_file_object (int from_tty)
if (symfile_objfile)
if (!query (_("Attempt to reload symbols from process? ")))
- {
- do_cleanups (cleanups);
- return 0;
- }
+ return 0;
/* Always locate the debug struct, in case it has moved. */
info->debug_base = 0;
if (locate_base (info) == 0)
- {
- do_cleanups (cleanups);
- return 0; /* failed somehow... */
- }
+ return 0; /* failed somehow... */
/* First link map member should be the executable. */
lm = solib_svr4_r_map (info);
if (lm == 0)
- {
- do_cleanups (cleanups);
- return 0; /* failed somehow... */
- }
+ return 0; /* failed somehow... */
/* Read address of name from target memory to GDB. */
- read_memory (lm + lmo->l_name_offset, l_name_buf, l_name_size);
+ read_memory (lm + lmo->l_name_offset, l_name_buf.data (), l_name_size);
/* Convert the address to host format. */
- l_name = extract_typed_address (l_name_buf, ptr_type);
+ l_name = extract_typed_address (l_name_buf.data (), ptr_type);
if (l_name == 0)
- {
- do_cleanups (cleanups);
- return 0; /* No filename. */
- }
+ return 0; /* No filename. */
/* Now fetch the filename from target memory. */
target_read_string (l_name, &filename, SO_NAME_MAX_PATH_SIZE - 1, &errcode);
@@ -1045,14 +1019,12 @@ open_symbol_file_object (int from_tty)
{
warning (_("failed to read exec filename from attached file: %s"),
safe_strerror (errcode));
- do_cleanups (cleanups);
return 0;
}
/* Have a pathname: read the symbol file. */
symbol_file_add_main (filename.get (), add_flags);
- do_cleanups (cleanups);
return 1;
}
@@ -1342,7 +1314,7 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
so_list_up newobj (XCNEW (struct so_list));
- lm_info_svr4 *li = lm_info_read (lm);
+ lm_info_svr4 *li = lm_info_read (lm).release ();
newobj->lm_info = li;
if (li == NULL)
return 0;
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA 2/2] Remove some clanups from solib-svr4.c
2018-03-30 19:04 ` Tom Tromey
@ 2018-03-30 19:12 ` Simon Marchi
2018-03-30 19:18 ` Tom Tromey
0 siblings, 1 reply; 8+ messages in thread
From: Simon Marchi @ 2018-03-30 19:12 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
On 2018-03-30 15:04, Tom Tromey wrote:
>>> - newobj = XCNEW (struct so_list);
>>> - old_chain = make_cleanup (xfree, newobj);
>>> - lm_info_svr4 *li = lm_info_read (ldsomap);
>>> - newobj->lm_info = li;
>>> - make_cleanup (xfree, newobj->lm_info);
>>> + gdb::unique_xmalloc_ptr<lm_info_svr4> li (lm_info_read (ldsomap));
>
> Simon> This is not an error because lm_info_svr4 is trivially
> destructible,
> Simon> but since we allocate it with "new", we might as well use a
> Simon> unique_ptr, it's more future-proof.
>
> Good catch, thanks.
>
> Simon> How about making lm_info_read return an
> std::unique_ptr<lm_info_svr4>?
>
> Simon> The patch LGTM with or without those changes.
>
> How's this?
LGTM, I just noted two nits:
> @@ -168,28 +168,24 @@ svr4_same (struct so_list *gdb, struct so_list
> *inferior)
> return (svr4_same_1 (gdb->so_original_name,
> inferior->so_original_name));
> }
>
> -static lm_info_svr4 *
> +static std::unique_ptr<lm_info_svr4>
> lm_info_read (CORE_ADDR lm_addr)
> {
> struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
> - gdb_byte *lm;
> - lm_info_svr4 *lm_info;
> - struct cleanup *back_to;
> + std::unique_ptr<lm_info_svr4> lm_info;
>
> - lm = (gdb_byte *) xmalloc (lmo->link_map_size);
> - back_to = make_cleanup (xfree, lm);
> + gdb::byte_vector lm (lmo->link_map_size);
>
> - if (target_read_memory (lm_addr, lm, lmo->link_map_size) != 0)
> + if (target_read_memory (lm_addr, lm.data (), lmo->link_map_size) !=
> 0)
> {
> warning (_("Error reading shared library list entry at %s"),
> - paddress (target_gdbarch (), lm_addr)),
> - lm_info = NULL;
> + paddress (target_gdbarch (), lm_addr));
> }
Curly braces can be removed here.
> @@ -973,13 +965,8 @@ svr4_keep_data_in_core (CORE_ADDR vaddr, unsigned
> long size)
> if (!ldsomap)
> return 0;
>
> - newobj = XCNEW (struct so_list);
> - old_chain = make_cleanup (xfree, newobj);
> - lm_info_svr4 *li = lm_info_read (ldsomap);
> - newobj->lm_info = li;
> - make_cleanup (xfree, newobj->lm_info);
> + std::unique_ptr<lm_info_svr4> li (lm_info_read (ldsomap));
I think it's clearer to use the assignment operator in that case:
std::unique_ptr<lm_info_svr4> li = lm_info_read (ldsomap);
Simon
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA 2/2] Remove some clanups from solib-svr4.c
2018-03-30 19:12 ` Simon Marchi
@ 2018-03-30 19:18 ` Tom Tromey
0 siblings, 0 replies; 8+ messages in thread
From: Tom Tromey @ 2018-03-30 19:18 UTC (permalink / raw)
To: Simon Marchi; +Cc: Tom Tromey, gdb-patches
>>>>> "Simon" == Simon Marchi <simon.marchi@polymtl.ca> writes:
Simon> LGTM, I just noted two nits:
[...]
Thanks, I've made these changes and I'm checking it in.
Tom
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2018-03-30 19:18 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-28 4:24 [RFA 0/2] more cleanup removal Tom Tromey
2018-03-28 4:24 ` [RFA 1/2] Change target_read_string to use unique_xmalloc_ptr Tom Tromey
2018-03-30 5:28 ` Simon Marchi
2018-03-28 4:24 ` [RFA 2/2] Remove some clanups from solib-svr4.c Tom Tromey
2018-03-30 5:47 ` Simon Marchi
2018-03-30 19:04 ` Tom Tromey
2018-03-30 19:12 ` Simon Marchi
2018-03-30 19:18 ` Tom Tromey
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).