public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 00/43 V2] Allow location description on the DWARF stack
@ 2021-03-01 14:45 Zoran Zaric
  2021-03-01 14:45 ` [PATCH 01/43] Replace the symbol needs evaluator with a parser Zoran Zaric
                   ` (42 more replies)
  0 siblings, 43 replies; 86+ messages in thread
From: Zoran Zaric @ 2021-03-01 14:45 UTC (permalink / raw)
  To: gdb-patches

Based on gdb master: 8255cf421c513747b7e189f932ca6e5b450e0d46

The idea of this patch series is to cleanup the design of the DWARF
expression evaluator (dwarf_expr_context class) and allow a future
extensions of that 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 sixteen
patches could be viewed as a standalone subset that introduces a
welcome cleanup of the DWARF expression evaluator module.

Zoran Zaric (43):
  Replace the symbol needs evaluator with a parser
  Cleanup of the dwarf_expr_context constructor
  Move frame context info to dwarf_expr_context
  Remove get_frame_cfa from dwarf_expr_context
  Move compilation unit info to dwarf_expr_context
  Move dwarf_call to dwarf_expr_context
  Move get_object_address to dwarf_expr_context
  Move read_mem to dwarf_expr_context
  Move push_dwarf_reg_entry_value to expr.c
  Inline get_reg_value method of dwarf_expr_context
  Remove empty frame and full evaluators
  Merge evaluate_for_locexpr_baton evaluator
  Move piece_closure and its support to expr.c
  Make value_copy also copy the stack data member
  Make DWARF evaluator return a single struct value
  Simplify dwarf_expr_context class interface
  Add as_lval argument to expression evaluator
  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 entry classes
  Add to_value method to DWARF entry classes
  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 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
  Change back the symbol needs to use the evaluator
  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

 gdb/ada-lang.c                                |    2 +-
 gdb/compile/compile-loc2c.c                   |   11 +
 gdb/dwarf2/expr.c                             | 3419 +++++++++++++++--
 gdb/dwarf2/expr.h                             |  275 +-
 gdb/dwarf2/frame.c                            |  163 +-
 gdb/dwarf2/loc.c                              | 1271 +-----
 gdb/dwarf2/loc.h                              |   34 +-
 gdb/f-lang.c                                  |    4 +-
 gdb/findvar.c                                 |    4 +-
 gdb/frame.c                                   |   37 +-
 gdb/testsuite/gdb.dwarf2/dw2-llvm-offset.exp  |  328 ++
 .../gdb.dwarf2/dw2-llvm-piece-end.exp         |  192 +
 .../gdb.dwarf2/dw2-llvm-undefined.exp         |  144 +
 gdb/testsuite/gdb.dwarf2/symbol_needs_eval.c  |   25 +
 .../gdb.dwarf2/symbol_needs_eval_fail.exp     |  108 +
 .../gdb.dwarf2/symbol_needs_eval_timeout.exp  |  127 +
 .../amd64-py-framefilter-invalidarg.S         |    1 -
 gdb/testsuite/lib/dwarf.exp                   |    8 +
 gdb/valops.c                                  |  129 +-
 gdb/value.c                                   |   69 +-
 gdb/value.h                                   |    4 +-
 include/dwarf2.def                            |    6 +
 22 files changed, 4329 insertions(+), 2032 deletions(-)
 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-undefined.exp
 create mode 100644 gdb/testsuite/gdb.dwarf2/symbol_needs_eval.c
 create mode 100644 gdb/testsuite/gdb.dwarf2/symbol_needs_eval_fail.exp
 create mode 100644 gdb/testsuite/gdb.dwarf2/symbol_needs_eval_timeout.exp

-- 
2.17.1


^ permalink raw reply	[flat|nested] 86+ messages in thread

end of thread, other threads:[~2021-04-30 21:24 UTC | newest]

Thread overview: 86+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-01 14:45 [PATCH 00/43 V2] Allow location description on the DWARF stack Zoran Zaric
2021-03-01 14:45 ` [PATCH 01/43] Replace the symbol needs evaluator with a parser Zoran Zaric
2021-04-27  1:20   ` Simon Marchi
2021-04-28 10:17     ` Zoran Zaric
2021-04-28 14:08       ` Simon Marchi
2021-04-28 15:02         ` Zoran Zaric
2021-04-28 15:31         ` Zoran Zaric
2021-03-01 14:45 ` [PATCH 02/43] Cleanup of the dwarf_expr_context constructor Zoran Zaric
2021-04-27  1:23   ` Simon Marchi
2021-04-28 10:19     ` Zoran Zaric
2021-03-01 14:45 ` [PATCH 03/43] Move frame context info to dwarf_expr_context Zoran Zaric
2021-04-27  2:19   ` Simon Marchi
2021-04-28 10:51     ` Zoran Zaric
2021-04-28 14:14       ` Simon Marchi
2021-04-28 15:55         ` Zoran Zaric
2021-03-01 14:45 ` [PATCH 04/43] Remove get_frame_cfa from dwarf_expr_context Zoran Zaric
2021-03-01 14:45 ` [PATCH 05/43] Move compilation unit info to dwarf_expr_context Zoran Zaric
2021-04-27  2:58   ` Simon Marchi
2021-04-28 11:28     ` Zoran Zaric
2021-03-01 14:45 ` [PATCH 06/43] Move dwarf_call " Zoran Zaric
2021-03-01 14:45 ` [PATCH 07/43] Move get_object_address " Zoran Zaric
2021-04-27  3:12   ` Simon Marchi
2021-04-28 11:34     ` Zoran Zaric
2021-03-01 14:45 ` [PATCH 08/43] Move read_mem " Zoran Zaric
2021-03-01 14:45 ` [PATCH 09/43] Move push_dwarf_reg_entry_value to expr.c Zoran Zaric
2021-04-27  3:56   ` Simon Marchi
2021-04-28 11:36     ` Zoran Zaric
2021-03-01 14:45 ` [PATCH 10/43] Inline get_reg_value method of dwarf_expr_context Zoran Zaric
2021-03-01 14:45 ` [PATCH 11/43] Remove empty frame and full evaluators Zoran Zaric
2021-03-01 14:45 ` [PATCH 12/43] Merge evaluate_for_locexpr_baton evaluator Zoran Zaric
2021-04-28  1:33   ` Simon Marchi
2021-04-28 11:39     ` Zoran Zaric
2021-03-01 14:45 ` [PATCH 13/43] Move piece_closure and its support to expr.c Zoran Zaric
2021-04-28  1:56   ` Simon Marchi
2021-04-28 11:40     ` Zoran Zaric
2021-03-01 14:45 ` [PATCH 14/43] Make value_copy also copy the stack data member Zoran Zaric
2021-04-28  2:01   ` Simon Marchi
2021-04-28 11:43     ` Zoran Zaric
2021-03-01 14:45 ` [PATCH 15/43] Make DWARF evaluator return a single struct value Zoran Zaric
2021-04-28  2:21   ` Simon Marchi
2021-04-28 11:47     ` Zoran Zaric
2021-04-28 14:24       ` Simon Marchi
2021-03-01 14:45 ` [PATCH 16/43] Simplify dwarf_expr_context class interface Zoran Zaric
2021-04-28  2:45   ` Simon Marchi
2021-04-28 13:15     ` Zoran Zaric
2021-04-28 14:41       ` Simon Marchi
2021-04-28 15:39         ` Zoran Zaric
2021-04-28 19:19           ` Simon Marchi
2021-04-29 15:49       ` Simon Marchi
2021-04-29 15:55         ` Zoran Zaric
2021-03-01 14:45 ` [PATCH 17/43] Add as_lval argument to expression evaluator Zoran Zaric
2021-04-28  3:04   ` Simon Marchi
2021-04-28 13:16     ` Zoran Zaric
2021-04-28  3:30   ` Simon Marchi
2021-03-01 14:45 ` [PATCH 18/43] Add new register access interface to expr.c Zoran Zaric
2021-03-08 23:52   ` Lancelot SIX
2021-04-28  3:25   ` Simon Marchi
2021-04-28 13:29     ` Zoran Zaric
2021-04-28 14:48       ` Simon Marchi
2021-04-28 15:42         ` Zoran Zaric
2021-03-01 14:45 ` [PATCH 19/43] Add new memory " Zoran Zaric
2021-04-30 21:24   ` Simon Marchi
2021-03-01 14:45 ` [PATCH 20/43] Add new classes that model DWARF stack element Zoran Zaric
2021-03-01 14:45 ` [PATCH 21/43] Add to_location method to DWARF entry classes Zoran Zaric
2021-03-01 14:45 ` [PATCH 22/43] Add to_value " Zoran Zaric
2021-03-01 14:46 ` [PATCH 23/43] Add read method to location description classes Zoran Zaric
2021-03-01 14:46 ` [PATCH 24/43] Add write " Zoran Zaric
2021-03-01 14:46 ` [PATCH 25/43] Add deref " Zoran Zaric
2021-03-01 14:46 ` [PATCH 26/43] Add read_from_gdb_value method to dwarf_location Zoran Zaric
2021-03-01 14:46 ` [PATCH 27/43] Add write_to_gdb_value " Zoran Zaric
2021-03-01 14:46 ` [PATCH 28/43] Add is_implicit_ptr_at " Zoran Zaric
2021-03-01 14:46 ` [PATCH 29/43] Add indirect_implicit_ptr to dwarf_location class Zoran Zaric
2021-03-01 14:46 ` [PATCH 30/43] Add new computed struct value callback interface Zoran Zaric
2021-03-01 14:46 ` [PATCH 31/43] Add to_gdb_value method to DWARF entry class Zoran Zaric
2021-03-01 14:46 ` [PATCH 32/43] Change DWARF stack to use new dwarf_entry classes Zoran Zaric
2021-03-01 14:46 ` [PATCH 33/43] Remove old computed struct value callbacks Zoran Zaric
2021-03-01 14:46 ` [PATCH 34/43] Comments cleanup between expr.h and expr.c Zoran Zaric
2021-03-01 14:46 ` [PATCH 35/43] Remove dwarf_expr_context from expr.h interface Zoran Zaric
2021-03-01 14:46 ` [PATCH 36/43] Move read_addr_from_reg function to frame.c Zoran Zaric
2021-03-01 14:46 ` [PATCH 37/43] Add frame info check to DW_OP_reg operations Zoran Zaric
2021-03-01 14:46 ` [PATCH 38/43] Remove DWARF expression composition check Zoran Zaric
2021-03-01 14:46 ` [PATCH 39/43] Change back the symbol needs to use the evaluator Zoran Zaric
2021-03-01 14:46 ` [PATCH 40/43] Add support for any location description in CFI Zoran Zaric
2021-03-01 14:46 ` [PATCH 41/43] Add DWARF operations for byte and bit offset Zoran Zaric
2021-03-01 14:46 ` [PATCH 42/43] Add support for DW_OP_LLVM_undefined operation Zoran Zaric
2021-03-01 14:46 ` [PATCH 43/43] Add support for nested composite locations Zoran Zaric

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).