summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2017-08-05 10:29:56 -0600
committerTom Tromey <tom@tromey.com>2017-08-22 09:30:12 -0600
commit0b581c69fe7186d7d0ea1283c7ecf9839a8827cc (patch)
treeb4aa2a0e6c53d2fadd33e3b05e04b234ba940de9
parent14278e1fdbe045df184d6dd546ff6a1e9e3c3797 (diff)
downloadbinutils-gdb-0b581c69fe7186d7d0ea1283c7ecf9839a8827cc.tar.gz
Change rewrite_source_path to return a unique_xmalloc_ptr
This changes rewrite_source_path to return a unique_xmalloc_ptr and fixes up the callers. This allows removing some cleanups. ChangeLog 2017-08-22 Tom Tromey <tom@tromey.com> * source.h (rewrite_source_path): Return a unique_xmalloc_ptr. * source.c (rewrite_source_path): Return a unique_xmalloc_ptr. (find_and_open_source, symtab_to_fullname): Update. * psymtab.c (psymtab_to_fullname): Update.
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/psymtab.c15
-rw-r--r--gdb/source.c50
-rw-r--r--gdb/source.h2
4 files changed, 33 insertions, 41 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index c78e1eeca2f..6ac8d05c336 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
2017-08-22 Tom Tromey <tom@tromey.com>
+ * source.h (rewrite_source_path): Return a unique_xmalloc_ptr.
+ * source.c (rewrite_source_path): Return a unique_xmalloc_ptr.
+ (find_and_open_source, symtab_to_fullname): Update.
+ * psymtab.c (psymtab_to_fullname): Update.
+
+2017-08-22 Tom Tromey <tom@tromey.com>
+
* exec.c (exec_file_attach): Update.
* linux-thread-db.c (try_thread_db_load): Update.
* guile/scm-safe-call.c (gdbscm_safe_source_script): Update.
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 8283545f9ea..6307d6ef9f0 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -1199,23 +1199,20 @@ psymtab_to_fullname (struct partial_symtab *ps)
close (fd);
else
{
- char *fullname;
- struct cleanup *back_to;
+ gdb::unique_xmalloc_ptr<char> fullname;
/* rewrite_source_path would be applied by find_and_open_source, we
should report the pathname where GDB tried to find the file. */
if (ps->dirname == NULL || IS_ABSOLUTE_PATH (ps->filename))
- fullname = xstrdup (ps->filename);
+ fullname.reset (xstrdup (ps->filename));
else
- fullname = concat (ps->dirname, SLASH_STRING,
- ps->filename, (char *) NULL);
+ fullname.reset (concat (ps->dirname, SLASH_STRING,
+ ps->filename, (char *) NULL));
- back_to = make_cleanup (xfree, fullname);
- ps->fullname = rewrite_source_path (fullname);
+ ps->fullname = rewrite_source_path (fullname.get ()).release ();
if (ps->fullname == NULL)
- ps->fullname = xstrdup (fullname);
- do_cleanups (back_to);
+ ps->fullname = fullname.release ();
}
}
diff --git a/gdb/source.c b/gdb/source.c
index 0453f922a29..540371513eb 100644
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -994,13 +994,12 @@ get_substitute_path_rule (const char *path)
}
/* If the user specified a source path substitution rule that applies
- to PATH, then apply it and return the new path. This new path must
- be deallocated afterwards.
-
+ to PATH, then apply it and return the new path.
+
Return NULL if no substitution rule was specified by the user,
or if no rule applied to the given PATH. */
-
-char *
+
+gdb::unique_xmalloc_ptr<char>
rewrite_source_path (const char *path)
{
const struct substitute_path_rule *rule = get_substitute_path_rule (path);
@@ -1019,7 +1018,7 @@ rewrite_source_path (const char *path)
strcpy (new_path, rule->to);
strcat (new_path, path + from_len);
- return new_path;
+ return gdb::unique_xmalloc_ptr<char> (new_path);
}
int
@@ -1030,7 +1029,6 @@ find_and_open_source (const char *filename,
char *path = source_path;
const char *p;
int result;
- struct cleanup *cleanup;
/* Quick way out if we already know its full name. */
@@ -1039,7 +1037,7 @@ find_and_open_source (const char *filename,
/* The user may have requested that source paths be rewritten
according to substitution rules he provided. If a substitution
rule applies to this path, then apply it. */
- char *rewritten_fullname = rewrite_source_path (*fullname);
+ char *rewritten_fullname = rewrite_source_path (*fullname).release ();
if (rewritten_fullname != NULL)
{
@@ -1062,21 +1060,17 @@ find_and_open_source (const char *filename,
*fullname = NULL;
}
- cleanup = make_cleanup (null_cleanup, NULL);
-
+ gdb::unique_xmalloc_ptr<char> rewritten_dirname;
if (dirname != NULL)
{
/* If necessary, rewrite the compilation directory name according
to the source path substitution rules specified by the user. */
- char *rewritten_dirname = rewrite_source_path (dirname);
+ rewritten_dirname = rewrite_source_path (dirname);
if (rewritten_dirname != NULL)
- {
- make_cleanup (xfree, rewritten_dirname);
- dirname = rewritten_dirname;
- }
-
+ dirname = rewritten_dirname.get ();
+
/* Replace a path entry of $cdir with the compilation directory
name. */
#define cdir_len 5
@@ -1098,17 +1092,15 @@ find_and_open_source (const char *filename,
}
}
+ gdb::unique_xmalloc_ptr<char> rewritten_filename;
if (IS_ABSOLUTE_PATH (filename))
{
/* If filename is absolute path, try the source path
substitution on it. */
- char *rewritten_filename = rewrite_source_path (filename);
+ rewritten_filename = rewrite_source_path (filename);
if (rewritten_filename != NULL)
- {
- make_cleanup (xfree, rewritten_filename);
- filename = rewritten_filename;
- }
+ filename = rewritten_filename.get ();
}
result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, filename,
@@ -1122,7 +1114,6 @@ find_and_open_source (const char *filename,
OPEN_MODE, fullname);
}
- do_cleanups (cleanup);
return result;
}
@@ -1164,23 +1155,20 @@ symtab_to_fullname (struct symtab *s)
close (fd);
else
{
- char *fullname;
- struct cleanup *back_to;
+ gdb::unique_xmalloc_ptr<char> fullname;
/* rewrite_source_path would be applied by find_and_open_source, we
should report the pathname where GDB tried to find the file. */
if (SYMTAB_DIRNAME (s) == NULL || IS_ABSOLUTE_PATH (s->filename))
- fullname = xstrdup (s->filename);
+ fullname.reset (xstrdup (s->filename));
else
- fullname = concat (SYMTAB_DIRNAME (s), SLASH_STRING,
- s->filename, (char *) NULL);
+ fullname.reset (concat (SYMTAB_DIRNAME (s), SLASH_STRING,
+ s->filename, (char *) NULL));
- back_to = make_cleanup (xfree, fullname);
- s->fullname = rewrite_source_path (fullname);
+ s->fullname = rewrite_source_path (fullname.get ()).release ();
if (s->fullname == NULL)
- s->fullname = xstrdup (fullname);
- do_cleanups (back_to);
+ s->fullname = fullname.release ();
}
}
diff --git a/gdb/source.h b/gdb/source.h
index ee9f3fac65d..263715aeddb 100644
--- a/gdb/source.h
+++ b/gdb/source.h
@@ -48,7 +48,7 @@ extern int find_and_open_source (const char *filename,
negative number for error. */
extern int open_source_file (struct symtab *s);
-extern char *rewrite_source_path (const char *path);
+extern gdb::unique_xmalloc_ptr<char> rewrite_source_path (const char *path);
extern const char *symtab_to_fullname (struct symtab *s);