From: Tom Tromey Date: Mon, 19 Dec 2022 18:25:48 +0000 (-0700) Subject: Introduce symbol_block_ops::get_block_value X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=36ed3d84e0ac1b6f21e68c742d72061ff51cb76b;p=binutils-gdb.git Introduce symbol_block_ops::get_block_value This adds a new callback to symbol_block_ops. This callback lets a LOC_BLOCK symbol implement its own function to find the underlying block. --- diff --git a/gdb/symtab.c b/gdb/symtab.c index 8ace6ae6c7e..4f28667b1b3 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -6412,7 +6412,8 @@ register_symbol_block_impl (enum address_class aclass, /* Sanity check OPS. */ gdb_assert (ops != NULL); - gdb_assert (ops->find_frame_base_location != NULL); + gdb_assert (ops->find_frame_base_location != nullptr + || ops->get_block_value != nullptr); return result; } diff --git a/gdb/symtab.h b/gdb/symtab.h index 8d3f5610bd3..d8e3c273f85 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1182,6 +1182,12 @@ struct symbol_block_ops the corresponding DW_AT_frame_base attribute. */ CORE_ADDR (*get_frame_base) (struct symbol *framefunc, frame_info_ptr frame); + + /* Return the block for this function. So far, this is used to + implement function aliases. So, if this is set, then it's not + necessary to set the other functions in this structure; and vice + versa. */ + const block *(*get_block_value) (const struct symbol *sym); }; /* Functions used with LOC_REGISTER and LOC_REGPARM_ADDR. */ @@ -1536,6 +1542,9 @@ struct block_symbol inline const block * symbol::value_block () const { + if (SYMBOL_BLOCK_OPS (this) != nullptr + && SYMBOL_BLOCK_OPS (this)->get_block_value != nullptr) + return SYMBOL_BLOCK_OPS (this)->get_block_value (this); return m_value.block; }