From: Zoran Zaric <zoran.zaric@amd.com>
To: <gdb-patches@sourceware.org>
Subject: [PATCH v4 00/28] Allow location description on the DWARF stack
Date: Fri, 5 Nov 2021 11:38:21 +0000 [thread overview]
Message-ID: <20211105113849.118800-1-zoran.zaric@amd.com> (raw)
Based on gdb master: c5967f38de59c7375970c09b2c8b8702a01eb9d2
The idea of this patch series is to allow a future extensions of the
DWARF expression evaluator needed for the upcoming vendor specific
DWARF extensions.
Main motivation behind this series of patches is AMD’s effort to
improve DWARF support for heavily optimized code, but more
specifically, optimized code for SIMD and SIMT architectures.
These patches are part of the AMD’s DWARF standard extensions that
can be found at:
https://llvm.org/docs/AMDGPUDwarfExtensionsForHeterogeneousDebugging.html
While trying to support optimized code for these architectures, we
found couple of restriction imposed by the version 5 of the standard:
- CFI describes restoring callee saved registers that are spilled.
Currently CFI only allows a location description that is a register,
memory address, or implicit location description. AMDGPU optimized
code may spill scalar registers into portions of vector registers.
This requires extending CFI to allow any location description.
- Optimized code may need to describe a variable that resides in pieces
that are in different kinds of storage which may include parts that
are in different kinds of memory address spaces. DWARF has the
concept of segment addresses. However, the segment cannot be
specified within a DWARF expression, which is only able to specify
the offset portion of a segment address. The segment index is only
provided by the entity that specifies the DWARF expression.
Therefore, the segment index is a property that can only be put on
complete objects, such as a variable. Another problem is with DWARF
DW_OP_xderef* operations, which allow a value to be converted into
an address of a specified address space which is then read. But it
provides no way to create a memory location description for an
address in the non-default address space.
- DW_OP_breg* treats the register as containing an address in the
default address space. It is required to be able to specify the
address space of the register value.
- There is really limited support for bit offsets of location
description. This issue was already found by others who worked
on packed array support for ADA language. The array could be packed
in such a way that their start is not byte alligned. There is no way
to describe this in DWARF, so gdb implementation in required for the
packed array to be copied to the byte alligned addresses and then
passed that buffer in the expression evaluator. This approach is
restrictive for more complex scenarios.
All these restriction are caused by the fact that DWARF stack can only
hold values which size is not bigger then the size of the DWARF generic
type. This means that intermediate result of any DWARF operation needs
to fit in such a small representation.
DWARF Version 5 does not allow location descriptions to be entries on
the DWARF stack. They can only be the final result of the evaluation of
a DWARF expression. However, by allowing a location description to be a
first-class entry on the DWARF stack it becomes possible to compose
expressions containing both values and location descriptions naturally.
It allows objects to be located in any kind of memory address space,
in registers, be implicit values, be undefined, or a composite of any
of these.
This approach unifies the location description operations with general
operations. This in turn allows addition of new DWARF operations which
can push a memory location description with any offset and in any kind
of memory address space.
The number of registers and the cost of memory operations is much
higher for some architectures than a typical CPU. The compiler attempts
to optimize whole variables and arrays into registers. Currently DWARF
only allows DW_OP_push_object_address and related operations to work
with a global memory location. With this change, push object address
mechanism can be modified to work with any location description. This
would also removed the need for the passed in buffer mechanism that ADA
and GO languages currently use.
The proposed implementation in this patch series is completely backward
compatible with the DWARF 5 standard.
Although the patch series is designed as a whole, the first 23
patches could be viewed as a standalone subset that introduces the idea
of allowing location descriptions on the DWARF expression stack, while
last 5 take advantage of that functionality to implement new set of
DWARF operation which would not be possible without it.
Zoran Zaric (28):
Add new register access interface to expr.c
Add new memory access interface to expr.c
Add new classes that model DWARF stack element
Add to_location method to dwarf_value class
Add to_value method to dwarf_location class
Add read method to location description classes
Add write method to location description classes
Add deref method to location description classes
Add read_from_gdb_value method to dwarf_location
Add write_to_gdb_value method to dwarf_location
Add is_implicit_ptr_at method to dwarf_location
Add indirect_implicit_ptr to dwarf_location class
Add is_optimized_out to dwarf_location class
Add new computed struct value callback interface
Add to_gdb_value method to DWARF entry class
Change DWARF stack to use new dwarf_entry classes
Remove old computed struct value callbacks
Comments cleanup between expr.h and expr.c
Remove dwarf_expr_context from expr.h interface
Move read_addr_from_reg function to frame.c
Add frame info check to DW_OP_reg operations
Remove DWARF expression composition check
Add support for any location description in CFI
Add DWARF operations for byte and bit offset
Add support for DW_OP_LLVM_undefined operation
Add support for nested composite locations
Add DW_OP_LLVM_extend DWARF operation
Add DW_OP_LLVM_select_bit_piece DWARF operation
gdb/ada-lang.c | 2 +-
gdb/compile/compile-loc2c.c | 16 +
gdb/dwarf2/expr.c | 4252 ++++++++++++-----
gdb/dwarf2/expr.h | 272 +-
gdb/dwarf2/frame.c | 74 +-
gdb/dwarf2/loc.c | 57 +-
gdb/f-lang.c | 6 +-
gdb/findvar.c | 4 +-
gdb/frame.c | 45 +-
gdb/testsuite/gdb.dwarf2/dw2-llvm-extend.exp | 147 +
gdb/testsuite/gdb.dwarf2/dw2-llvm-offset.exp | 328 ++
.../gdb.dwarf2/dw2-llvm-piece-end.exp | 191 +
.../gdb.dwarf2/dw2-llvm-select-bit-piece.exp | 138 +
.../gdb.dwarf2/dw2-llvm-undefined.exp | 144 +
gdb/testsuite/gdb.dwarf2/dw2-op-call.exp | 2 +-
gdb/testsuite/gdb.dwarf2/dw2-param-error.exp | 2 +-
.../gdb.dwarf2/dw2-stack-boundary.exp | 2 +-
gdb/testsuite/lib/dwarf.exp | 14 +
gdb/valops.c | 131 +-
gdb/value.c | 70 +-
gdb/value.h | 4 +-
gdbsupport/common-utils.h | 18 +
include/dwarf2.def | 8 +
23 files changed, 4425 insertions(+), 1502 deletions(-)
create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-llvm-extend.exp
create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-llvm-offset.exp
create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-llvm-piece-end.exp
create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-llvm-select-bit-piece.exp
create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-llvm-undefined.exp
--
2.17.1
next reply other threads:[~2021-11-05 11:39 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-05 11:38 Zoran Zaric [this message]
2021-11-05 11:38 ` [PATCH v4 01/28] Add new register access interface to expr.c Zoran Zaric
2021-12-14 20:34 ` Tom Tromey
2021-11-05 11:38 ` [PATCH v4 02/28] Add new memory " Zoran Zaric
2021-12-14 20:42 ` Tom Tromey
2021-11-05 11:38 ` [PATCH v4 03/28] Add new classes that model DWARF stack element Zoran Zaric
2021-12-14 21:10 ` Tom Tromey
2022-01-12 10:23 ` Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 04/28] Add to_location method to dwarf_value class Zoran Zaric
2021-12-14 21:16 ` Tom Tromey
2022-01-12 10:51 ` Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 05/28] Add to_value method to dwarf_location class Zoran Zaric
2021-12-14 21:34 ` Tom Tromey
2022-01-12 12:14 ` Zoran Zaric
2022-01-12 18:42 ` Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 06/28] Add read method to location description classes Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 07/28] Add write " Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 08/28] Add deref " Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 09/28] Add read_from_gdb_value method to dwarf_location Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 10/28] Add write_to_gdb_value " Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 11/28] Add is_implicit_ptr_at " Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 12/28] Add indirect_implicit_ptr to dwarf_location class Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 13/28] Add is_optimized_out " Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 14/28] Add new computed struct value callback interface Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 15/28] Add to_gdb_value method to DWARF entry class Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 16/28] Change DWARF stack to use new dwarf_entry classes Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 17/28] Remove old computed struct value callbacks Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 18/28] Comments cleanup between expr.h and expr.c Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 19/28] Remove dwarf_expr_context from expr.h interface Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 20/28] Move read_addr_from_reg function to frame.c Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 21/28] Add frame info check to DW_OP_reg operations Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 22/28] Remove DWARF expression composition check Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 23/28] Add support for any location description in CFI Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 24/28] Add DWARF operations for byte and bit offset Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 25/28] Add support for DW_OP_LLVM_undefined operation Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 26/28] Add support for nested composite locations Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 27/28] Add DW_OP_LLVM_extend DWARF operation Zoran Zaric
2021-11-05 11:38 ` [PATCH v4 28/28] Add DW_OP_LLVM_select_bit_piece " Zoran Zaric
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=20211105113849.118800-1-zoran.zaric@amd.com \
--to=zoran.zaric@amd.com \
--cc=gdb-patches@sourceware.org \
/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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).