X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgo-lang.c;h=b527d9f72eec31dbe002773f0a5af0f92a2163df;hb=aa989b27d0bad451455416953c0e5026e229863a;hp=309b1eb90b8a1220ba19b6022fd60238f8cac3da;hpb=28e7fd62340426746f9c896cbc40c5d374ec47aa;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/go-lang.c b/gdb/go-lang.c index 309b1eb90b..b527d9f72e 100644 --- a/gdb/go-lang.c +++ b/gdb/go-lang.c @@ -1,6 +1,6 @@ /* Go language support routines for GDB, the GNU debugger. - Copyright (C) 2012-2013 Free Software Foundation, Inc. + Copyright (C) 2012-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -32,15 +32,15 @@ */ #include "defs.h" -#include "gdb_assert.h" #include "gdb_obstack.h" -#include "gdb_string.h" #include "block.h" #include "symtab.h" #include "language.h" +#include "varobj.h" #include "go-lang.h" #include "c-lang.h" #include "parser-defs.h" +#include "gdbarch.h" #include @@ -55,10 +55,10 @@ static const char GO_MAIN_MAIN[] = "main.main"; const char * go_main_name (void) { - struct minimal_symbol *msym; + struct bound_minimal_symbol msym; msym = lookup_minimal_symbol (GO_MAIN_MAIN, NULL, NULL); - if (msym != NULL) + if (msym.minsym != NULL) return GO_MAIN_MAIN; /* No known entry procedure found, the main program is probably not Go. */ @@ -78,8 +78,8 @@ gccgo_string_p (struct type *type) struct type *type0 = TYPE_FIELD_TYPE (type, 0); struct type *type1 = TYPE_FIELD_TYPE (type, 1); - CHECK_TYPEDEF (type0); - CHECK_TYPEDEF (type1); + type0 = check_typedef (type0); + type1 = check_typedef (type1); if (TYPE_CODE (type0) == TYPE_CODE_PTR && strcmp (TYPE_FIELD_NAME (type, 0), "__data") == 0 @@ -88,7 +88,7 @@ gccgo_string_p (struct type *type) { struct type *target_type = TYPE_TARGET_TYPE (type0); - CHECK_TYPEDEF (target_type); + target_type = check_typedef (target_type); if (TYPE_CODE (target_type) == TYPE_CODE_INT && TYPE_LENGTH (target_type) == 1 @@ -107,8 +107,8 @@ static int sixg_string_p (struct type *type) { if (TYPE_NFIELDS (type) == 2 - && TYPE_TAG_NAME (type) != NULL - && strcmp (TYPE_TAG_NAME (type), "string") == 0) + && TYPE_NAME (type) != NULL + && strcmp (TYPE_NAME (type), "string") == 0) return 1; return 0; @@ -120,7 +120,7 @@ sixg_string_p (struct type *type) enum go_type go_classify_struct_type (struct type *type) { - CHECK_TYPEDEF (type); + type = check_typedef (type); /* Recognize strings as they're useful to be able to print without pretty-printers. */ @@ -131,6 +131,16 @@ go_classify_struct_type (struct type *type) return GO_TYPE_NONE; } +/* Return true if TYPE is a string. */ + +static bool +go_is_string_type_p (struct type *type) +{ + type = check_typedef (type); + return (TYPE_CODE (type) == TYPE_CODE_STRUCT + && go_classify_struct_type (type) == GO_TYPE_STRING); +} + /* Subroutine of unpack_mangled_go_symbol to simplify it. Given "[foo.]bar.baz", store "bar" in *PACKAGEP and "baz" in *OBJECTP. We stomp on the last '.' to nul-terminate "bar". @@ -196,9 +206,9 @@ unpack_mangled_go_symbol (const char *mangled_name, /* Pointer to "N" if valid "N_" found. */ char *method_type; /* Pointer to the first '.'. */ - char *first_dot; + const char *first_dot; /* Pointer to the last '.'. */ - char *last_dot; + const char *last_dot; /* Non-zero if we saw a pointer indicator. */ int saw_pointer; @@ -234,8 +244,8 @@ unpack_mangled_go_symbol (const char *mangled_name, libgo_.*: used by gccgo's runtime Thus we don't support -fgo-prefix (except as used by the runtime). */ - if (strncmp (mangled_name, "go.", 3) != 0 - && strncmp (mangled_name, "libgo_", 6) != 0) + if (!startswith (mangled_name, "go.") + && !startswith (mangled_name, "libgo_")) return NULL; /* Quick check for whether a search may be fruitful. */ @@ -380,19 +390,28 @@ go_demangle (const char *mangled_name, int options) } obstack_grow_str0 (&tempbuf, ""); - result = xstrdup (obstack_finish (&tempbuf)); + result = xstrdup ((const char *) obstack_finish (&tempbuf)); obstack_free (&tempbuf, NULL); xfree (name_buf); return result; } +/* la_sniff_from_mangled_name for Go. */ + +static int +go_sniff_from_mangled_name (const char *mangled, char **demangled) +{ + *demangled = go_demangle (mangled, 0); + return *demangled != NULL; +} + /* Given a Go symbol, return its package or NULL if unknown. Space for the result is malloc'd, caller must free. */ char * go_symbol_package_name (const struct symbol *sym) { - const char *mangled_name = SYMBOL_LINKAGE_NAME (sym); + const char *mangled_name = sym->linkage_name (); const char *package_name; const char *object_name; const char *method_type_package_name; @@ -401,7 +420,7 @@ go_symbol_package_name (const struct symbol *sym) char *name_buf; char *result; - gdb_assert (SYMBOL_LANGUAGE (sym) == language_go); + gdb_assert (sym->language () == language_go); name_buf = unpack_mangled_go_symbol (mangled_name, &package_name, &object_name, &method_type_package_name, @@ -479,7 +498,7 @@ static const struct op_print go_op_print_tab[] = {"unsafe.Sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0}, {"++", UNOP_POSTINCREMENT, PREC_SUFFIX, 0}, {"--", UNOP_POSTDECREMENT, PREC_SUFFIX, 0}, - {NULL, 0, 0, 0} + {NULL, OP_NULL, PREC_SUFFIX, 0} }; enum go_primitive_types { @@ -557,17 +576,18 @@ go_language_arch_info (struct gdbarch *gdbarch, lai->bool_type_default = builtin->builtin_bool; } -static const struct language_defn go_language_defn = +extern const struct language_defn go_language_defn = { "go", + "Go", language_go, range_check_off, case_sensitive_on, array_row_major, macro_expansion_no, + NULL, &exp_descriptor_c, go_parse, - go_error, null_post_parser, c_printchar, /* Print a character constant. */ c_printstr, /* Function to print string constant. */ @@ -580,23 +600,30 @@ static const struct language_defn go_language_defn = default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline. */ NULL, /* name_of_this */ + false, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, basic_lookup_transparent_type, go_demangle, /* Language specific symbol demangler. */ + go_sniff_from_mangled_name, NULL, /* Language specific class_name_from_physname. */ go_op_print_tab, /* Expression operators for printing. */ 1, /* C-style arrays. */ 0, /* String lower bound. */ default_word_break_characters, - default_make_symbol_completion_list, + default_collect_symbol_completion_matches, go_language_arch_info, default_print_array_index, default_pass_by_reference, - c_get_string, - NULL, + c_watch_location_expression, + NULL, /* la_get_symbol_name_matcher */ iterate_over_symbols, - LANG_MAGIC + default_search_name_hash, + &default_varobj_ops, + NULL, + NULL, + go_is_string_type_p, + "{...}" /* la_struct_too_deep_ellipsis */ }; static void * @@ -606,7 +633,7 @@ build_go_types (struct gdbarch *gdbarch) = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_go_type); builtin_go_type->builtin_void - = arch_type (gdbarch, TYPE_CODE_VOID, 1, "void"); + = arch_type (gdbarch, TYPE_CODE_VOID, TARGET_CHAR_BIT, "void"); builtin_go_type->builtin_char = arch_character_type (gdbarch, 8, 1, "char"); builtin_go_type->builtin_bool @@ -634,9 +661,9 @@ build_go_types (struct gdbarch *gdbarch) builtin_go_type->builtin_uint64 = arch_integer_type (gdbarch, 64, 1, "uint64"); builtin_go_type->builtin_float32 - = arch_float_type (gdbarch, 32, "float32", NULL); + = arch_float_type (gdbarch, 32, "float32", floatformats_ieee_single); builtin_go_type->builtin_float64 - = arch_float_type (gdbarch, 64, "float64", NULL); + = arch_float_type (gdbarch, 64, "float64", floatformats_ieee_double); builtin_go_type->builtin_complex64 = arch_complex_type (gdbarch, "complex64", builtin_go_type->builtin_float32); @@ -652,15 +679,11 @@ static struct gdbarch_data *go_type_data; const struct builtin_go_type * builtin_go_type (struct gdbarch *gdbarch) { - return gdbarch_data (gdbarch, go_type_data); + return (const struct builtin_go_type *) gdbarch_data (gdbarch, go_type_data); } -extern initialize_file_ftype _initialize_go_language; - void _initialize_go_language (void) { go_type_data = gdbarch_data_register_post_init (build_go_types); - - add_language (&go_language_defn); }