aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2018-03-08 18:56:23 -0500
committerSimon Marchi <simon.marchi@ericsson.com>2018-03-08 18:56:23 -0500
commita8dbfd5853e3a5f7f2a3ca817e96d9e0759061a2 (patch)
tree6afc9df31bdc7097c42d1b0b8d0c994ba354e626
parente6a58aa8a70c7fd17d9930e7df8d158a7e3c8c8e (diff)
downloadgdb-a8dbfd5853e3a5f7f2a3ca817e96d9e0759061a2.zip
gdb-a8dbfd5853e3a5f7f2a3ca817e96d9e0759061a2.tar.gz
gdb-a8dbfd5853e3a5f7f2a3ca817e96d9e0759061a2.tar.bz2
Make find_separate_debug_file* return std::string
This patch makes the find_separate_debug_file* functions return std::string, which allows to get rid of some manual memory management and one cleanup. gdb/ChangeLog: * build-id.c (find_separate_debug_file_by_buildid): Return std::string. * build-id.h (find_separate_debug_file_by_buildid): Return std::string. * coffread.c (coff_symfile_read): Adjust to std::string. * elfread.c (elf_symfile_read): Adjust to std::string. * symfile.c (separate_debug_file_exists): Change parameter to std::string. (find_separate_debug_file): Return std::string. (find_separate_debug_file_by_debuglink): Return std::string. * symfile.h (find_separate_debug_file_by_debuglink): Return std::string.
-rw-r--r--gdb/ChangeLog15
-rw-r--r--gdb/build-id.c7
-rw-r--r--gdb/build-id.h8
-rw-r--r--gdb/coffread.c15
-rw-r--r--gdb/elfread.c13
-rw-r--r--gdb/symfile.c76
-rw-r--r--gdb/symfile.h2
7 files changed, 66 insertions, 70 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0ee5178..7e4bd95 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,20 @@
2018-03-08 Simon Marchi <simon.marchi@polymtl.ca>
+ * build-id.c (find_separate_debug_file_by_buildid): Return
+ std::string.
+ * build-id.h (find_separate_debug_file_by_buildid): Return
+ std::string.
+ * coffread.c (coff_symfile_read): Adjust to std::string.
+ * elfread.c (elf_symfile_read): Adjust to std::string.
+ * symfile.c (separate_debug_file_exists): Change parameter to
+ std::string.
+ (find_separate_debug_file): Return std::string.
+ (find_separate_debug_file_by_debuglink): Return std::string.
+ * symfile.h (find_separate_debug_file_by_debuglink): Return
+ std::string.
+
+2018-03-08 Simon Marchi <simon.marchi@polymtl.ca>
+
* common/xml-utils.c (xml_escape_text): Move code to...
(xml_escape_text_append): ... this new function.
* common/xml-utils.h (xml_escape_text_append): New declaration.
diff --git a/gdb/build-id.c b/gdb/build-id.c
index 57d98c9..a5d4e67 100644
--- a/gdb/build-id.c
+++ b/gdb/build-id.c
@@ -136,7 +136,7 @@ build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id)
/* See build-id.h. */
-char *
+std::string
find_separate_debug_file_by_buildid (struct objfile *objfile)
{
const struct bfd_build_id *build_id;
@@ -157,7 +157,8 @@ find_separate_debug_file_by_buildid (struct objfile *objfile)
warning (_("\"%s\": separate debug info file has no debug info"),
bfd_get_filename (abfd.get ()));
else if (abfd != NULL)
- return xstrdup (bfd_get_filename (abfd.get ()));
+ return std::string (bfd_get_filename (abfd.get ()));
}
- return NULL;
+
+ return std::string ();
}
diff --git a/gdb/build-id.h b/gdb/build-id.h
index 0f13c7d..15fb609 100644
--- a/gdb/build-id.h
+++ b/gdb/build-id.h
@@ -41,10 +41,10 @@ extern gdb_bfd_ref_ptr build_id_to_debug_bfd (size_t build_id_len,
const bfd_byte *build_id);
/* Find the separate debug file for OBJFILE, by using the build-id
- associated with OBJFILE's BFD. If successful, returns a malloc'd
- file name for the separate debug file. The caller must free this.
- Otherwise, returns NULL. */
+ associated with OBJFILE's BFD. If successful, returns the file name for the
+ separate debug file, otherwise, return an empty string. */
-extern char *find_separate_debug_file_by_buildid (struct objfile *objfile);
+extern std::string find_separate_debug_file_by_buildid
+ (struct objfile *objfile);
#endif /* BUILD_ID_H */
diff --git a/gdb/coffread.c b/gdb/coffread.c
index fbbbb68..cad3e7e 100644
--- a/gdb/coffread.c
+++ b/gdb/coffread.c
@@ -733,20 +733,17 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
/* Try to add separate debug file if no symbols table found. */
if (!objfile_has_partial_symbols (objfile))
{
- char *debugfile;
+ std::string debugfile = find_separate_debug_file_by_buildid (objfile);
- debugfile = find_separate_debug_file_by_buildid (objfile);
-
- if (debugfile == NULL)
+ if (debugfile.empty ())
debugfile = find_separate_debug_file_by_debuglink (objfile);
- make_cleanup (xfree, debugfile);
- if (debugfile)
+ if (!debugfile.empty ())
{
- gdb_bfd_ref_ptr abfd (symfile_bfd_open (debugfile));
+ gdb_bfd_ref_ptr abfd (symfile_bfd_open (debugfile.c_str ()));
- symbol_file_add_separate (abfd.get (), debugfile, symfile_flags,
- objfile);
+ symbol_file_add_separate (abfd.get (), debugfile.c_str (),
+ symfile_flags, objfile);
}
}
diff --git a/gdb/elfread.c b/gdb/elfread.c
index 103b214..2607890 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -1259,17 +1259,16 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
&& objfile->separate_debug_objfile == NULL
&& objfile->separate_debug_objfile_backlink == NULL)
{
- gdb::unique_xmalloc_ptr<char> debugfile
- (find_separate_debug_file_by_buildid (objfile));
+ std::string debugfile = find_separate_debug_file_by_buildid (objfile);
- if (debugfile == NULL)
- debugfile.reset (find_separate_debug_file_by_debuglink (objfile));
+ if (debugfile.empty ())
+ debugfile = find_separate_debug_file_by_debuglink (objfile);
- if (debugfile != NULL)
+ if (!debugfile.empty ())
{
- gdb_bfd_ref_ptr abfd (symfile_bfd_open (debugfile.get ()));
+ gdb_bfd_ref_ptr abfd (symfile_bfd_open (debugfile.c_str ()));
- symbol_file_add_separate (abfd.get (), debugfile.get (),
+ symbol_file_add_separate (abfd.get (), debugfile.c_str (),
symfile_flags, objfile);
}
}
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 72bf0d8..58747d5 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -1333,7 +1333,7 @@ symbol_file_clear (int from_tty)
int separate_debug_file_debug = 0;
static int
-separate_debug_file_exists (const char *name, unsigned long crc,
+separate_debug_file_exists (const std::string &name, unsigned long crc,
struct objfile *parent_objfile)
{
unsigned long file_crc;
@@ -1347,13 +1347,13 @@ separate_debug_file_exists (const char *name, unsigned long crc,
".debug" suffix as "/usr/lib/debug/path/to/file" is a separate tree where
the separate debug infos with the same basename can exist. */
- if (filename_cmp (name, objfile_name (parent_objfile)) == 0)
+ if (filename_cmp (name.c_str (), objfile_name (parent_objfile)) == 0)
return 0;
if (separate_debug_file_debug)
- printf_unfiltered (_(" Trying %s\n"), name);
+ printf_unfiltered (_(" Trying %s\n"), name.c_str ());
- gdb_bfd_ref_ptr abfd (gdb_bfd_open (name, gnutarget, -1));
+ gdb_bfd_ref_ptr abfd (gdb_bfd_open (name.c_str (), gnutarget, -1));
if (abfd == NULL)
return 0;
@@ -1403,7 +1403,7 @@ separate_debug_file_exists (const char *name, unsigned long crc,
if (verified_as_different || parent_crc != file_crc)
warning (_("the debug information found in \"%s\""
" does not match \"%s\" (CRC mismatch).\n"),
- name, objfile_name (parent_objfile));
+ name.c_str (), objfile_name (parent_objfile));
return 0;
}
@@ -1431,46 +1431,31 @@ show_debug_file_directory (struct ui_file *file, int from_tty,
dirname(objfile->name) due to symlinks), and DEBUGLINK as the file we are
looking for. CANON_DIR is the "realpath" form of DIR.
DIR must contain a trailing '/'.
- Returns the path of the file with separate debug info, of NULL. */
+ Returns the path of the file with separate debug info, or an empty
+ string. */
-static char *
+static std::string
find_separate_debug_file (const char *dir,
const char *canon_dir,
const char *debuglink,
unsigned long crc32, struct objfile *objfile)
{
- char *debugfile;
- int i;
-
if (separate_debug_file_debug)
printf_unfiltered (_("\nLooking for separate debug info (debug link) for "
"%s\n"), objfile_name (objfile));
- /* Set I to std::max (strlen (canon_dir), strlen (dir)). */
- i = strlen (dir);
- if (canon_dir != NULL && strlen (canon_dir) > i)
- i = strlen (canon_dir);
-
- debugfile
- = (char *) xmalloc (strlen (debug_file_directory) + 1
- + i
- + strlen (DEBUG_SUBDIRECTORY)
- + strlen ("/")
- + strlen (debuglink)
- + 1);
-
/* First try in the same directory as the original file. */
- strcpy (debugfile, dir);
- strcat (debugfile, debuglink);
+ std::string debugfile = dir;
+ debugfile += debuglink;
if (separate_debug_file_exists (debugfile, crc32, objfile))
return debugfile;
/* Then try in the subdirectory named DEBUG_SUBDIRECTORY. */
- strcpy (debugfile, dir);
- strcat (debugfile, DEBUG_SUBDIRECTORY);
- strcat (debugfile, "/");
- strcat (debugfile, debuglink);
+ debugfile = dir;
+ debugfile += DEBUG_SUBDIRECTORY;
+ debugfile += "/";
+ debugfile += debuglink;
if (separate_debug_file_exists (debugfile, crc32, objfile))
return debugfile;
@@ -1485,10 +1470,10 @@ find_separate_debug_file (const char *dir,
for (const gdb::unique_xmalloc_ptr<char> &debugdir : debugdir_vec)
{
- strcpy (debugfile, debugdir.get ());
- strcat (debugfile, "/");
- strcat (debugfile, dir);
- strcat (debugfile, debuglink);
+ debugfile = debugdir.get ();
+ debugfile += "/";
+ debugfile += dir;
+ debugfile += debuglink;
if (separate_debug_file_exists (debugfile, crc32, objfile))
return debugfile;
@@ -1500,18 +1485,17 @@ find_separate_debug_file (const char *dir,
strlen (gdb_sysroot)) == 0
&& IS_DIR_SEPARATOR (canon_dir[strlen (gdb_sysroot)]))
{
- strcpy (debugfile, debugdir.get ());
- strcat (debugfile, canon_dir + strlen (gdb_sysroot));
- strcat (debugfile, "/");
- strcat (debugfile, debuglink);
+ debugfile = debugdir.get ();
+ debugfile += (canon_dir + strlen (gdb_sysroot));
+ debugfile += "/";
+ debugfile += debuglink;
if (separate_debug_file_exists (debugfile, crc32, objfile))
return debugfile;
}
}
- xfree (debugfile);
- return NULL;
+ return std::string ();
}
/* Modify PATH to contain only "[/]directory/" part of PATH.
@@ -1534,12 +1518,11 @@ terminate_after_last_dir_separator (char *path)
}
/* Find separate debuginfo for OBJFILE (using .gnu_debuglink section).
- Returns pathname, or NULL. */
+ Returns pathname, or an empty string. */
-char *
+std::string
find_separate_debug_file_by_debuglink (struct objfile *objfile)
{
- char *debugfile;
unsigned long crc32;
gdb::unique_xmalloc_ptr<char> debuglink
@@ -1549,17 +1532,18 @@ find_separate_debug_file_by_debuglink (struct objfile *objfile)
{
/* There's no separate debug info, hence there's no way we could
load it => no warning. */
- return NULL;
+ return std::string ();
}
std::string dir = objfile_name (objfile);
terminate_after_last_dir_separator (&dir[0]);
gdb::unique_xmalloc_ptr<char> canon_dir (lrealpath (dir.c_str ()));
- debugfile = find_separate_debug_file (dir.c_str (), canon_dir.get (),
- debuglink.get (), crc32, objfile);
+ std::string debugfile
+ = find_separate_debug_file (dir.c_str (), canon_dir.get (),
+ debuglink.get (), crc32, objfile);
- if (debugfile == NULL)
+ if (debugfile.empty ())
{
/* For PR gdb/9538, try again with realpath (if different from the
original). */
diff --git a/gdb/symfile.h b/gdb/symfile.h
index 7c3fd82..8cd47d8 100644
--- a/gdb/symfile.h
+++ b/gdb/symfile.h
@@ -426,7 +426,7 @@ extern struct objfile *symbol_file_add_from_bfd (bfd *, const char *, symfile_ad
extern void symbol_file_add_separate (bfd *, const char *, symfile_add_flags,
struct objfile *);
-extern char *find_separate_debug_file_by_debuglink (struct objfile *);
+extern std::string find_separate_debug_file_by_debuglink (struct objfile *);
/* Create a new section_addr_info, with room for NUM_SECTIONS. */