[RFA v2 3/3] Use an enum to represent subclasses of symbol

Tom Tromey
2017-11-17T19:26:04Z

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.
---
gdb/ChangeLog | 11 +++++++++++
gdb/dwarf2read.c | 4 ++--
gdb/rust-lang.c | 2 +-
gdb/symtab.h | 26 ++++++++++++++++++--------
4 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1551654..1502f06 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,16 @@
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.
* symtab.h (struct template_symbol): Derive from symbol.
: Remove.
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 86b6996..5437d21 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -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;
}
}

diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
index 832f77f..f3562e0 100644
--- a/gdb/rust-lang.c
+++ b/gdb/rust-lang.c
@@ -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
diff --git a/gdb/symtab.h b/gdb/symtab.h
index 6ecce81..ad8d602 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -1008,6 +1008,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
@@ -1057,14 +1072,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;
-
- /* True if this is a Rust virtual table. In this case, the symbol
- can be downcast to "struct rust_vtable_symbol". */
+ /* The concrete type of this 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
@@ -1126,7 +1136,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)
--
2.9.5