mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-05-31 18:20:12 +08:00
C++-ify typedef hash
This changes the typedef_hash_table structure to be a C++ class. It adds constructors and destructors and changes some functions to be methods of the class. Then it changes the various users of this class to adapt. This allows for the removal of some cleanups. Regression tested by the buildbot. gdb/ChangeLog 2018-03-27 Tom Tromey <tom@tromey.com> * typeprint.h (struct type_print_options) <local_typedefs, global_typedefs>: Remove "struct" keyword. (class typedef_hash_table): New class. (recursively_update_typedef_hash, add_template_parameters) (create_typedef_hash, free_typedef_hash, copy_typedef_hash) (find_typedef_in_hash): Don't declare. * typeprint.c (struct typedef_hash_table): Move to typeprint.h. (typedef_hash_table::recursively_update): Rename from recursively_update_typedef_hash. Now a member. (typedef_hash_table::add_template_parameters): Rename from add_template_parameters. Now a member. (typedef_hash_table::typedef_hash_table): Now a constructor; rename from create_typedef_hash. (typedef_hash_table::~typedef_hash_table): Now a destructor; rename from free_typedef_hash. (do_free_typedef_hash, make_cleanup_free_typedef_hash) (do_free_global_table): Remove. (typedef_hash_table::typedef_hash_table): New constructor; renamed from copy_type_recursive. (create_global_typedef_table): Remove. (typedef_hash_table::find_global_typedef): Now a member of typedef_hash_table. (typedef_hash_table::find_typedef): Rename from find_typedef_in_hash; now a member. (whatis_exp): Update. * extension.h (struct ext_lang_type_printers): Add constructor and destructor. (start_ext_lang_type_printers, free_ext_lang_type_printers): Don't declare. * extension.c (ext_lang_type_printers::ext_lang_type_printers): Now a constructor; rename from start_ext_lang_type_printers. (ext_lang_type_printers): Now a destructor; rename from free_ext_lang_type_printers. * c-typeprint.c (find_typedef_for_canonicalize, c_print_type_1): Update. (c_type_print_base_struct_union): Update. Remove cleanups.
This commit is contained in:
156
gdb/typeprint.c
156
gdb/typeprint.c
@ -65,19 +65,6 @@ static struct type_print_options default_ptype_flags =
|
||||
|
||||
|
||||
|
||||
/* A hash table holding typedef_field objects. This is more
|
||||
complicated than an ordinary hash because it must also track the
|
||||
lifetime of some -- but not all -- of the contained objects. */
|
||||
|
||||
struct typedef_hash_table
|
||||
{
|
||||
/* The actual hash table. */
|
||||
htab_t table;
|
||||
|
||||
/* Storage for typedef_field objects that must be synthesized. */
|
||||
struct obstack storage;
|
||||
};
|
||||
|
||||
/* A hash function for a typedef_field. */
|
||||
|
||||
static hashval_t
|
||||
@ -100,23 +87,19 @@ eq_typedef_field (const void *a, const void *b)
|
||||
return types_equal (tfa->type, tfb->type);
|
||||
}
|
||||
|
||||
/* Add typedefs from T to the hash table TABLE. */
|
||||
/* See typeprint.h. */
|
||||
|
||||
void
|
||||
recursively_update_typedef_hash (struct typedef_hash_table *table,
|
||||
struct type *t)
|
||||
typedef_hash_table::recursively_update (struct type *t)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (table == NULL)
|
||||
return;
|
||||
|
||||
for (i = 0; i < TYPE_TYPEDEF_FIELD_COUNT (t); ++i)
|
||||
{
|
||||
struct decl_field *tdef = &TYPE_TYPEDEF_FIELD (t, i);
|
||||
void **slot;
|
||||
|
||||
slot = htab_find_slot (table->table, tdef, INSERT);
|
||||
slot = htab_find_slot (m_table, tdef, INSERT);
|
||||
/* Only add a given typedef name once. Really this shouldn't
|
||||
happen; but it is safe enough to do the updates breadth-first
|
||||
and thus use the most specific typedef. */
|
||||
@ -126,19 +109,16 @@ recursively_update_typedef_hash (struct typedef_hash_table *table,
|
||||
|
||||
/* Recurse into superclasses. */
|
||||
for (i = 0; i < TYPE_N_BASECLASSES (t); ++i)
|
||||
recursively_update_typedef_hash (table, TYPE_BASECLASS (t, i));
|
||||
recursively_update (TYPE_BASECLASS (t, i));
|
||||
}
|
||||
|
||||
/* Add template parameters from T to the typedef hash TABLE. */
|
||||
/* See typeprint.h. */
|
||||
|
||||
void
|
||||
add_template_parameters (struct typedef_hash_table *table, struct type *t)
|
||||
typedef_hash_table::add_template_parameters (struct type *t)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (table == NULL)
|
||||
return;
|
||||
|
||||
for (i = 0; i < TYPE_N_TEMPLATE_ARGUMENTS (t); ++i)
|
||||
{
|
||||
struct decl_field *tf;
|
||||
@ -148,61 +128,32 @@ add_template_parameters (struct typedef_hash_table *table, struct type *t)
|
||||
if (SYMBOL_CLASS (TYPE_TEMPLATE_ARGUMENT (t, i)) != LOC_TYPEDEF)
|
||||
continue;
|
||||
|
||||
tf = XOBNEW (&table->storage, struct decl_field);
|
||||
tf = XOBNEW (&m_storage, struct decl_field);
|
||||
tf->name = SYMBOL_LINKAGE_NAME (TYPE_TEMPLATE_ARGUMENT (t, i));
|
||||
tf->type = SYMBOL_TYPE (TYPE_TEMPLATE_ARGUMENT (t, i));
|
||||
|
||||
slot = htab_find_slot (table->table, tf, INSERT);
|
||||
slot = htab_find_slot (m_table, tf, INSERT);
|
||||
if (*slot == NULL)
|
||||
*slot = tf;
|
||||
}
|
||||
}
|
||||
|
||||
/* Create a new typedef-lookup hash table. */
|
||||
/* See typeprint.h. */
|
||||
|
||||
struct typedef_hash_table *
|
||||
create_typedef_hash (void)
|
||||
typedef_hash_table::typedef_hash_table ()
|
||||
{
|
||||
struct typedef_hash_table *result;
|
||||
|
||||
result = XNEW (struct typedef_hash_table);
|
||||
result->table = htab_create_alloc (10, hash_typedef_field, eq_typedef_field,
|
||||
NULL, xcalloc, xfree);
|
||||
obstack_init (&result->storage);
|
||||
|
||||
return result;
|
||||
m_table = htab_create_alloc (10, hash_typedef_field, eq_typedef_field,
|
||||
NULL, xcalloc, xfree);
|
||||
}
|
||||
|
||||
/* Free a typedef field table. */
|
||||
|
||||
void
|
||||
free_typedef_hash (struct typedef_hash_table *table)
|
||||
typedef_hash_table::~typedef_hash_table ()
|
||||
{
|
||||
if (table != NULL)
|
||||
{
|
||||
htab_delete (table->table);
|
||||
obstack_free (&table->storage, NULL);
|
||||
xfree (table);
|
||||
}
|
||||
htab_delete (m_table);
|
||||
}
|
||||
|
||||
/* A cleanup for freeing a typedef_hash_table. */
|
||||
|
||||
static void
|
||||
do_free_typedef_hash (void *arg)
|
||||
{
|
||||
free_typedef_hash ((struct typedef_hash_table *) arg);
|
||||
}
|
||||
|
||||
/* Return a new cleanup that frees TABLE. */
|
||||
|
||||
struct cleanup *
|
||||
make_cleanup_free_typedef_hash (struct typedef_hash_table *table)
|
||||
{
|
||||
return make_cleanup (do_free_typedef_hash, table);
|
||||
}
|
||||
|
||||
/* Helper function for copy_typedef_hash. */
|
||||
/* Helper function for typedef_hash_table::copy. */
|
||||
|
||||
static int
|
||||
copy_typedef_hash_element (void **slot, void *nt)
|
||||
@ -217,42 +168,14 @@ copy_typedef_hash_element (void **slot, void *nt)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Copy a typedef hash. */
|
||||
/* See typeprint.h. */
|
||||
|
||||
struct typedef_hash_table *
|
||||
copy_typedef_hash (struct typedef_hash_table *table)
|
||||
typedef_hash_table::typedef_hash_table (const typedef_hash_table &table)
|
||||
{
|
||||
struct typedef_hash_table *result;
|
||||
|
||||
if (table == NULL)
|
||||
return NULL;
|
||||
|
||||
result = create_typedef_hash ();
|
||||
htab_traverse_noresize (table->table, copy_typedef_hash_element,
|
||||
result->table);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* A cleanup to free the global typedef hash. */
|
||||
|
||||
static void
|
||||
do_free_global_table (void *arg)
|
||||
{
|
||||
struct type_print_options *flags = (struct type_print_options *) arg;
|
||||
|
||||
free_typedef_hash (flags->global_typedefs);
|
||||
free_ext_lang_type_printers (flags->global_printers);
|
||||
}
|
||||
|
||||
/* Create the global typedef hash. */
|
||||
|
||||
static struct cleanup *
|
||||
create_global_typedef_table (struct type_print_options *flags)
|
||||
{
|
||||
gdb_assert (flags->global_typedefs == NULL && flags->global_printers == NULL);
|
||||
flags->global_typedefs = create_typedef_hash ();
|
||||
flags->global_printers = start_ext_lang_type_printers ();
|
||||
return make_cleanup (do_free_global_table, flags);
|
||||
m_table = htab_create_alloc (10, hash_typedef_field, eq_typedef_field,
|
||||
NULL, xcalloc, xfree);
|
||||
htab_traverse_noresize (table.m_table, copy_typedef_hash_element,
|
||||
m_table);
|
||||
}
|
||||
|
||||
/* Look up the type T in the global typedef hash. If it is found,
|
||||
@ -260,9 +183,9 @@ create_global_typedef_table (struct type_print_options *flags)
|
||||
type-printers, if any, given by start_script_type_printers and return the
|
||||
result. A NULL return means that the name was not found. */
|
||||
|
||||
static const char *
|
||||
find_global_typedef (const struct type_print_options *flags,
|
||||
struct type *t)
|
||||
const char *
|
||||
typedef_hash_table::find_global_typedef (const struct type_print_options *flags,
|
||||
struct type *t)
|
||||
{
|
||||
char *applied;
|
||||
void **slot;
|
||||
@ -274,7 +197,7 @@ find_global_typedef (const struct type_print_options *flags,
|
||||
tf.name = NULL;
|
||||
tf.type = t;
|
||||
|
||||
slot = htab_find_slot (flags->global_typedefs->table, &tf, INSERT);
|
||||
slot = htab_find_slot (flags->global_typedefs->m_table, &tf, INSERT);
|
||||
if (*slot != NULL)
|
||||
{
|
||||
new_tf = (struct decl_field *) *slot;
|
||||
@ -283,7 +206,7 @@ find_global_typedef (const struct type_print_options *flags,
|
||||
|
||||
/* Put an entry into the hash table now, in case
|
||||
apply_ext_lang_type_printers recurses. */
|
||||
new_tf = XOBNEW (&flags->global_typedefs->storage, struct decl_field);
|
||||
new_tf = XOBNEW (&flags->global_typedefs->m_storage, struct decl_field);
|
||||
new_tf->name = NULL;
|
||||
new_tf->type = t;
|
||||
|
||||
@ -294,7 +217,7 @@ find_global_typedef (const struct type_print_options *flags,
|
||||
if (applied != NULL)
|
||||
{
|
||||
new_tf->name
|
||||
= (const char *) obstack_copy0 (&flags->global_typedefs->storage,
|
||||
= (const char *) obstack_copy0 (&flags->global_typedefs->m_storage,
|
||||
applied, strlen (applied));
|
||||
xfree (applied);
|
||||
}
|
||||
@ -302,13 +225,11 @@ find_global_typedef (const struct type_print_options *flags,
|
||||
return new_tf->name;
|
||||
}
|
||||
|
||||
/* Look up the type T in the typedef hash table in with FLAGS. If T
|
||||
is in the table, return its short (class-relative) typedef name.
|
||||
Otherwise return NULL. If the table is NULL, this always returns
|
||||
NULL. */
|
||||
/* See typeprint.h. */
|
||||
|
||||
const char *
|
||||
find_typedef_in_hash (const struct type_print_options *flags, struct type *t)
|
||||
typedef_hash_table::find_typedef (const struct type_print_options *flags,
|
||||
struct type *t)
|
||||
{
|
||||
if (flags->local_typedefs != NULL)
|
||||
{
|
||||
@ -316,7 +237,7 @@ find_typedef_in_hash (const struct type_print_options *flags, struct type *t)
|
||||
|
||||
tf.name = NULL;
|
||||
tf.type = t;
|
||||
found = (struct decl_field *) htab_find (flags->local_typedefs->table,
|
||||
found = (struct decl_field *) htab_find (flags->local_typedefs->m_table,
|
||||
&tf);
|
||||
|
||||
if (found != NULL)
|
||||
@ -406,7 +327,6 @@ static void
|
||||
whatis_exp (const char *exp, int show)
|
||||
{
|
||||
struct value *val;
|
||||
struct cleanup *old_chain;
|
||||
struct type *real_type = NULL;
|
||||
struct type *type;
|
||||
int full = 0;
|
||||
@ -415,8 +335,6 @@ whatis_exp (const char *exp, int show)
|
||||
struct value_print_options opts;
|
||||
struct type_print_options flags = default_ptype_flags;
|
||||
|
||||
old_chain = make_cleanup (null_cleanup, NULL);
|
||||
|
||||
if (exp)
|
||||
{
|
||||
if (*exp == '/')
|
||||
@ -526,8 +444,16 @@ whatis_exp (const char *exp, int show)
|
||||
|
||||
printf_filtered ("type = ");
|
||||
|
||||
std::unique_ptr<typedef_hash_table> table_holder;
|
||||
std::unique_ptr<ext_lang_type_printers> printer_holder;
|
||||
if (!flags.raw)
|
||||
create_global_typedef_table (&flags);
|
||||
{
|
||||
table_holder.reset (new typedef_hash_table);
|
||||
flags.global_typedefs = table_holder.get ();
|
||||
|
||||
printer_holder.reset (new ext_lang_type_printers);
|
||||
flags.global_printers = printer_holder.get ();
|
||||
}
|
||||
|
||||
if (real_type)
|
||||
{
|
||||
@ -540,8 +466,6 @@ whatis_exp (const char *exp, int show)
|
||||
|
||||
LA_PRINT_TYPE (type, "", gdb_stdout, show, 0, &flags);
|
||||
printf_filtered ("\n");
|
||||
|
||||
do_cleanups (old_chain);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Reference in New Issue
Block a user