Home | History | Annotate | Line # | Download | only in gdb
go-lang.c revision 1.8
      1 /* Go language support routines for GDB, the GNU debugger.
      2 
      3    Copyright (C) 2012-2019 Free Software Foundation, Inc.
      4 
      5    This file is part of GDB.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19 
     20 /* TODO:
     21    - split stacks
     22    - printing of native types
     23    - goroutines
     24    - lots more
     25    - gccgo mangling needs redoing
     26      It's too hard, for example, to know whether one is looking at a mangled
     27      Go symbol or not, and their are ambiguities, e.g., the demangler may
     28      get passed *any* symbol, including symbols from other languages
     29      and including symbols that are already demangled.
     30      One thought is to at least add an _G prefix.
     31    - 6g mangling isn't supported yet
     32 */
     33 
     34 #include "defs.h"
     35 #include "gdb_obstack.h"
     36 #include "block.h"
     37 #include "symtab.h"
     38 #include "language.h"
     39 #include "varobj.h"
     40 #include "go-lang.h"
     41 #include "c-lang.h"
     42 #include "parser-defs.h"
     43 
     44 #include <ctype.h>
     45 
     46 /* The main function in the main package.  */
     47 static const char GO_MAIN_MAIN[] = "main.main";
     48 
     49 /* Function returning the special symbol name used by Go for the main
     50    procedure in the main program if it is found in minimal symbol list.
     51    This function tries to find minimal symbols so that it finds them even
     52    if the program was compiled without debugging information.  */
     53 
     54 const char *
     55 go_main_name (void)
     56 {
     57   struct bound_minimal_symbol msym;
     58 
     59   msym = lookup_minimal_symbol (GO_MAIN_MAIN, NULL, NULL);
     60   if (msym.minsym != NULL)
     61     return GO_MAIN_MAIN;
     62 
     63   /* No known entry procedure found, the main program is probably not Go.  */
     64   return NULL;
     65 }
     66 
     67 /* Return non-zero if TYPE is a gccgo string.
     68    We assume CHECK_TYPEDEF has already been done.  */
     69 
     70 static int
     71 gccgo_string_p (struct type *type)
     72 {
     73   /* gccgo strings don't necessarily have a name we can use.  */
     74 
     75   if (TYPE_NFIELDS (type) == 2)
     76     {
     77       struct type *type0 = TYPE_FIELD_TYPE (type, 0);
     78       struct type *type1 = TYPE_FIELD_TYPE (type, 1);
     79 
     80       type0 = check_typedef (type0);
     81       type1 = check_typedef (type1);
     82 
     83       if (TYPE_CODE (type0) == TYPE_CODE_PTR
     84 	  && strcmp (TYPE_FIELD_NAME (type, 0), "__data") == 0
     85 	  && TYPE_CODE (type1) == TYPE_CODE_INT
     86 	  && strcmp (TYPE_FIELD_NAME (type, 1), "__length") == 0)
     87 	{
     88 	  struct type *target_type = TYPE_TARGET_TYPE (type0);
     89 
     90 	  target_type = check_typedef (target_type);
     91 
     92 	  if (TYPE_CODE (target_type) == TYPE_CODE_INT
     93 	      && TYPE_LENGTH (target_type) == 1
     94 	      && strcmp (TYPE_NAME (target_type), "uint8") == 0)
     95 	    return 1;
     96 	}
     97     }
     98 
     99   return 0;
    100 }
    101 
    102 /* Return non-zero if TYPE is a 6g string.
    103    We assume CHECK_TYPEDEF has already been done.  */
    104 
    105 static int
    106 sixg_string_p (struct type *type)
    107 {
    108   if (TYPE_NFIELDS (type) == 2
    109       && TYPE_NAME (type) != NULL
    110       && strcmp (TYPE_NAME (type), "string") == 0)
    111     return 1;
    112 
    113   return 0;
    114 }
    115 
    116 /* Classify the kind of Go object that TYPE is.
    117    TYPE is a TYPE_CODE_STRUCT, used to represent a Go object.  */
    118 
    119 enum go_type
    120 go_classify_struct_type (struct type *type)
    121 {
    122   type = check_typedef (type);
    123 
    124   /* Recognize strings as they're useful to be able to print without
    125      pretty-printers.  */
    126   if (gccgo_string_p (type)
    127       || sixg_string_p (type))
    128     return GO_TYPE_STRING;
    129 
    130   return GO_TYPE_NONE;
    131 }
    132 
    133 /* Subroutine of unpack_mangled_go_symbol to simplify it.
    134    Given "[foo.]bar.baz", store "bar" in *PACKAGEP and "baz" in *OBJECTP.
    135    We stomp on the last '.' to nul-terminate "bar".
    136    The caller is responsible for memory management.  */
    137 
    138 static void
    139 unpack_package_and_object (char *buf,
    140 			   const char **packagep, const char **objectp)
    141 {
    142   char *last_dot;
    143 
    144   last_dot = strrchr (buf, '.');
    145   gdb_assert (last_dot != NULL);
    146   *objectp = last_dot + 1;
    147   *last_dot = '\0';
    148   last_dot = strrchr (buf, '.');
    149   if (last_dot != NULL)
    150     *packagep = last_dot + 1;
    151   else
    152     *packagep = buf;
    153 }
    154 
    155 /* Given a mangled Go symbol, find its package name, object name, and
    156    method type (if present).
    157    E.g., for "libgo_net.textproto.String.N33_libgo_net.textproto.ProtocolError"
    158    *PACKAGEP = "textproto"
    159    *OBJECTP = "String"
    160    *METHOD_TYPE_PACKAGEP = "textproto"
    161    *METHOD_TYPE_OBJECTP = "ProtocolError"
    162 
    163    Space for the resulting strings is malloc'd in one buffer.
    164    PACKAGEP,OBJECTP,METHOD_TYPE* will (typically) point into this buffer.
    165    [There are a few exceptions, but the caller is still responsible for
    166    freeing the resulting pointer.]
    167    A pointer to this buffer is returned, or NULL if symbol isn't a
    168    mangled Go symbol.
    169    The caller is responsible for freeing the result.
    170 
    171    *METHOD_TYPE_IS_POINTERP is set to a boolean indicating if
    172    the method type is a pointer.
    173 
    174    There may be value in returning the outer container,
    175    i.e., "net" in the above example, but for now it's not needed.
    176    Plus it's currently not straightforward to compute,
    177    it comes from -fgo-prefix, and there's no algorithm to compute it.
    178 
    179    If we ever need to unpack the method type, this routine should work
    180    for that too.  */
    181 
    182 static char *
    183 unpack_mangled_go_symbol (const char *mangled_name,
    184 			  const char **packagep,
    185 			  const char **objectp,
    186 			  const char **method_type_packagep,
    187 			  const char **method_type_objectp,
    188 			  int *method_type_is_pointerp)
    189 {
    190   char *buf;
    191   char *p;
    192   int len = strlen (mangled_name);
    193   /* Pointer to last digit in "N<digit(s)>_".  */
    194   char *saw_digit;
    195   /* Pointer to "N" if valid "N<digit(s)>_" found.  */
    196   char *method_type;
    197   /* Pointer to the first '.'.  */
    198   const char *first_dot;
    199   /* Pointer to the last '.'.  */
    200   const char *last_dot;
    201   /* Non-zero if we saw a pointer indicator.  */
    202   int saw_pointer;
    203 
    204   *packagep = *objectp = NULL;
    205   *method_type_packagep = *method_type_objectp = NULL;
    206   *method_type_is_pointerp = 0;
    207 
    208   /* main.init is mangled specially.  */
    209   if (strcmp (mangled_name, "__go_init_main") == 0)
    210     {
    211       char *package = xstrdup ("main");
    212 
    213       *packagep = package;
    214       *objectp = "init";
    215       return package;
    216     }
    217 
    218   /* main.main is mangled specially (missing prefix).  */
    219   if (strcmp (mangled_name, "main.main") == 0)
    220     {
    221       char *package = xstrdup ("main");
    222 
    223       *packagep = package;
    224       *objectp = "main";
    225       return package;
    226     }
    227 
    228   /* We may get passed, e.g., "main.T.Foo", which is *not* mangled.
    229      Alas it looks exactly like "prefix.package.object."
    230      To cope for now we only recognize the following prefixes:
    231 
    232      go: the default
    233      libgo_.*: used by gccgo's runtime
    234 
    235      Thus we don't support -fgo-prefix (except as used by the runtime).  */
    236   if (!startswith (mangled_name, "go.")
    237       && !startswith (mangled_name, "libgo_"))
    238     return NULL;
    239 
    240   /* Quick check for whether a search may be fruitful.  */
    241   /* Ignore anything with @plt, etc. in it.  */
    242   if (strchr (mangled_name, '@') != NULL)
    243     return NULL;
    244   /* It must have at least two dots.  */
    245   first_dot = strchr (mangled_name, '.');
    246   if (first_dot == NULL)
    247     return NULL;
    248   /* Treat "foo.bar" as unmangled.  It can collide with lots of other
    249      languages and it's not clear what the consequences are.
    250      And except for main.main, all gccgo symbols are at least
    251      prefix.package.object.  */
    252   last_dot = strrchr (mangled_name, '.');
    253   if (last_dot == first_dot)
    254     return NULL;
    255 
    256   /* More quick checks.  */
    257   if (last_dot[1] == '\0' /* foo. */
    258       || last_dot[-1] == '.') /* foo..bar */
    259     return NULL;
    260 
    261   /* At this point we've decided we have a mangled Go symbol.  */
    262 
    263   buf = xstrdup (mangled_name);
    264 
    265   /* Search backwards looking for "N<digit(s)>".  */
    266   p = buf + len;
    267   saw_digit = method_type = NULL;
    268   saw_pointer = 0;
    269   while (p > buf)
    270     {
    271       int current = *(const unsigned char *) --p;
    272       int current_is_digit = isdigit (current);
    273 
    274       if (saw_digit)
    275 	{
    276 	  if (current_is_digit)
    277 	    continue;
    278 	  if (current == 'N'
    279 	      && ((p > buf && p[-1] == '.')
    280 		  || (p > buf + 1 && p[-1] == 'p' && p[-2] == '.')))
    281 	    {
    282 	      if (atoi (p + 1) == strlen (saw_digit + 2))
    283 		{
    284 		  if (p[-1] == '.')
    285 		    method_type = p - 1;
    286 		  else
    287 		    {
    288 		      gdb_assert (p[-1] == 'p');
    289 		      saw_pointer = 1;
    290 		      method_type = p - 2;
    291 		    }
    292 		  break;
    293 		}
    294 	    }
    295 	  /* Not what we're looking for, reset and keep looking.  */
    296 	  saw_digit = NULL;
    297 	  saw_pointer = 0;
    298 	  continue;
    299 	}
    300       if (current_is_digit && p[1] == '_')
    301 	{
    302 	  /* Possible start of method "this" [sic] type.  */
    303 	  saw_digit = p;
    304 	  continue;
    305 	}
    306     }
    307 
    308   if (method_type != NULL
    309       /* Ensure not something like "..foo".  */
    310       && (method_type > buf && method_type[-1] != '.'))
    311     {
    312       unpack_package_and_object (saw_digit + 2,
    313 				 method_type_packagep, method_type_objectp);
    314       *method_type = '\0';
    315       *method_type_is_pointerp = saw_pointer;
    316     }
    317 
    318   unpack_package_and_object (buf, packagep, objectp);
    319   return buf;
    320 }
    321 
    322 /* Implements the la_demangle language_defn routine for language Go.
    323 
    324    N.B. This may get passed *any* symbol, including symbols from other
    325    languages and including symbols that are already demangled.
    326    Both of these situations are kinda unfortunate, but that's how things
    327    are today.
    328 
    329    N.B. This currently only supports gccgo's mangling.
    330 
    331    N.B. gccgo's mangling needs, I think, changing.
    332    This demangler can't work in all situations,
    333    thus not too much effort is currently put into it.  */
    334 
    335 char *
    336 go_demangle (const char *mangled_name, int options)
    337 {
    338   struct obstack tempbuf;
    339   char *result;
    340   char *name_buf;
    341   const char *package_name;
    342   const char *object_name;
    343   const char *method_type_package_name;
    344   const char *method_type_object_name;
    345   int method_type_is_pointer;
    346 
    347   if (mangled_name == NULL)
    348     return NULL;
    349 
    350   name_buf = unpack_mangled_go_symbol (mangled_name,
    351 				       &package_name, &object_name,
    352 				       &method_type_package_name,
    353 				       &method_type_object_name,
    354 				       &method_type_is_pointer);
    355   if (name_buf == NULL)
    356     return NULL;
    357 
    358   obstack_init (&tempbuf);
    359 
    360   /* Print methods as they appear in "method expressions".  */
    361   if (method_type_package_name != NULL)
    362     {
    363       /* FIXME: Seems like we should include package_name here somewhere.  */
    364       if (method_type_is_pointer)
    365 	  obstack_grow_str (&tempbuf, "(*");
    366       obstack_grow_str (&tempbuf, method_type_package_name);
    367       obstack_grow_str (&tempbuf, ".");
    368       obstack_grow_str (&tempbuf, method_type_object_name);
    369       if (method_type_is_pointer)
    370 	obstack_grow_str (&tempbuf, ")");
    371       obstack_grow_str (&tempbuf, ".");
    372       obstack_grow_str (&tempbuf, object_name);
    373     }
    374   else
    375     {
    376       obstack_grow_str (&tempbuf, package_name);
    377       obstack_grow_str (&tempbuf, ".");
    378       obstack_grow_str (&tempbuf, object_name);
    379     }
    380   obstack_grow_str0 (&tempbuf, "");
    381 
    382   result = xstrdup ((const char *) obstack_finish (&tempbuf));
    383   obstack_free (&tempbuf, NULL);
    384   xfree (name_buf);
    385   return result;
    386 }
    387 
    388 /* la_sniff_from_mangled_name for Go.  */
    389 
    390 static int
    391 go_sniff_from_mangled_name (const char *mangled, char **demangled)
    392 {
    393   *demangled = go_demangle (mangled, 0);
    394   return *demangled != NULL;
    395 }
    396 
    397 /* Given a Go symbol, return its package or NULL if unknown.
    398    Space for the result is malloc'd, caller must free.  */
    399 
    400 char *
    401 go_symbol_package_name (const struct symbol *sym)
    402 {
    403   const char *mangled_name = SYMBOL_LINKAGE_NAME (sym);
    404   const char *package_name;
    405   const char *object_name;
    406   const char *method_type_package_name;
    407   const char *method_type_object_name;
    408   int method_type_is_pointer;
    409   char *name_buf;
    410   char *result;
    411 
    412   gdb_assert (SYMBOL_LANGUAGE (sym) == language_go);
    413   name_buf = unpack_mangled_go_symbol (mangled_name,
    414 				       &package_name, &object_name,
    415 				       &method_type_package_name,
    416 				       &method_type_object_name,
    417 				       &method_type_is_pointer);
    418   /* Some Go symbols don't have mangled form we interpret (yet).  */
    419   if (name_buf == NULL)
    420     return NULL;
    421   result = xstrdup (package_name);
    422   xfree (name_buf);
    423   return result;
    424 }
    425 
    426 /* Return the package that BLOCK is in, or NULL if there isn't one.
    427    Space for the result is malloc'd, caller must free.  */
    428 
    429 char *
    430 go_block_package_name (const struct block *block)
    431 {
    432   while (block != NULL)
    433     {
    434       struct symbol *function = BLOCK_FUNCTION (block);
    435 
    436       if (function != NULL)
    437 	{
    438 	  char *package_name = go_symbol_package_name (function);
    439 
    440 	  if (package_name != NULL)
    441 	    return package_name;
    442 
    443 	  /* Stop looking if we find a function without a package name.
    444 	     We're most likely outside of Go and thus the concept of the
    445 	     "current" package is gone.  */
    446 	  return NULL;
    447 	}
    448 
    449       block = BLOCK_SUPERBLOCK (block);
    450     }
    451 
    452   return NULL;
    453 }
    454 
    455 /* Table mapping opcodes into strings for printing operators
    456    and precedences of the operators.
    457    TODO(dje): &^ ?  */
    458 
    459 static const struct op_print go_op_print_tab[] =
    460 {
    461   {",", BINOP_COMMA, PREC_COMMA, 0},
    462   {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
    463   {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
    464   {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
    465   {"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
    466   {"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
    467   {"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
    468   {"==", BINOP_EQUAL, PREC_EQUAL, 0},
    469   {"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
    470   {"<=", BINOP_LEQ, PREC_ORDER, 0},
    471   {">=", BINOP_GEQ, PREC_ORDER, 0},
    472   {">", BINOP_GTR, PREC_ORDER, 0},
    473   {"<", BINOP_LESS, PREC_ORDER, 0},
    474   {">>", BINOP_RSH, PREC_SHIFT, 0},
    475   {"<<", BINOP_LSH, PREC_SHIFT, 0},
    476   {"+", BINOP_ADD, PREC_ADD, 0},
    477   {"-", BINOP_SUB, PREC_ADD, 0},
    478   {"*", BINOP_MUL, PREC_MUL, 0},
    479   {"/", BINOP_DIV, PREC_MUL, 0},
    480   {"%", BINOP_REM, PREC_MUL, 0},
    481   {"@", BINOP_REPEAT, PREC_REPEAT, 0},
    482   {"-", UNOP_NEG, PREC_PREFIX, 0},
    483   {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
    484   {"^", UNOP_COMPLEMENT, PREC_PREFIX, 0},
    485   {"*", UNOP_IND, PREC_PREFIX, 0},
    486   {"&", UNOP_ADDR, PREC_PREFIX, 0},
    487   {"unsafe.Sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
    488   {"++", UNOP_POSTINCREMENT, PREC_SUFFIX, 0},
    489   {"--", UNOP_POSTDECREMENT, PREC_SUFFIX, 0},
    490   {NULL, OP_NULL, PREC_SUFFIX, 0}
    491 };
    492 
    493 enum go_primitive_types {
    494   go_primitive_type_void,
    495   go_primitive_type_char,
    496   go_primitive_type_bool,
    497   go_primitive_type_int,
    498   go_primitive_type_uint,
    499   go_primitive_type_uintptr,
    500   go_primitive_type_int8,
    501   go_primitive_type_int16,
    502   go_primitive_type_int32,
    503   go_primitive_type_int64,
    504   go_primitive_type_uint8,
    505   go_primitive_type_uint16,
    506   go_primitive_type_uint32,
    507   go_primitive_type_uint64,
    508   go_primitive_type_float32,
    509   go_primitive_type_float64,
    510   go_primitive_type_complex64,
    511   go_primitive_type_complex128,
    512   nr_go_primitive_types
    513 };
    514 
    515 static void
    516 go_language_arch_info (struct gdbarch *gdbarch,
    517 		       struct language_arch_info *lai)
    518 {
    519   const struct builtin_go_type *builtin = builtin_go_type (gdbarch);
    520 
    521   lai->string_char_type = builtin->builtin_char;
    522 
    523   lai->primitive_type_vector
    524     = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_go_primitive_types + 1,
    525 			      struct type *);
    526 
    527   lai->primitive_type_vector [go_primitive_type_void]
    528     = builtin->builtin_void;
    529   lai->primitive_type_vector [go_primitive_type_char]
    530     = builtin->builtin_char;
    531   lai->primitive_type_vector [go_primitive_type_bool]
    532     = builtin->builtin_bool;
    533   lai->primitive_type_vector [go_primitive_type_int]
    534     = builtin->builtin_int;
    535   lai->primitive_type_vector [go_primitive_type_uint]
    536     = builtin->builtin_uint;
    537   lai->primitive_type_vector [go_primitive_type_uintptr]
    538     = builtin->builtin_uintptr;
    539   lai->primitive_type_vector [go_primitive_type_int8]
    540     = builtin->builtin_int8;
    541   lai->primitive_type_vector [go_primitive_type_int16]
    542     = builtin->builtin_int16;
    543   lai->primitive_type_vector [go_primitive_type_int32]
    544     = builtin->builtin_int32;
    545   lai->primitive_type_vector [go_primitive_type_int64]
    546     = builtin->builtin_int64;
    547   lai->primitive_type_vector [go_primitive_type_uint8]
    548     = builtin->builtin_uint8;
    549   lai->primitive_type_vector [go_primitive_type_uint16]
    550     = builtin->builtin_uint16;
    551   lai->primitive_type_vector [go_primitive_type_uint32]
    552     = builtin->builtin_uint32;
    553   lai->primitive_type_vector [go_primitive_type_uint64]
    554     = builtin->builtin_uint64;
    555   lai->primitive_type_vector [go_primitive_type_float32]
    556     = builtin->builtin_float32;
    557   lai->primitive_type_vector [go_primitive_type_float64]
    558     = builtin->builtin_float64;
    559   lai->primitive_type_vector [go_primitive_type_complex64]
    560     = builtin->builtin_complex64;
    561   lai->primitive_type_vector [go_primitive_type_complex128]
    562     = builtin->builtin_complex128;
    563 
    564   lai->bool_type_symbol = "bool";
    565   lai->bool_type_default = builtin->builtin_bool;
    566 }
    567 
    568 extern const struct language_defn go_language_defn =
    569 {
    570   "go",
    571   "Go",
    572   language_go,
    573   range_check_off,
    574   case_sensitive_on,
    575   array_row_major,
    576   macro_expansion_no,
    577   NULL,
    578   &exp_descriptor_c,
    579   go_parse,
    580   null_post_parser,
    581   c_printchar,			/* Print a character constant.  */
    582   c_printstr,			/* Function to print string constant.  */
    583   c_emit_char,			/* Print a single char.  */
    584   go_print_type,		/* Print a type using appropriate syntax.  */
    585   c_print_typedef,		/* Print a typedef using appropriate
    586 				   syntax.  */
    587   go_val_print,			/* Print a value using appropriate syntax.  */
    588   c_value_print,		/* Print a top-level value.  */
    589   default_read_var_value,	/* la_read_var_value */
    590   NULL,				/* Language specific skip_trampoline.  */
    591   NULL,				/* name_of_this */
    592   false,			/* la_store_sym_names_in_linkage_form_p */
    593   basic_lookup_symbol_nonlocal,
    594   basic_lookup_transparent_type,
    595   go_demangle,			/* Language specific symbol demangler.  */
    596   go_sniff_from_mangled_name,
    597   NULL,				/* Language specific
    598 				   class_name_from_physname.  */
    599   go_op_print_tab,		/* Expression operators for printing.  */
    600   1,				/* C-style arrays.  */
    601   0,				/* String lower bound.  */
    602   default_word_break_characters,
    603   default_collect_symbol_completion_matches,
    604   go_language_arch_info,
    605   default_print_array_index,
    606   default_pass_by_reference,
    607   c_get_string,
    608   c_watch_location_expression,
    609   NULL,				/* la_get_symbol_name_matcher */
    610   iterate_over_symbols,
    611   default_search_name_hash,
    612   &default_varobj_ops,
    613   NULL,
    614   NULL,
    615   LANG_MAGIC
    616 };
    617 
    618 static void *
    619 build_go_types (struct gdbarch *gdbarch)
    620 {
    621   struct builtin_go_type *builtin_go_type
    622     = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_go_type);
    623 
    624   builtin_go_type->builtin_void
    625     = arch_type (gdbarch, TYPE_CODE_VOID, TARGET_CHAR_BIT, "void");
    626   builtin_go_type->builtin_char
    627     = arch_character_type (gdbarch, 8, 1, "char");
    628   builtin_go_type->builtin_bool
    629     = arch_boolean_type (gdbarch, 8, 0, "bool");
    630   builtin_go_type->builtin_int
    631     = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), 0, "int");
    632   builtin_go_type->builtin_uint
    633     = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), 1, "uint");
    634   builtin_go_type->builtin_uintptr
    635     = arch_integer_type (gdbarch, gdbarch_ptr_bit (gdbarch), 1, "uintptr");
    636   builtin_go_type->builtin_int8
    637     = arch_integer_type (gdbarch, 8, 0, "int8");
    638   builtin_go_type->builtin_int16
    639     = arch_integer_type (gdbarch, 16, 0, "int16");
    640   builtin_go_type->builtin_int32
    641     = arch_integer_type (gdbarch, 32, 0, "int32");
    642   builtin_go_type->builtin_int64
    643     = arch_integer_type (gdbarch, 64, 0, "int64");
    644   builtin_go_type->builtin_uint8
    645     = arch_integer_type (gdbarch, 8, 1, "uint8");
    646   builtin_go_type->builtin_uint16
    647     = arch_integer_type (gdbarch, 16, 1, "uint16");
    648   builtin_go_type->builtin_uint32
    649     = arch_integer_type (gdbarch, 32, 1, "uint32");
    650   builtin_go_type->builtin_uint64
    651     = arch_integer_type (gdbarch, 64, 1, "uint64");
    652   builtin_go_type->builtin_float32
    653     = arch_float_type (gdbarch, 32, "float32", floatformats_ieee_single);
    654   builtin_go_type->builtin_float64
    655     = arch_float_type (gdbarch, 64, "float64", floatformats_ieee_double);
    656   builtin_go_type->builtin_complex64
    657     = arch_complex_type (gdbarch, "complex64",
    658 			 builtin_go_type->builtin_float32);
    659   builtin_go_type->builtin_complex128
    660     = arch_complex_type (gdbarch, "complex128",
    661 			 builtin_go_type->builtin_float64);
    662 
    663   return builtin_go_type;
    664 }
    665 
    666 static struct gdbarch_data *go_type_data;
    667 
    668 const struct builtin_go_type *
    669 builtin_go_type (struct gdbarch *gdbarch)
    670 {
    671   return (const struct builtin_go_type *) gdbarch_data (gdbarch, go_type_data);
    672 }
    673 
    674 void
    675 _initialize_go_language (void)
    676 {
    677   go_type_data = gdbarch_data_register_post_init (build_go_types);
    678 }
    679