From cf724bc93ee954a6f7aac0557afc41c1316dc80c Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 17 Nov 2017 12:05:58 -0700 Subject: [PATCH] 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 * symtab.h (enum symbol_subclass_kind): New. (struct symbol) : Remove. : 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 5aecd43182a..31e447aa7de 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2017-11-17 Tom Tromey + + * symtab.h (enum symbol_subclass_kind): New. + (struct symbol) : + Remove. + : 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 * dwarf2read.c (read_func_scope): Update. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 86b699671ac..5437d21b894 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 832f77fd3fa..f3562e0f32b 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 83d0ff25696..2d826aabb50 100644 --- a/gdb/symtab.h +++ b/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; - - /* 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 @@ -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) -- 2.30.2