203 lines
6.7 KiB
Diff
203 lines
6.7 KiB
Diff
From 4e0e7ff14ba271576232160bf337639662a2ea23 Mon Sep 17 00:00:00 2001
|
|
From: Tom Tromey <tom@tromey.com>
|
|
Date: Thu, 16 Feb 2023 17:36:29 -0700
|
|
Subject: [PATCH 2/3] Avoid manual memory management in go-lang.c
|
|
|
|
I noticed a couple of spots in go-lang.c that could be improved by
|
|
using unique_ptr.
|
|
|
|
Reviewed-By: Andrew Burgess <aburgess@redhat.com>
|
|
---
|
|
gdb/dwarf2/read.c | 2 +-
|
|
gdb/go-exp.c | 287 +++++++++++++++++++++++-----------------------
|
|
gdb/go-exp.y | 8 +-
|
|
gdb/go-lang.c | 40 +++----
|
|
gdb/go-lang.h | 11 +-
|
|
5 files changed, 173 insertions(+), 175 deletions(-)
|
|
|
|
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
|
|
index 8aa7f8c31e5..61f4bd75013 100644
|
|
--- a/gdb/dwarf2/read.c
|
|
+++ b/gdb/dwarf2/read.c
|
|
@@ -7890,7 +7890,7 @@ fixup_go_packaging (struct dwarf2_cu *cu)
|
|
&& sym->aclass () == LOC_BLOCK)
|
|
{
|
|
gdb::unique_xmalloc_ptr<char> this_package_name
|
|
- (go_symbol_package_name (sym));
|
|
+ = go_symbol_package_name (sym);
|
|
|
|
if (this_package_name == NULL)
|
|
continue;
|
|
diff --git a/gdb/go-exp.y b/gdb/go-exp.y
|
|
index cbaa79ee18c..542a06d06d6 100644
|
|
--- a/gdb/go-exp.y
|
|
+++ b/gdb/go-exp.y
|
|
@@ -1393,16 +1393,16 @@ classify_name (struct parser_state *par_state, const struct block *block)
|
|
current package. */
|
|
|
|
{
|
|
- char *current_package_name = go_block_package_name (block);
|
|
+ gdb::unique_xmalloc_ptr<char> current_package_name
|
|
+ = go_block_package_name (block);
|
|
|
|
if (current_package_name != NULL)
|
|
{
|
|
struct stoken sval =
|
|
- build_packaged_name (current_package_name,
|
|
- strlen (current_package_name),
|
|
+ build_packaged_name (current_package_name.get (),
|
|
+ strlen (current_package_name.get ()),
|
|
copy.c_str (), copy.size ());
|
|
|
|
- xfree (current_package_name);
|
|
sym = lookup_symbol (sval.ptr, block, VAR_DOMAIN,
|
|
&is_a_field_of_this);
|
|
if (sym.symbol)
|
|
diff --git a/gdb/go-lang.c b/gdb/go-lang.c
|
|
index 7549f14dc63..f9176ace71d 100644
|
|
--- a/gdb/go-lang.c
|
|
+++ b/gdb/go-lang.c
|
|
@@ -163,11 +163,8 @@ unpack_package_and_object (char *buf,
|
|
|
|
Space for the resulting strings is malloc'd in one buffer.
|
|
PACKAGEP,OBJECTP,METHOD_TYPE* will (typically) point into this buffer.
|
|
- [There are a few exceptions, but the caller is still responsible for
|
|
- freeing the resulting pointer.]
|
|
A pointer to this buffer is returned, or NULL if symbol isn't a
|
|
mangled Go symbol.
|
|
- The caller is responsible for freeing the result.
|
|
|
|
*METHOD_TYPE_IS_POINTERP is set to a boolean indicating if
|
|
the method type is a pointer.
|
|
@@ -180,7 +177,7 @@ unpack_package_and_object (char *buf,
|
|
If we ever need to unpack the method type, this routine should work
|
|
for that too. */
|
|
|
|
-static char *
|
|
+static gdb::unique_xmalloc_ptr<char>
|
|
unpack_mangled_go_symbol (const char *mangled_name,
|
|
const char **packagep,
|
|
const char **objectp,
|
|
@@ -209,9 +206,10 @@ unpack_mangled_go_symbol (const char *mangled_name,
|
|
/* main.init is mangled specially. */
|
|
if (strcmp (mangled_name, "__go_init_main") == 0)
|
|
{
|
|
- char *package = xstrdup ("main");
|
|
+ gdb::unique_xmalloc_ptr<char> package
|
|
+ = make_unique_xstrdup ("main");
|
|
|
|
- *packagep = package;
|
|
+ *packagep = package.get ();
|
|
*objectp = "init";
|
|
return package;
|
|
}
|
|
@@ -219,9 +217,10 @@ unpack_mangled_go_symbol (const char *mangled_name,
|
|
/* main.main is mangled specially (missing prefix). */
|
|
if (strcmp (mangled_name, "main.main") == 0)
|
|
{
|
|
- char *package = xstrdup ("main");
|
|
+ gdb::unique_xmalloc_ptr<char> package
|
|
+ = make_unique_xstrdup ("main");
|
|
|
|
- *packagep = package;
|
|
+ *packagep = package.get ();
|
|
*objectp = "main";
|
|
return package;
|
|
}
|
|
@@ -261,7 +260,8 @@ unpack_mangled_go_symbol (const char *mangled_name,
|
|
|
|
/* At this point we've decided we have a mangled Go symbol. */
|
|
|
|
- buf = xstrdup (mangled_name);
|
|
+ gdb::unique_xmalloc_ptr<char> result = make_unique_xstrdup (mangled_name);
|
|
+ buf = result.get ();
|
|
|
|
/* Search backwards looking for "N<digit(s)>". */
|
|
p = buf + len;
|
|
@@ -317,7 +317,7 @@ unpack_mangled_go_symbol (const char *mangled_name,
|
|
}
|
|
|
|
unpack_package_and_object (buf, packagep, objectp);
|
|
- return buf;
|
|
+ return result;
|
|
}
|
|
|
|
/* Implements the la_demangle language_defn routine for language Go.
|
|
@@ -381,10 +381,9 @@ go_language::demangle_symbol (const char *mangled_name, int options) const
|
|
return make_unique_xstrdup ((const char *) obstack_finish (&tempbuf));
|
|
}
|
|
|
|
-/* Given a Go symbol, return its package or NULL if unknown.
|
|
- Space for the result is malloc'd, caller must free. */
|
|
+/* See go-lang.h. */
|
|
|
|
-char *
|
|
+gdb::unique_xmalloc_ptr<char>
|
|
go_symbol_package_name (const struct symbol *sym)
|
|
{
|
|
const char *mangled_name = sym->linkage_name ();
|
|
@@ -393,8 +392,7 @@ go_symbol_package_name (const struct symbol *sym)
|
|
const char *method_type_package_name;
|
|
const char *method_type_object_name;
|
|
int method_type_is_pointer;
|
|
- char *name_buf;
|
|
- char *result;
|
|
+ gdb::unique_xmalloc_ptr<char> name_buf;
|
|
|
|
gdb_assert (sym->language () == language_go);
|
|
name_buf = unpack_mangled_go_symbol (mangled_name,
|
|
@@ -405,15 +403,12 @@ go_symbol_package_name (const struct symbol *sym)
|
|
/* Some Go symbols don't have mangled form we interpret (yet). */
|
|
if (name_buf == NULL)
|
|
return NULL;
|
|
- result = xstrdup (package_name);
|
|
- xfree (name_buf);
|
|
- return result;
|
|
+ return make_unique_xstrdup (package_name);
|
|
}
|
|
|
|
-/* Return the package that BLOCK is in, or NULL if there isn't one.
|
|
- Space for the result is malloc'd, caller must free. */
|
|
+/* See go-lang.h. */
|
|
|
|
-char *
|
|
+gdb::unique_xmalloc_ptr<char>
|
|
go_block_package_name (const struct block *block)
|
|
{
|
|
while (block != NULL)
|
|
@@ -422,7 +417,8 @@ go_block_package_name (const struct block *block)
|
|
|
|
if (function != NULL)
|
|
{
|
|
- char *package_name = go_symbol_package_name (function);
|
|
+ gdb::unique_xmalloc_ptr<char> package_name
|
|
+ = go_symbol_package_name (function);
|
|
|
|
if (package_name != NULL)
|
|
return package_name;
|
|
diff --git a/gdb/go-lang.h b/gdb/go-lang.h
|
|
index f0929cc3ac5..8edfe6ed53a 100644
|
|
--- a/gdb/go-lang.h
|
|
+++ b/gdb/go-lang.h
|
|
@@ -62,9 +62,14 @@ extern const char *go_main_name (void);
|
|
|
|
extern enum go_type go_classify_struct_type (struct type *type);
|
|
|
|
-extern char *go_symbol_package_name (const struct symbol *sym);
|
|
-
|
|
-extern char *go_block_package_name (const struct block *block);
|
|
+/* Given a Go symbol, return its package or nullptr if unknown. */
|
|
+extern gdb::unique_xmalloc_ptr<char> go_symbol_package_name
|
|
+ (const struct symbol *sym);
|
|
+
|
|
+/* Return the package that BLOCK is in, or nullptr if there isn't
|
|
+ one. */
|
|
+extern gdb::unique_xmalloc_ptr<char> go_block_package_name
|
|
+ (const struct block *block);
|
|
|
|
extern const struct builtin_go_type *builtin_go_type (struct gdbarch *);
|
|
|
|
--
|
|
2.35.3
|
|
|