[gdb/symtab] Add dwarf_expr_piece.op

Add a new field "dwarf_location_atom op" to dwarf_expr_piece to keep track of
which dwarf_location_atom caused a dwarf_expr_piece to be added.

This is used in the following patch.

Tested on s390x-linux.

Approved-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
Tom de Vries
2025-01-15 17:02:00 +01:00
parent 6511d20c9d
commit c4606bdbd5
2 changed files with 11 additions and 5 deletions

View File

@@ -1198,13 +1198,15 @@ dwarf_expr_context::stack_empty_p () const
/* Add a new piece to the dwarf_expr_context's piece list. */
void
dwarf_expr_context::add_piece (ULONGEST size, ULONGEST offset)
dwarf_expr_context::add_piece (ULONGEST size, ULONGEST offset,
enum dwarf_location_atom op)
{
dwarf_expr_piece &p = this->m_pieces.emplace_back ();
p.location = this->m_location;
p.size = size;
p.offset = offset;
p.op = op;
if (p.location == DWARF_VALUE_LITERAL)
{
@@ -2170,7 +2172,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr,
/* Record the piece. */
op_ptr = safe_read_uleb128 (op_ptr, op_end, &size);
add_piece (8 * size, 0);
add_piece (8 * size, 0, op);
/* Pop off the address/regnum, and reset the location
type. */
@@ -2188,7 +2190,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr,
/* Record the piece. */
op_ptr = safe_read_uleb128 (op_ptr, op_end, &size);
op_ptr = safe_read_uleb128 (op_ptr, op_end, &uleb_offset);
add_piece (size, uleb_offset);
add_piece (size, uleb_offset, op);
/* Pop off the address/regnum, and reset the location
type. */
@@ -2390,7 +2392,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr,
pointer, then make a pieced value. This is ok because we can't
have implicit pointers in contexts where pieces are invalid. */
if (this->m_location == DWARF_VALUE_IMPLICIT_POINTER)
add_piece (8 * this->m_addr_size, 0);
add_piece (8 * this->m_addr_size, 0, DW_OP_implicit_pointer);
this->m_recursion_depth--;
gdb_assert (this->m_recursion_depth >= 0);