gdb/go-lang.c - gdb
Global variables defined
Data types defined
Functions defined
Source code
- TODO
- #include "defs.h"
- #include "gdb_obstack.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 <ctype.h>
- static const char GO_MAIN_MAIN[] = "main.main";
- const char *
- go_main_name (void)
- {
- struct bound_minimal_symbol msym;
- msym = lookup_minimal_symbol (GO_MAIN_MAIN, NULL, NULL);
- if (msym.minsym != NULL)
- return GO_MAIN_MAIN;
-
- return NULL;
- }
- static int
- gccgo_string_p (struct type *type)
- {
-
- if (TYPE_NFIELDS (type) == 2)
- {
- struct type *type0 = TYPE_FIELD_TYPE (type, 0);
- struct type *type1 = TYPE_FIELD_TYPE (type, 1);
- CHECK_TYPEDEF (type0);
- CHECK_TYPEDEF (type1);
- if (TYPE_CODE (type0) == TYPE_CODE_PTR
- && strcmp (TYPE_FIELD_NAME (type, 0), "__data") == 0
- && TYPE_CODE (type1) == TYPE_CODE_INT
- && strcmp (TYPE_FIELD_NAME (type, 1), "__length") == 0)
- {
- struct type *target_type = TYPE_TARGET_TYPE (type0);
- CHECK_TYPEDEF (target_type);
- if (TYPE_CODE (target_type) == TYPE_CODE_INT
- && TYPE_LENGTH (target_type) == 1
- && strcmp (TYPE_NAME (target_type), "uint8") == 0)
- return 1;
- }
- }
- return 0;
- }
- 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)
- return 1;
- return 0;
- }
- enum go_type
- go_classify_struct_type (struct type *type)
- {
- CHECK_TYPEDEF (type);
-
- if (gccgo_string_p (type)
- || sixg_string_p (type))
- return GO_TYPE_STRING;
- return GO_TYPE_NONE;
- }
- static void
- unpack_package_and_object (char *buf,
- const char **packagep, const char **objectp)
- {
- char *last_dot;
- last_dot = strrchr (buf, '.');
- gdb_assert (last_dot != NULL);
- *objectp = last_dot + 1;
- *last_dot = '\0';
- last_dot = strrchr (buf, '.');
- if (last_dot != NULL)
- *packagep = last_dot + 1;
- else
- *packagep = buf;
- }
- static char *
- unpack_mangled_go_symbol (const char *mangled_name,
- const char **packagep,
- const char **objectp,
- const char **method_type_packagep,
- const char **method_type_objectp,
- int *method_type_is_pointerp)
- {
- char *buf;
- char *p;
- int len = strlen (mangled_name);
-
- char *saw_digit;
-
- char *method_type;
-
- char *first_dot;
-
- char *last_dot;
-
- int saw_pointer;
- *packagep = *objectp = NULL;
- *method_type_packagep = *method_type_objectp = NULL;
- *method_type_is_pointerp = 0;
-
- if (strcmp (mangled_name, "__go_init_main") == 0)
- {
- char *package = xstrdup ("main");
- *packagep = package;
- *objectp = "init";
- return package;
- }
-
- if (strcmp (mangled_name, "main.main") == 0)
- {
- char *package = xstrdup ("main");
- *packagep = package;
- *objectp = "main";
- return package;
- }
-
- if (strncmp (mangled_name, "go.", 3) != 0
- && strncmp (mangled_name, "libgo_", 6) != 0)
- return NULL;
-
-
- if (strchr (mangled_name, '@') != NULL)
- return NULL;
-
- first_dot = strchr (mangled_name, '.');
- if (first_dot == NULL)
- return NULL;
-
- last_dot = strrchr (mangled_name, '.');
- if (last_dot == first_dot)
- return NULL;
-
- if (last_dot[1] == '\0'
- || last_dot[-1] == '.')
- return NULL;
-
- buf = xstrdup (mangled_name);
-
- p = buf + len;
- saw_digit = method_type = NULL;
- saw_pointer = 0;
- while (p > buf)
- {
- int current = *(const unsigned char *) --p;
- int current_is_digit = isdigit (current);
- if (saw_digit)
- {
- if (current_is_digit)
- continue;
- if (current == 'N'
- && ((p > buf && p[-1] == '.')
- || (p > buf + 1 && p[-1] == 'p' && p[-2] == '.')))
- {
- if (atoi (p + 1) == strlen (saw_digit + 2))
- {
- if (p[-1] == '.')
- method_type = p - 1;
- else
- {
- gdb_assert (p[-1] == 'p');
- saw_pointer = 1;
- method_type = p - 2;
- }
- break;
- }
- }
-
- saw_digit = NULL;
- saw_pointer = 0;
- continue;
- }
- if (current_is_digit && p[1] == '_')
- {
-
- saw_digit = p;
- continue;
- }
- }
- if (method_type != NULL
-
- && (method_type > buf && method_type[-1] != '.'))
- {
- unpack_package_and_object (saw_digit + 2,
- method_type_packagep, method_type_objectp);
- *method_type = '\0';
- *method_type_is_pointerp = saw_pointer;
- }
- unpack_package_and_object (buf, packagep, objectp);
- return buf;
- }
- char *
- go_demangle (const char *mangled_name, int options)
- {
- struct obstack tempbuf;
- char *result;
- char *name_buf;
- const char *package_name;
- const char *object_name;
- const char *method_type_package_name;
- const char *method_type_object_name;
- int method_type_is_pointer;
- if (mangled_name == NULL)
- return NULL;
- name_buf = unpack_mangled_go_symbol (mangled_name,
- &package_name, &object_name,
- &method_type_package_name,
- &method_type_object_name,
- &method_type_is_pointer);
- if (name_buf == NULL)
- return NULL;
- obstack_init (&tempbuf);
-
- if (method_type_package_name != NULL)
- {
- FIXME
- if (method_type_is_pointer)
- obstack_grow_str (&tempbuf, "(*");
- obstack_grow_str (&tempbuf, method_type_package_name);
- obstack_grow_str (&tempbuf, ".");
- obstack_grow_str (&tempbuf, method_type_object_name);
- if (method_type_is_pointer)
- obstack_grow_str (&tempbuf, ")");
- obstack_grow_str (&tempbuf, ".");
- obstack_grow_str (&tempbuf, object_name);
- }
- else
- {
- obstack_grow_str (&tempbuf, package_name);
- obstack_grow_str (&tempbuf, ".");
- obstack_grow_str (&tempbuf, object_name);
- }
- obstack_grow_str0 (&tempbuf, "");
- result = xstrdup (obstack_finish (&tempbuf));
- obstack_free (&tempbuf, NULL);
- xfree (name_buf);
- return result;
- }
- char *
- go_symbol_package_name (const struct symbol *sym)
- {
- const char *mangled_name = SYMBOL_LINKAGE_NAME (sym);
- const char *package_name;
- const char *object_name;
- const char *method_type_package_name;
- const char *method_type_object_name;
- int method_type_is_pointer;
- char *name_buf;
- char *result;
- gdb_assert (SYMBOL_LANGUAGE (sym) == language_go);
- name_buf = unpack_mangled_go_symbol (mangled_name,
- &package_name, &object_name,
- &method_type_package_name,
- &method_type_object_name,
- &method_type_is_pointer);
-
- if (name_buf == NULL)
- return NULL;
- result = xstrdup (package_name);
- xfree (name_buf);
- return result;
- }
- char *
- go_block_package_name (const struct block *block)
- {
- while (block != NULL)
- {
- struct symbol *function = BLOCK_FUNCTION (block);
- if (function != NULL)
- {
- char *package_name = go_symbol_package_name (function);
- if (package_name != NULL)
- return package_name;
-
- return NULL;
- }
- block = BLOCK_SUPERBLOCK (block);
- }
- return NULL;
- }
- TODO
- static const struct op_print go_op_print_tab[] =
- {
- {",", BINOP_COMMA, PREC_COMMA, 0},
- {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
- {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
- {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
- {"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
- {"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
- {"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
- {"==", BINOP_EQUAL, PREC_EQUAL, 0},
- {"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
- {"<=", BINOP_LEQ, PREC_ORDER, 0},
- {">=", BINOP_GEQ, PREC_ORDER, 0},
- {">", BINOP_GTR, PREC_ORDER, 0},
- {"<", BINOP_LESS, PREC_ORDER, 0},
- {">>", BINOP_RSH, PREC_SHIFT, 0},
- {"<<", BINOP_LSH, PREC_SHIFT, 0},
- {"+", BINOP_ADD, PREC_ADD, 0},
- {"-", BINOP_SUB, PREC_ADD, 0},
- {"*", BINOP_MUL, PREC_MUL, 0},
- {"/", BINOP_DIV, PREC_MUL, 0},
- {"%", BINOP_REM, PREC_MUL, 0},
- {"@", BINOP_REPEAT, PREC_REPEAT, 0},
- {"-", UNOP_NEG, PREC_PREFIX, 0},
- {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
- {"^", UNOP_COMPLEMENT, PREC_PREFIX, 0},
- {"*", UNOP_IND, PREC_PREFIX, 0},
- {"&", UNOP_ADDR, PREC_PREFIX, 0},
- {"unsafe.Sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
- {"++", UNOP_POSTINCREMENT, PREC_SUFFIX, 0},
- {"--", UNOP_POSTDECREMENT, PREC_SUFFIX, 0},
- {NULL, 0, 0, 0}
- };
- enum go_primitive_types {
- go_primitive_type_void,
- go_primitive_type_char,
- go_primitive_type_bool,
- go_primitive_type_int,
- go_primitive_type_uint,
- go_primitive_type_uintptr,
- go_primitive_type_int8,
- go_primitive_type_int16,
- go_primitive_type_int32,
- go_primitive_type_int64,
- go_primitive_type_uint8,
- go_primitive_type_uint16,
- go_primitive_type_uint32,
- go_primitive_type_uint64,
- go_primitive_type_float32,
- go_primitive_type_float64,
- go_primitive_type_complex64,
- go_primitive_type_complex128,
- nr_go_primitive_types
- };
- static void
- go_language_arch_info (struct gdbarch *gdbarch,
- struct language_arch_info *lai)
- {
- const struct builtin_go_type *builtin = builtin_go_type (gdbarch);
- lai->string_char_type = builtin->builtin_char;
- lai->primitive_type_vector
- = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_go_primitive_types + 1,
- struct type *);
- lai->primitive_type_vector [go_primitive_type_void]
- = builtin->builtin_void;
- lai->primitive_type_vector [go_primitive_type_char]
- = builtin->builtin_char;
- lai->primitive_type_vector [go_primitive_type_bool]
- = builtin->builtin_bool;
- lai->primitive_type_vector [go_primitive_type_int]
- = builtin->builtin_int;
- lai->primitive_type_vector [go_primitive_type_uint]
- = builtin->builtin_uint;
- lai->primitive_type_vector [go_primitive_type_uintptr]
- = builtin->builtin_uintptr;
- lai->primitive_type_vector [go_primitive_type_int8]
- = builtin->builtin_int8;
- lai->primitive_type_vector [go_primitive_type_int16]
- = builtin->builtin_int16;
- lai->primitive_type_vector [go_primitive_type_int32]
- = builtin->builtin_int32;
- lai->primitive_type_vector [go_primitive_type_int64]
- = builtin->builtin_int64;
- lai->primitive_type_vector [go_primitive_type_uint8]
- = builtin->builtin_uint8;
- lai->primitive_type_vector [go_primitive_type_uint16]
- = builtin->builtin_uint16;
- lai->primitive_type_vector [go_primitive_type_uint32]
- = builtin->builtin_uint32;
- lai->primitive_type_vector [go_primitive_type_uint64]
- = builtin->builtin_uint64;
- lai->primitive_type_vector [go_primitive_type_float32]
- = builtin->builtin_float32;
- lai->primitive_type_vector [go_primitive_type_float64]
- = builtin->builtin_float64;
- lai->primitive_type_vector [go_primitive_type_complex64]
- = builtin->builtin_complex64;
- lai->primitive_type_vector [go_primitive_type_complex128]
- = builtin->builtin_complex128;
- lai->bool_type_symbol = "bool";
- lai->bool_type_default = builtin->builtin_bool;
- }
- static const struct language_defn go_language_defn =
- {
- "go",
- "Go",
- language_go,
- range_check_off,
- case_sensitive_on,
- array_row_major,
- macro_expansion_no,
- &exp_descriptor_c,
- go_parse,
- go_error,
- null_post_parser,
- c_printchar,
- c_printstr,
- c_emit_char,
- go_print_type,
- c_print_typedef,
- go_val_print,
- c_value_print,
- default_read_var_value,
- NULL,
- NULL,
- basic_lookup_symbol_nonlocal,
- basic_lookup_transparent_type,
- go_demangle,
- NULL,
- go_op_print_tab,
- 1,
- 0,
- default_word_break_characters,
- default_make_symbol_completion_list,
- go_language_arch_info,
- default_print_array_index,
- default_pass_by_reference,
- c_get_string,
- NULL,
- iterate_over_symbols,
- &default_varobj_ops,
- NULL,
- NULL,
- LANG_MAGIC
- };
- static void *
- build_go_types (struct gdbarch *gdbarch)
- {
- struct builtin_go_type *builtin_go_type
- = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_go_type);
- builtin_go_type->builtin_void
- = arch_type (gdbarch, TYPE_CODE_VOID, 1, "void");
- builtin_go_type->builtin_char
- = arch_character_type (gdbarch, 8, 1, "char");
- builtin_go_type->builtin_bool
- = arch_boolean_type (gdbarch, 8, 0, "bool");
- builtin_go_type->builtin_int
- = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), 0, "int");
- builtin_go_type->builtin_uint
- = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), 1, "uint");
- builtin_go_type->builtin_uintptr
- = arch_integer_type (gdbarch, gdbarch_ptr_bit (gdbarch), 1, "uintptr");
- builtin_go_type->builtin_int8
- = arch_integer_type (gdbarch, 8, 0, "int8");
- builtin_go_type->builtin_int16
- = arch_integer_type (gdbarch, 16, 0, "int16");
- builtin_go_type->builtin_int32
- = arch_integer_type (gdbarch, 32, 0, "int32");
- builtin_go_type->builtin_int64
- = arch_integer_type (gdbarch, 64, 0, "int64");
- builtin_go_type->builtin_uint8
- = arch_integer_type (gdbarch, 8, 1, "uint8");
- builtin_go_type->builtin_uint16
- = arch_integer_type (gdbarch, 16, 1, "uint16");
- builtin_go_type->builtin_uint32
- = arch_integer_type (gdbarch, 32, 1, "uint32");
- builtin_go_type->builtin_uint64
- = arch_integer_type (gdbarch, 64, 1, "uint64");
- builtin_go_type->builtin_float32
- = arch_float_type (gdbarch, 32, "float32", NULL);
- builtin_go_type->builtin_float64
- = arch_float_type (gdbarch, 64, "float64", NULL);
- builtin_go_type->builtin_complex64
- = arch_complex_type (gdbarch, "complex64",
- builtin_go_type->builtin_float32);
- builtin_go_type->builtin_complex128
- = arch_complex_type (gdbarch, "complex128",
- builtin_go_type->builtin_float64);
- return builtin_go_type;
- }
- 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);
- }
- 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);
- }