diff options
author | Doug Evans <dje@google.com> | 2012-04-25 14:07:23 +0000 |
---|---|---|
committer | Doug Evans <dje@google.com> | 2012-04-25 14:07:23 +0000 |
commit | a766d390bb857383a5f9ae80a102e1f8705f4c2e (patch) | |
tree | 056e6d8d57aee5d234d9ed4619a27306dfec3dd7 /gdb/go-valprint.c | |
parent | e65f9ffb8e49431537404712a5b1eed310964cb0 (diff) | |
download | gdb-a766d390bb857383a5f9ae80a102e1f8705f4c2e.zip gdb-a766d390bb857383a5f9ae80a102e1f8705f4c2e.tar.gz gdb-a766d390bb857383a5f9ae80a102e1f8705f4c2e.tar.bz2 |
Initial pass at Go language support.
* NEWS: Mention Go.
* Makefile.in (SFILES): Add go-exp.y, go-lang.c, go-typeprint.c,
go-valprint.c.
(COMMON_OBS): Add go-lang.o, go-val.print.o, go-typeprint.o.
(YYFILES): Add go-exp.c.
(YYOBJ): Add go-exp.o.
(local-maintainer-clean): Delete go-exp.c.
* defs.h (enum language): Add language_go.
* dwarf2read.c: #include "go-lang.h".
(fixup_go_packaging): New function.
(process_full_comp_unit): Call it when processing Go CUs.
(dwarf2_physname): Add Go support.
(read_file_scope): Handle missing language spec for GNU Go.
(set_cu_language): Handle DW_LANG_Go.
* go-exp.y: New file.
* go-lang.h: New file.
* go-lang.c: New file.
* go-typeprint.c: New file.
* go-valprint.c: New file.
* symtab.c: #include "go-lang.h".
(symbol_set_language): Handle language_go.
(symbol_find_demangled_name, symbol_set_names): Ditto.
(symbol_natural_name, demangle_for_lookup, find_main_name): Ditto.
testsuite/
* configure.ac: Create gdb.go/Makefile.
* configure: Regenerate.
* gdb.base/default.exp: Add "go" to "set language" testing.
* gdb.go/Makefile.in: New file.
* gdb.go/basic-types.exp: New file.
* gdb.go/chan.exp: New file.
* gdb.go/chan.go: New file.
* gdb.go/handcall.exp: New file.
* gdb.go/handcall.go: New file.
* gdb.go/hello.exp: New file.
* gdb.go/hello.go: New file.
* gdb.go/integers.exp: New file.
* gdb.go/integers.go: New file.
* gdb.go/methods.exp: New file.
* gdb.go/methods.go: New file.
* gdb.go/package.exp: New file.
* gdb.go/package1.go: New file.
* gdb.go/package2.go: New file.
* gdb.go/print.exp: New file.
* gdb.go/strings.exp: New file.
* gdb.go/strings.go: New file.
* gdb.go/types.exp: New file.
* gdb.go/types.go: New file.
* gdb.go/unsafe.exp: New file.
* gdb.go/unsafe.go: New file.
* lib/future.exp: Add Go support.
(gdb_find_go, gdb_find_go_linker): New procs.
(gdb_default_target_compile): Add Go support.
* lib/gdb.exp (skip_go_tests): New proc.
* lib/go.exp: New file.
doc/
* gdb.texinfo (Supported Languages): Add Go.
(Go): New node.
Diffstat (limited to 'gdb/go-valprint.c')
-rw-r--r-- | gdb/go-valprint.c | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/gdb/go-valprint.c b/gdb/go-valprint.c new file mode 100644 index 0000000..3be4927 --- /dev/null +++ b/gdb/go-valprint.c @@ -0,0 +1,120 @@ +/* Support for printing Go values for GDB, the GNU debugger. + + Copyright (C) 2012 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/>. + + NOTE: This currently only provides special support for printing gccgo + strings. 6g objects are handled in Python. + The remaining gccgo types may also be handled in Python. + Strings are handled specially here, at least for now, in case the Python + support is unavailable. */ + +#include "defs.h" +#include "gdbtypes.h" +#include "gdbcore.h" +#include "go-lang.h" +#include "c-lang.h" +#include "valprint.h" + +/* Print a Go string. + + Note: We assume + gdb_assert (go_classify_struct_type (type) == GO_TYPE_STRING). */ + +static void +print_go_string (struct type *type, const gdb_byte *valaddr, + int embedded_offset, CORE_ADDR address, + struct ui_file *stream, int recurse, + const struct value *val, + const struct value_print_options *options) +{ + struct gdbarch *gdbarch = get_type_arch (type); + struct type *elt_ptr_type = TYPE_FIELD_TYPE (type, 0); + struct type *elt_type = TYPE_TARGET_TYPE (elt_ptr_type); + LONGEST length; + /* TODO(dje): The encapsulation of what a pointer is belongs in value.c. + I.e. If there's going to be unpack_pointer, there should be + unpack_value_field_as_pointer. Do this until we can get + unpack_value_field_as_pointer. */ + LONGEST addr; + + gdb_assert (valaddr == value_contents_for_printing_const (val)); + + if (! unpack_value_field_as_long (type, valaddr, embedded_offset, 0, + val, &addr)) + error (_("Unable to read string address")); + + if (! unpack_value_field_as_long (type, valaddr, embedded_offset, 1, + val, &length)) + error (_("Unable to read string length")); + + /* TODO(dje): Print address of struct or actual string? */ + if (options->addressprint) + fputs_filtered (paddress (gdbarch, addr), stream); + + if (length < 0) + { + fputs_filtered (_("<invalid length: "), stream); + fputs_filtered (plongest (addr), stream); + fputs_filtered (">", stream); + return; + } + + /* TODO(dje): Perhaps we should pass "UTF8" for ENCODING. + The target encoding is a global switch. + Either choice is problematic. */ + val_print_string (elt_type, NULL, addr, length, stream, options); +} + +/* Implements the la_val_print routine for language Go. */ + +void +go_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, + CORE_ADDR address, struct ui_file *stream, int recurse, + const struct value *val, + const struct value_print_options *options) +{ + CHECK_TYPEDEF (type); + + switch (TYPE_CODE (type)) + { + case TYPE_CODE_STRUCT: + { + enum go_type go_type = go_classify_struct_type (type); + + switch (go_type) + { + case GO_TYPE_STRING: + if (! options->raw) + { + print_go_string (type, valaddr, embedded_offset, address, + stream, recurse, val, options); + return; + } + break; + default: + break; + } + } + /* Fall through. */ + + default: + c_val_print (type, valaddr, embedded_offset, address, stream, + recurse, val, options); + break; + } +} |