Use an enum to represent subclasses of symbol
This changes struct symbol to use an enum to encode the concrete subclass of a particular symbol. Note that "enum class" doesn't work properly with bitfields, so a plain enum is used. 2017-11-17 Tom Tromey <tom@tromey.com> * symtab.h (enum symbol_subclass_kind): New. (struct symbol) <is_cplus_template_function, is_rust_vtable>: Remove. <subclass>: New member. (SYMBOL_IS_CPLUS_TEMPLATE_FUNCTION): Update. * rust-lang.c (rust_get_trait_object_pointer): Update. * dwarf2read.c (read_func_scope): Update. (read_variable): Update.
This commit is contained in:
parent
68e745e38e
commit
cf724bc93e
4 changed files with 32 additions and 11 deletions
|
@ -1,3 +1,14 @@
|
|||
2017-11-17 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* symtab.h (enum symbol_subclass_kind): New.
|
||||
(struct symbol) <is_cplus_template_function, is_rust_vtable>:
|
||||
Remove.
|
||||
<subclass>: New member.
|
||||
(SYMBOL_IS_CPLUS_TEMPLATE_FUNCTION): Update.
|
||||
* rust-lang.c (rust_get_trait_object_pointer): Update.
|
||||
* dwarf2read.c (read_func_scope): Update.
|
||||
(read_variable): Update.
|
||||
|
||||
2017-11-17 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* dwarf2read.c (read_func_scope): Update.
|
||||
|
|
|
@ -12263,7 +12263,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
|
|||
|| child_die->tag == DW_TAG_template_value_param)
|
||||
{
|
||||
templ_func = allocate_template_symbol (objfile);
|
||||
templ_func->is_cplus_template_function = 1;
|
||||
templ_func->subclass = SYMBOL_TEMPLATE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -12821,7 +12821,7 @@ read_variable (struct die_info *die, struct dwarf2_cu *cu)
|
|||
struct rust_vtable_symbol);
|
||||
initialize_objfile_symbol (storage);
|
||||
storage->concrete_type = containing_type;
|
||||
storage->is_rust_vtable = 1;
|
||||
storage->subclass = SYMBOL_RUST_VTABLE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -421,7 +421,7 @@ rust_get_trait_object_pointer (struct value *value)
|
|||
|
||||
CORE_ADDR vtable = value_as_address (value_field (value, vtable_field));
|
||||
struct symbol *symbol = find_symbol_at_address (vtable);
|
||||
if (symbol == NULL || !symbol->is_rust_vtable)
|
||||
if (symbol == NULL || symbol->subclass != SYMBOL_RUST_VTABLE)
|
||||
return NULL;
|
||||
|
||||
struct rust_vtable_symbol *vtable_sym
|
||||
|
|
26
gdb/symtab.h
26
gdb/symtab.h
|
@ -1009,6 +1009,21 @@ struct symbol_impl
|
|||
const struct symbol_register_ops *ops_register;
|
||||
};
|
||||
|
||||
/* struct symbol has some subclasses. This enum is used to
|
||||
differentiate between them. */
|
||||
|
||||
enum symbol_subclass_kind
|
||||
{
|
||||
/* Plain struct symbol. */
|
||||
SYMBOL_NONE,
|
||||
|
||||
/* struct template_symbol. */
|
||||
SYMBOL_TEMPLATE,
|
||||
|
||||
/* struct rust_vtable_symbol. */
|
||||
SYMBOL_RUST_VTABLE
|
||||
};
|
||||
|
||||
/* This structure is space critical. See space comments at the top. */
|
||||
|
||||
struct symbol
|
||||
|
@ -1058,14 +1073,9 @@ struct symbol
|
|||
/* Whether this is an inlined function (class LOC_BLOCK only). */
|
||||
unsigned is_inlined : 1;
|
||||
|
||||
/* True if this is a C++ function symbol with template arguments.
|
||||
In this case the symbol is really a "struct template_symbol". */
|
||||
unsigned is_cplus_template_function : 1;
|
||||
/* The concrete type of this symbol. */
|
||||
|
||||
/* True if this is a Rust virtual table. In this case, the symbol
|
||||
can be downcast to "struct rust_vtable_symbol". */
|
||||
|
||||
unsigned is_rust_vtable : 1;
|
||||
ENUM_BITFIELD (symbol_subclass_kind) subclass : 2;
|
||||
|
||||
/* Line number of this symbol's definition, except for inlined
|
||||
functions. For an inlined function (class LOC_BLOCK and
|
||||
|
@ -1127,7 +1137,7 @@ extern const struct block_symbol null_block_symbol;
|
|||
#define SYMBOL_IS_ARGUMENT(symbol) (symbol)->is_argument
|
||||
#define SYMBOL_INLINED(symbol) (symbol)->is_inlined
|
||||
#define SYMBOL_IS_CPLUS_TEMPLATE_FUNCTION(symbol) \
|
||||
(symbol)->is_cplus_template_function
|
||||
(((symbol)->subclass) == SYMBOL_TEMPLATE)
|
||||
#define SYMBOL_TYPE(symbol) (symbol)->type
|
||||
#define SYMBOL_LINE(symbol) (symbol)->line
|
||||
#define SYMBOL_COMPUTED_OPS(symbol) (SYMBOL_IMPL (symbol).ops_computed)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue