From: Zoran Zaric via Gdb-patches <gdb-patches@sourceware.org>
To: gdb-patches@sourceware.org
Cc: Zoran Zaric <Zoran.Zaric@amd.com>
Subject: [PATCH 19/30] Add new location description access interface
Date: Mon, 7 Dec 2020 19:00:20 +0000 [thread overview]
Message-ID: <20201207190031.13341-20-Zoran.Zaric@amd.com> (raw)
In-Reply-To: <20201207190031.13341-1-Zoran.Zaric@amd.com>
After adding interface for register and memory location access, a new
top level interface for accessing any location, described by the
dwarf_location class based objects, can now be defined.
Also, the address_type method is now needed to be outside of the
dwarf_stack_value class to allow creation of the DWARF generic type
independently of that class.
* dwarf2/expr.c (read_from_location): New function.
(write_to_location): New function.
(address_type): New function.
* dwarf2/expr.h (address_type): Exposed function.
---
gdb/dwarf2/expr.c | 427 ++++++++++++++++++++++++++++++++++++++++++++--
gdb/dwarf2/expr.h | 4 +
2 files changed, 420 insertions(+), 11 deletions(-)
diff --git a/gdb/dwarf2/expr.c b/gdb/dwarf2/expr.c
index c0bb06fc4c..fea82f8a87 100644
--- a/gdb/dwarf2/expr.c
+++ b/gdb/dwarf2/expr.c
@@ -613,6 +613,404 @@ class dwarf_composite : public dwarf_location
std::vector<struct piece> m_pieces;
};
+/* Read contents from the location specified by the DWARF location
+ description entry LOCATION.
+
+ The read operation is performed in the context of FRAME. BIT_SIZE
+ is the number of bits to read. The data read is copied to the
+ caller-managed buffer BUF. BIG_ENDIAN defines the endianness of
+ the target. BITS_TO_SKIP is a bit offset into the location and
+ BUF_BIT_OFFSET is buffer BUF's bit offset. LOCATION_BIT_LIMIT is a
+ a maximum number of bits that location can hold, where value zero
+ signifies that there is no such restriction.
+
+ Note that some location types can be read without a FRAME context.
+
+ If the location is optimized out or unavailable, the OPTIMIZED and
+ UNAVAILABLE outputs are set accordingly. */
+
+static void
+read_from_location (const dwarf_location *location, struct frame_info *frame,
+ LONGEST bits_to_skip, gdb_byte *buf, int buf_bit_offset,
+ size_t bit_size, size_t location_bit_limit,
+ bool big_endian, int* optimized, int* unavailable)
+{
+ LONGEST offset = location->get_offset ();
+ LONGEST bit_suboffset = location->get_bit_suboffset ();
+ LONGEST total_bits_to_skip = bits_to_skip;
+ size_t read_bit_limit = location_bit_limit;
+ gdb::byte_vector temp_buf;
+
+ /* Reads from undefined locations are always marked as optimized
+ out. */
+ if (dynamic_cast<const dwarf_undefined *> (location) != nullptr)
+ {
+ (*unavailable) = 0;
+ (*optimized) = 1;
+ }
+ else if (auto register_entry
+ = dynamic_cast<const dwarf_register *> (location))
+ {
+ struct gdbarch *arch = get_frame_arch (frame);
+ int reg = dwarf_reg_to_regnum_or_error (arch,
+ register_entry->get_regnum ());
+ ULONGEST reg_bits = HOST_CHAR_BIT * register_size (arch, reg);
+
+ if (big_endian)
+ {
+ if (!read_bit_limit || reg_bits <= read_bit_limit)
+ read_bit_limit = bit_size;
+
+ total_bits_to_skip
+ += reg_bits - (offset * HOST_CHAR_BIT
+ + bit_suboffset + read_bit_limit);
+ }
+ else
+ total_bits_to_skip += offset * HOST_CHAR_BIT + bit_suboffset;
+
+ LONGEST this_size = bits_to_bytes (total_bits_to_skip, bit_size);
+ temp_buf.resize (this_size);
+
+ /* Can only read from a register on byte granularity so an
+ additional buffer is required. */
+ read_from_register (frame, reg, total_bits_to_skip / HOST_CHAR_BIT,
+ this_size, temp_buf.data (), optimized, unavailable);
+
+ /* Only copy data if valid. */
+ if (!(*optimized) && !(*unavailable))
+ copy_bitwise (buf, buf_bit_offset, temp_buf.data (),
+ total_bits_to_skip % HOST_CHAR_BIT,
+ bit_size, big_endian);
+ }
+ else if (auto memory_entry = dynamic_cast<const dwarf_memory *> (location))
+ {
+ CORE_ADDR start_address
+ = offset + (bit_suboffset + total_bits_to_skip) / HOST_CHAR_BIT;
+
+ (*optimized) = 0;
+ total_bits_to_skip += bit_suboffset;
+
+ if ((total_bits_to_skip % HOST_CHAR_BIT) == 0
+ && (bit_size % HOST_CHAR_BIT) == 0
+ && (buf_bit_offset % HOST_CHAR_BIT) == 0)
+ {
+ /* Everything is byte-aligned, no buffer needed. */
+ read_from_memory (start_address,
+ buf + buf_bit_offset / HOST_CHAR_BIT,
+ bit_size / HOST_CHAR_BIT,
+ memory_entry->in_stack (), unavailable);
+ }
+ else
+ {
+ LONGEST this_size = bits_to_bytes (total_bits_to_skip, bit_size);
+ temp_buf.resize (this_size);
+
+ /* Can only read from memory on byte granularity so an
+ additional buffer is required. */
+ read_from_memory (start_address, temp_buf.data (), this_size,
+ memory_entry->in_stack (), unavailable);
+
+ if (!(*unavailable))
+ copy_bitwise (buf, buf_bit_offset, temp_buf.data (),
+ total_bits_to_skip % HOST_CHAR_BIT,
+ bit_size, big_endian);
+ }
+ }
+ else if (auto implicit_entry
+ = dynamic_cast<const dwarf_implicit *> (location))
+ {
+ ULONGEST literal_bit_size = HOST_CHAR_BIT * implicit_entry->get_size ();
+
+ (*optimized) = 0;
+ (*unavailable) = 0;
+
+ /* Cut off at the end of the implicit value. */
+ if (implicit_entry->get_byte_order() == BFD_ENDIAN_BIG)
+ {
+ if (!read_bit_limit || read_bit_limit > literal_bit_size)
+ read_bit_limit = bit_size;
+
+ total_bits_to_skip
+ += literal_bit_size - (offset * HOST_CHAR_BIT
+ + bit_suboffset + read_bit_limit);
+ }
+ else
+ total_bits_to_skip += offset * HOST_CHAR_BIT + bit_suboffset;
+
+ if (total_bits_to_skip >= literal_bit_size)
+ {
+ (*unavailable) = 1;
+ return;
+ }
+
+ if (bit_size > literal_bit_size - total_bits_to_skip)
+ bit_size = literal_bit_size - total_bits_to_skip;
+
+ copy_bitwise (buf, buf_bit_offset, implicit_entry->get_contents (),
+ total_bits_to_skip, bit_size, big_endian);
+ }
+ else if (auto pointer_entry
+ = dynamic_cast<const dwarf_implicit_pointer *> (location))
+ {
+ struct frame_info *read_frame = frame;
+
+ if (read_frame == nullptr)
+ read_frame = get_selected_frame (_("No frame selected."));
+
+ struct type *type = address_type (get_frame_arch (read_frame),
+ pointer_entry->get_addr_size ());
+
+ struct value *value
+ = indirect_synthetic_pointer (pointer_entry->get_die_offset (),
+ pointer_entry->get_offset (),
+ pointer_entry->get_per_cu (),
+ pointer_entry->get_per_objfile (),
+ read_frame, type);
+
+ total_bits_to_skip += bit_suboffset;
+
+ gdb_byte *value_contents
+ = value_contents_raw (value) + total_bits_to_skip / HOST_CHAR_BIT;
+
+ if ((total_bits_to_skip % HOST_CHAR_BIT) == 0
+ && (bit_size % HOST_CHAR_BIT) == 0
+ && (buf_bit_offset % HOST_CHAR_BIT) == 0)
+ {
+ memcpy (buf + buf_bit_offset / HOST_CHAR_BIT,
+ value_contents, bit_size / HOST_CHAR_BIT);
+ }
+ else
+ {
+ copy_bitwise (buf, buf_bit_offset, value_contents,
+ total_bits_to_skip % HOST_CHAR_BIT,
+ bit_size, big_endian);
+ }
+ }
+ else if (auto composite_entry
+ = dynamic_cast<const dwarf_composite *> (location))
+ {
+ unsigned int pieces_num = composite_entry->get_pieces_num ();
+ unsigned int i;
+
+ total_bits_to_skip += offset * HOST_CHAR_BIT + bit_suboffset;
+
+ /* Skip pieces covered by the read offset. */
+ for (i = 0; i < pieces_num; i++)
+ {
+ LONGEST piece_bit_size = composite_entry->get_bit_size_at (i);
+
+ if (total_bits_to_skip < piece_bit_size)
+ break;
+
+ total_bits_to_skip -= piece_bit_size;
+ }
+
+ for (; i < pieces_num; i++)
+ {
+ LONGEST piece_bit_size = composite_entry->get_bit_size_at (i);
+ LONGEST actual_bit_size = piece_bit_size;
+
+ if (actual_bit_size > bit_size)
+ actual_bit_size = bit_size;
+
+ read_from_location (composite_entry->get_piece_at (i), frame,
+ total_bits_to_skip, buf, buf_bit_offset,
+ actual_bit_size, piece_bit_size, big_endian,
+ optimized, unavailable);
+
+ if (bit_size == actual_bit_size || (*optimized) || (*unavailable))
+ break;
+
+ buf_bit_offset += actual_bit_size;
+ bit_size -= actual_bit_size;
+ }
+ }
+ else
+ internal_error (__FILE__, __LINE__, _("invalid location type"));
+}
+
+/* Write contents to a location specified by the DWARF location
+ description entry LOCATION.
+
+ The write operation is performed in the context of FRAME. BIT_SIZE
+ is the number of bits written. The data written is copied from the
+ caller-managed BUF buffer. BIG_ENDIAN defines an endianness of the
+ target. BITS_TO_SKIP is a bit offset into the location and
+ BUF_BIT_OFFSET is buffer BUF's bit offset. LOCATION_BIT_LIMIT is a
+ a maximum number of bits that location can hold, where value zero
+ signifies that there is no such restriction.
+
+ Note that some location types can be written without a FRAME
+ context.
+
+ If the location is optimized out or unavailable, the OPTIMIZED and
+ UNAVAILABLE outputs are set. */
+
+static void
+write_to_location (const dwarf_location *location, struct frame_info *frame,
+ LONGEST bits_to_skip, const gdb_byte *buf,
+ int buf_bit_offset, size_t bit_size,
+ size_t location_bit_limit, bool big_endian,
+ int* optimized, int* unavailable)
+{
+ LONGEST offset = location->get_offset();
+ LONGEST bit_suboffset = location->get_bit_suboffset();
+ LONGEST total_bits_to_skip = bits_to_skip;
+ size_t write_bit_limit = location_bit_limit;
+ gdb::byte_vector temp_buf;
+
+ /* Writes to undefined locations are always marked as optimized
+ out. */
+ if (dynamic_cast<const dwarf_undefined *> (location) != nullptr)
+ {
+ (*unavailable) = 0;
+ (*optimized) = 1;
+ }
+ else if (auto register_entry
+ = dynamic_cast<const dwarf_register *> (location))
+ {
+ struct gdbarch *arch = get_frame_arch (frame);
+ int gdb_regnum
+ = dwarf_reg_to_regnum_or_error (arch, register_entry->get_regnum ());
+ ULONGEST reg_bits = HOST_CHAR_BIT * register_size (arch, gdb_regnum);
+
+ if (big_endian)
+ {
+ if (!write_bit_limit || reg_bits <= write_bit_limit)
+ write_bit_limit = bit_size;
+
+ total_bits_to_skip
+ += reg_bits - (offset * HOST_CHAR_BIT
+ + bit_suboffset + write_bit_limit);
+ }
+ else
+ total_bits_to_skip += offset * HOST_CHAR_BIT + bit_suboffset;
+
+ LONGEST this_size = bits_to_bytes (total_bits_to_skip, bit_size);
+ temp_buf.resize (this_size);
+
+ if (total_bits_to_skip % HOST_CHAR_BIT != 0
+ || bit_size % HOST_CHAR_BIT != 0)
+ {
+ /* Contents is copied non-byte-aligned into the register.
+ Need some bits from original register value. */
+ read_from_register (frame, gdb_regnum,
+ total_bits_to_skip / HOST_CHAR_BIT,
+ this_size, temp_buf.data (), optimized,
+ unavailable);
+ }
+
+ copy_bitwise (temp_buf.data (), total_bits_to_skip % HOST_CHAR_BIT, buf,
+ buf_bit_offset, bit_size, big_endian);
+
+ write_to_register (frame, gdb_regnum, total_bits_to_skip / HOST_CHAR_BIT,
+ this_size, temp_buf.data (), optimized, unavailable);
+ }
+ else if (auto memory_entry = dynamic_cast<const dwarf_memory *> (location))
+ {
+ CORE_ADDR start_address
+ = offset + (bit_suboffset + total_bits_to_skip) / HOST_CHAR_BIT;
+
+ total_bits_to_skip += bit_suboffset;
+ (*optimized) = 0;
+
+ if ((total_bits_to_skip % HOST_CHAR_BIT == 0)
+ && (bit_size % HOST_CHAR_BIT == 0)
+ && (buf_bit_offset % HOST_CHAR_BIT == 0))
+ {
+ /* Everything is byte-aligned; no buffer needed. */
+ write_to_memory (start_address,
+ buf + buf_bit_offset / HOST_CHAR_BIT,
+ bit_size / HOST_CHAR_BIT, memory_entry->in_stack (),
+ unavailable);
+ }
+ else
+ {
+ LONGEST this_size = bits_to_bytes (total_bits_to_skip, bit_size);
+ temp_buf.resize (this_size);
+
+ if (total_bits_to_skip % HOST_CHAR_BIT != 0
+ || bit_size % HOST_CHAR_BIT != 0)
+ {
+ if (this_size <= HOST_CHAR_BIT)
+ /* Perform a single read for small sizes. */
+ read_from_memory (start_address, temp_buf.data (),
+ this_size, memory_entry->in_stack (),
+ unavailable);
+ else
+ {
+ /* Only the first and last bytes can possibly have
+ any bits reused. */
+ read_from_memory (start_address, temp_buf.data (),
+ 1, memory_entry->in_stack (), unavailable);
+
+ if (!(*unavailable))
+ read_from_memory (start_address + this_size - 1,
+ &temp_buf[this_size - 1], 1,
+ memory_entry->in_stack (), unavailable);
+ }
+ }
+
+ copy_bitwise (temp_buf.data (), total_bits_to_skip % HOST_CHAR_BIT,
+ buf, buf_bit_offset, bit_size, big_endian);
+
+ write_to_memory (start_address, temp_buf.data (), this_size,
+ memory_entry->in_stack (), unavailable);
+ }
+ }
+ else if (dynamic_cast<const dwarf_implicit *> (location) != nullptr)
+ {
+ (*optimized) = 1;
+ (*unavailable) = 0;
+ }
+ else if (dynamic_cast<const dwarf_implicit_pointer *> (location) != nullptr)
+ {
+ (*optimized) = 1;
+ (*unavailable) = 0;
+ }
+ else if (auto composite_entry
+ = dynamic_cast<const dwarf_composite *> (location))
+ {
+ unsigned int pieces_num = composite_entry->get_pieces_num ();
+ unsigned int i;
+
+ total_bits_to_skip += offset * HOST_CHAR_BIT + bit_suboffset;
+
+ /* Skip pieces covered by the write offset. */
+ for (i = 0; i < pieces_num; i++)
+ {
+ LONGEST piece_bit_size = composite_entry->get_bit_size_at (i);
+
+ if (total_bits_to_skip < piece_bit_size)
+ break;
+
+ total_bits_to_skip -= piece_bit_size;
+ }
+
+ for (; i < pieces_num; i++)
+ {
+ LONGEST piece_bit_size = composite_entry->get_bit_size_at (i);
+ LONGEST actual_bit_size = piece_bit_size;
+
+ if (actual_bit_size > bit_size)
+ actual_bit_size = bit_size;
+
+ write_to_location (composite_entry->get_piece_at (i), frame,
+ total_bits_to_skip, buf, buf_bit_offset,
+ actual_bit_size, piece_bit_size,
+ big_endian, optimized, unavailable);
+
+ if (bit_size == actual_bit_size || (*optimized) || (*unavailable))
+ break;
+
+ buf_bit_offset += actual_bit_size;
+ bit_size -= actual_bit_size;
+ }
+ }
+ else
+ internal_error (__FILE__, __LINE__, _("invalid location type"));
+}
+
struct piece_closure
{
/* Reference count. */
@@ -1190,37 +1588,44 @@ sect_variable_value (sect_offset sect_off,
type, true);
}
-/* Return the type used for DWARF operations where the type is
- unspecified in the DWARF spec. Only certain sizes are
- supported. */
+/* See expr.h. */
struct type *
-dwarf_expr_context::address_type () const
+address_type (struct gdbarch *gdbarch, int addr_size)
{
struct dwarf_gdbarch_types *types
- = (struct dwarf_gdbarch_types *) gdbarch_data (this->gdbarch,
+ = (struct dwarf_gdbarch_types *) gdbarch_data (gdbarch,
dwarf_arch_cookie);
int ndx;
- if (this->addr_size == 2)
+ if (addr_size == 2)
ndx = 0;
- else if (this->addr_size == 4)
+ else if (addr_size == 4)
ndx = 1;
- else if (this->addr_size == 8)
+ else if (addr_size == 8)
ndx = 2;
else
error (_("Unsupported address size in DWARF expressions: %d bits"),
- 8 * this->addr_size);
+ 8 * addr_size);
if (types->dw_types[ndx] == NULL)
types->dw_types[ndx]
- = arch_integer_type (this->gdbarch,
- 8 * this->addr_size,
+ = arch_integer_type (gdbarch, HOST_CHAR_BIT * addr_size,
0, "<signed DWARF address type>");
return types->dw_types[ndx];
}
+/* Return the type used for DWARF operations where the type is
+ unspecified in the DWARF spec. Only certain sizes are
+ supported. */
+
+struct type *
+dwarf_expr_context::address_type () const
+{
+ return ::address_type (this->gdbarch, this->addr_size);
+}
+
/* Create a new context for the expression evaluator. */
dwarf_expr_context::dwarf_expr_context (dwarf2_per_objfile *per_objfile,
diff --git a/gdb/dwarf2/expr.h b/gdb/dwarf2/expr.h
index 1c06308f99..739731daf8 100644
--- a/gdb/dwarf2/expr.h
+++ b/gdb/dwarf2/expr.h
@@ -260,6 +260,10 @@ struct dwarf_expr_context
void read_mem (gdb_byte *buf, CORE_ADDR addr, size_t length);
};
+/* Return the address type used of the GDBARCH architecture and
+ ADDR_SIZE is expected size of the type. */
+struct type *address_type (struct gdbarch *gdbarch, int addr_size);
+
/* Return the value of register number REG (a DWARF register number),
read as an address in a given FRAME. */
CORE_ADDR read_addr_from_reg (struct frame_info *, int);
--
2.17.1
next prev parent reply other threads:[~2020-12-07 19:01 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-07 19:00 [PATCH 00/30] Allow location description on the DWARF stack Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 01/30] Replace the symbol needs evaluator with a parser Zoran Zaric via Gdb-patches
2021-01-21 21:16 ` Tom Tromey
2021-01-21 21:48 ` Zoran Zaric via Gdb-patches
2021-02-23 14:15 ` Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 02/30] Move frame context info to dwarf_expr_context Zoran Zaric via Gdb-patches
2021-01-21 21:23 ` Tom Tromey
2020-12-07 19:00 ` [PATCH 03/30] Remove get_frame_cfa from dwarf_expr_context Zoran Zaric via Gdb-patches
2021-01-21 21:23 ` Tom Tromey
2020-12-07 19:00 ` [PATCH 04/30] Move compilation unit info to dwarf_expr_context Zoran Zaric via Gdb-patches
2021-01-21 21:28 ` Tom Tromey
2021-02-23 14:21 ` Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 05/30] Move dwarf_call " Zoran Zaric via Gdb-patches
2021-01-21 21:30 ` Tom Tromey
2020-12-07 19:00 ` [PATCH 06/30] Move get_object_address " Zoran Zaric via Gdb-patches
2021-01-21 21:31 ` Tom Tromey
2021-02-23 14:33 ` Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 07/30] Move read_mem " Zoran Zaric via Gdb-patches
2021-01-21 21:34 ` Tom Tromey
2020-12-07 19:00 ` [PATCH 08/30] Move push_dwarf_reg_entry_value to expr.c Zoran Zaric via Gdb-patches
2021-01-21 21:35 ` Tom Tromey
2020-12-07 19:00 ` [PATCH 09/30] Inline get_reg_value method of dwarf_expr_context Zoran Zaric via Gdb-patches
2021-01-21 21:36 ` Tom Tromey
2020-12-07 19:00 ` [PATCH 10/30] Remove empty frame and full evaluators Zoran Zaric via Gdb-patches
2021-01-21 21:37 ` Tom Tromey
2020-12-07 19:00 ` [PATCH 11/30] Merge evaluate_for_locexpr_baton evaluator Zoran Zaric via Gdb-patches
2021-02-08 21:21 ` Tom Tromey
2020-12-07 19:00 ` [PATCH 12/30] Move piece_closure and its support to expr.c Zoran Zaric via Gdb-patches
2021-02-08 21:32 ` Tom Tromey
2021-02-09 14:53 ` Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 13/30] Make DWARF evaluator return a single struct value Zoran Zaric via Gdb-patches
2021-02-08 21:35 ` Tom Tromey
2021-02-09 14:55 ` Zoran Zaric via Gdb-patches
2021-02-09 17:13 ` Tom Tromey
2020-12-07 19:00 ` [PATCH 14/30] Simplify dwarf_expr_context class interface Zoran Zaric via Gdb-patches
2021-02-08 21:38 ` Tom Tromey
2021-02-09 14:56 ` Zoran Zaric via Gdb-patches
2021-02-23 14:38 ` Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 15/30] Add as_lval argument to expression evaluator Zoran Zaric via Gdb-patches
2021-02-08 21:41 ` Tom Tromey
2021-02-09 15:25 ` Zoran Zaric via Gdb-patches
2021-02-09 20:33 ` Tom Tromey
2020-12-07 19:00 ` [PATCH 16/30] Add new register access interface to expr.c Zoran Zaric via Gdb-patches
2021-02-09 19:37 ` Tom Tromey
2020-12-07 19:00 ` [PATCH 17/30] Add new memory " Zoran Zaric via Gdb-patches
2021-02-09 19:45 ` Tom Tromey
2021-02-23 15:35 ` Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 18/30] Add new classes that model DWARF stack element Zoran Zaric via Gdb-patches
2021-02-08 21:54 ` Tom Tromey
2021-02-09 17:34 ` Zoran Zaric via Gdb-patches
2021-02-09 20:36 ` Tom Tromey
2021-02-09 21:07 ` Tom Tromey
2021-02-09 21:26 ` Zoran Zaric via Gdb-patches
2021-02-23 14:57 ` Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` Zoran Zaric via Gdb-patches [this message]
2021-02-08 21:46 ` [PATCH 19/30] Add new location description access interface Tom Tromey
2021-02-09 16:00 ` Zoran Zaric via Gdb-patches
2021-02-09 17:30 ` Zoran Zaric via Gdb-patches
2021-02-23 14:49 ` Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 20/30] Add dwarf_entry factory class to expr.c Zoran Zaric via Gdb-patches
2021-02-09 19:54 ` Tom Tromey
2020-12-07 19:00 ` [PATCH 21/30] Change DWARF stack to use new dwarf_entry classes Zoran Zaric via Gdb-patches
2021-02-09 20:11 ` Tom Tromey
2020-12-07 19:00 ` [PATCH 22/30] Remove dwarf_expr_context from expr.h interface Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 23/30] Rename and update the piece_closure structure Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 24/30] Move read_addr_from_reg function to frame.c Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 25/30] Add frame info check to DW_OP_reg operations Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 26/30] Remove DWARF expression composition check Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 27/30] Add support for any location description in CFI Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 28/30] Add DWARF operations for byte and bit offset Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 29/30] Add support for DW_OP_LLVM_undefined operation Zoran Zaric via Gdb-patches
2020-12-07 19:00 ` [PATCH 30/30] Add support for nested composite locations Zoran Zaric via Gdb-patches
2020-12-08 14:48 ` [PATCH 00/30] Allow location description on the DWARF stack Metzger, Markus T via Gdb-patches
2020-12-08 16:17 ` Simon Marchi via Gdb-patches
2020-12-09 0:30 ` Tye, Tony via Gdb-patches
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201207190031.13341-20-Zoran.Zaric@amd.com \
--to=gdb-patches@sourceware.org \
--cc=Zoran.Zaric@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox