aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2025-01-15 17:02:00 +0100
committerTom de Vries <tdevries@suse.de>2025-01-15 17:02:00 +0100
commitc4606bdbd580237478b6d6b4cdf4927134d31e5a (patch)
treee9d90f0e535b93687fe8daf2416cacfe4287c3cc
parent6511d20c9d47093acb3b099ff19854e01bbe9af4 (diff)
downloadbinutils-c4606bdbd580237478b6d6b4cdf4927134d31e5a.zip
binutils-c4606bdbd580237478b6d6b4cdf4927134d31e5a.tar.gz
binutils-c4606bdbd580237478b6d6b4cdf4927134d31e5a.tar.bz2
[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>
-rw-r--r--gdb/dwarf2/expr.c10
-rw-r--r--gdb/dwarf2/expr.h6
2 files changed, 11 insertions, 5 deletions
diff --git a/gdb/dwarf2/expr.c b/gdb/dwarf2/expr.c
index 5ad17ea..2a1b851 100644
--- a/gdb/dwarf2/expr.c
+++ b/gdb/dwarf2/expr.c
@@ -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);
diff --git a/gdb/dwarf2/expr.h b/gdb/dwarf2/expr.h
index bbb9cd0..1b1653e 100644
--- a/gdb/dwarf2/expr.h
+++ b/gdb/dwarf2/expr.h
@@ -24,6 +24,7 @@
#include "leb128.h"
#include "dwarf2/call-site.h"
+#include "dwarf2.h"
struct dwarf2_per_objfile;
@@ -54,6 +55,9 @@ enum dwarf_value_location
/* A piece of an object, as recorded by DW_OP_piece or DW_OP_bit_piece. */
struct dwarf_expr_piece
{
+ /* The DWARF operation for which the piece was created. */
+ enum dwarf_location_atom op;
+
enum dwarf_value_location location;
union
@@ -208,7 +212,7 @@ private:
struct type *address_type () const;
void push (struct value *value, bool in_stack_memory);
bool stack_empty_p () const;
- void add_piece (ULONGEST size, ULONGEST offset);
+ void add_piece (ULONGEST size, ULONGEST offset, enum dwarf_location_atom op);
void execute_stack_op (const gdb_byte *op_ptr, const gdb_byte *op_end);
void pop ();
struct value *fetch (int n);