binutils-gdb/gdb/go-lang.h
Tom Tromey 3456e70c9d Use unique_xmalloc_ptr<char> when demangling
I noticed that some methods in language_defn could use
unique_xmalloc_ptr<char> rather than a plain 'char *'.  This patch
implements this change, fixing up the fallout and changing
gdb_demangle to also return this type.  In one spot, std::string is
used to simplify some related code, and in another, an auto_obstack is
used to avoid manual management.

Regression tested on x86-64 Fedora 34.
2021-10-04 13:45:38 -06:00

142 lines
3.5 KiB
C++

/* Go language support definitions for GDB, the GNU debugger.
Copyright (C) 2012-2021 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#if !defined (GO_LANG_H)
#define GO_LANG_H 1
struct type_print_options;
#include "gdbtypes.h"
#include "symtab.h"
#include "value.h"
struct parser_state;
struct builtin_go_type
{
struct type *builtin_void;
struct type *builtin_char;
struct type *builtin_bool;
struct type *builtin_int;
struct type *builtin_uint;
struct type *builtin_uintptr;
struct type *builtin_int8;
struct type *builtin_int16;
struct type *builtin_int32;
struct type *builtin_int64;
struct type *builtin_uint8;
struct type *builtin_uint16;
struct type *builtin_uint32;
struct type *builtin_uint64;
struct type *builtin_float32;
struct type *builtin_float64;
struct type *builtin_complex64;
struct type *builtin_complex128;
};
enum go_type
{
GO_TYPE_NONE, /* Not a Go object. */
GO_TYPE_STRING
};
/* Defined in go-lang.c. */
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);
extern const struct builtin_go_type *builtin_go_type (struct gdbarch *);
/* Class representing the Go language. */
class go_language : public language_defn
{
public:
go_language ()
: language_defn (language_go)
{ /* Nothing. */ }
/* See language.h. */
const char *name () const override
{ return "go"; }
/* See language.h. */
const char *natural_name () const override
{ return "Go"; }
/* See language.h. */
void language_arch_info (struct gdbarch *gdbarch,
struct language_arch_info *lai) const override;
/* See language.h. */
bool sniff_from_mangled_name
(const char *mangled, gdb::unique_xmalloc_ptr<char> *demangled)
const override
{
*demangled = demangle_symbol (mangled, 0);
return *demangled != NULL;
}
/* See language.h. */
gdb::unique_xmalloc_ptr<char> demangle_symbol (const char *mangled,
int options) const override;
/* See language.h. */
void print_type (struct type *type, const char *varstring,
struct ui_file *stream, int show, int level,
const struct type_print_options *flags) const override;
/* See language.h. */
void value_print_inner
(struct value *val, struct ui_file *stream, int recurse,
const struct value_print_options *options) const override;
/* See language.h. */
int parser (struct parser_state *ps) const override;
/* See language.h. */
bool is_string_type_p (struct type *type) const override
{
type = check_typedef (type);
return (type->code () == TYPE_CODE_STRUCT
&& go_classify_struct_type (type) == GO_TYPE_STRING);
}
/* See language.h. */
bool store_sym_names_in_linkage_form_p () const override
{ return true; }
};
#endif /* !defined (GO_LANG_H) */