/* Output Go language descriptions of types.
- Copyright (C) 2008-2015 Free Software Foundation, Inc.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
Written by Ian Lance Taylor <iant@google.com>.
This file is part of GCC.
#include "config.h"
#include "system.h"
#include "coretypes.h"
-#include "options.h"
-#include "obstack.h"
#include "tree.h"
-#include "wide-int-print.h"
#include "diagnostic-core.h"
-#include "alias.h"
#include "debug.h"
#include "stor-layout.h"
-#include "defaults.h"
/* We dump this information from the debug hooks. This gives us a
stable and maintainable API to hook into. In order to work
go_early_global_decl (tree decl)
{
go_decl (decl);
- real_debug_hooks->early_global_decl (decl);
+ if (TREE_CODE (decl) != FUNCTION_DECL || DECL_STRUCT_FUNCTION (decl) != NULL)
+ real_debug_hooks->early_global_decl (decl);
}
/* A global variable decl. */
/* A container for the data we pass around when generating information
at the end of the compilation. */
-struct godump_container
+class godump_container
{
+public:
/* DECLs that we have already seen. */
hash_set<tree> decls_seen;
calls from go_format_type() itself. */
static bool
-go_format_type (struct godump_container *container, tree type,
+go_format_type (class godump_container *container, tree type,
bool use_type_name, bool is_func_ok, unsigned int *p_art_i,
bool is_anon_record_or_union)
{
switch (TREE_CODE (type))
{
- case ENUMERAL_TYPE:
- obstack_grow (ob, "int", 3);
- break;
-
case TYPE_DECL:
{
void **slot;
}
break;
+ case ENUMERAL_TYPE:
case INTEGER_TYPE:
{
const char *s;
case UNION_TYPE:
is_union = true;
/* Fall through to RECORD_TYPE case. */
+ gcc_fallthrough ();
case RECORD_TYPE:
{
unsigned int prev_field_end;
unions. */
if (!is_anon_substructure)
{
- if ((DECL_NAME (field) == NULL))
+ if (DECL_NAME (field) == NULL)
*p_art_i = go_append_artificial_name (ob, *p_art_i);
else
go_append_decl_name
}
}
/* Padding. */
- {
- unsigned int align_unit;
-
- align_unit = (is_anon_record_or_union) ? 1 : TYPE_ALIGN_UNIT (type);
- *p_art_i = go_append_padding
- (ob, prev_field_end, TREE_INT_CST_LOW (TYPE_SIZE_UNIT (type)),
- align_unit, *p_art_i, &prev_field_end);
- }
+ *p_art_i = go_append_padding (ob, prev_field_end,
+ TREE_INT_CST_LOW (TYPE_SIZE_UNIT (type)),
+ 1, *p_art_i, &prev_field_end);
/* Alignment. */
if (!is_anon_record_or_union
&& known_alignment < TYPE_ALIGN_UNIT (type))
it. */
static void
-go_output_type (struct godump_container *container)
+go_output_type (class godump_container *container)
{
struct obstack *ob;
/* Output a function declaration. */
static void
-go_output_fndecl (struct godump_container *container, tree decl)
+go_output_fndecl (class godump_container *container, tree decl)
{
if (!go_format_type (container, TREE_TYPE (decl), false, true, NULL, false))
fprintf (go_dump_file, "// ");
/* Output a typedef or something like a struct definition. */
static void
-go_output_typedef (struct godump_container *container, tree decl)
+go_output_typedef (class godump_container *container, tree decl)
{
/* If we have an enum type, output the enum constants
separately. */
snprintf (buf, sizeof buf, HOST_WIDE_INT_PRINT_UNSIGNED,
tree_to_uhwi (TREE_VALUE (element)));
else
- print_hex (element, buf);
+ print_hex (wi::to_wide (element), buf);
mhval->value = xstrdup (buf);
*slot = mhval;
return;
*slot = CONST_CAST (void *, (const void *) type);
- if (!go_format_type (container, TREE_TYPE (decl), false, false, NULL,
+ if (!go_format_type (container, TREE_TYPE (decl), true, false, NULL,
false))
{
fprintf (go_dump_file, "// ");
/* Output a variable. */
static void
-go_output_var (struct godump_container *container, tree decl)
+go_output_var (class godump_container *container, tree decl)
{
bool is_valid;
tree type_name;
};
static void
-keyword_hash_init (struct godump_container *container)
+keyword_hash_init (class godump_container *container)
{
size_t i;
size_t count = sizeof (keywords) / sizeof (keywords[0]);
bool
find_dummy_types (const char *const &ptr, godump_container *adata)
{
- struct godump_container *data = (struct godump_container *) adata;
+ class godump_container *data = (class godump_container *) adata;
const char *type = (const char *) ptr;
void **slot;
void **islot;
static void
go_finish (const char *filename)
{
- struct godump_container container;
+ class godump_container container;
unsigned int ix;
tree decl;