From: Simon Marchi via Gdb-patches <gdb-patches@sourceware.org>
To: Zoran Zaric <Zoran.Zaric@amd.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH 05/43] Move compilation unit info to dwarf_expr_context
Date: Mon, 26 Apr 2021 22:58:04 -0400 [thread overview]
Message-ID: <0f9cd647-7eef-0d22-875f-dc2bacd8ebe3@polymtl.ca> (raw)
In-Reply-To: <20210301144620.103016-6-Zoran.Zaric@amd.com>
On 2021-03-01 9:45 a.m., Zoran Zaric via Gdb-patches wrote:
> From: Zoran Zaric <zoran.zaric@amd.com>
>
> This patch moves the compilation unit context information and support
> from dwarf_expr_executor and dwarf_evaluate_loc_desc to
> dwarf_expr_context evaluator. The idea is to report an error when a
> given operation requires a compilation unit information to be resolved,
> which is not available.
>
> gdb/ChangeLog:
>
> * dwarf2/expr.c (ensure_have_per_cu): New function.
> (dwarf_expr_context::dwarf_expr_context): Add compilation unit
> context information.
> (dwarf_expr_context::get_base_type): Move from
> dwarf_evaluate_loc_desc.
> (dwarf_expr_context::get_addr_index): Remove method.
> (dwarf_expr_context::dwarf_variable_value): Remove method.
> (dwarf_expr_context::execute_stack_op): Call compilation unit
> context info check. Inline get_addr_index and
> dwarf_variable_value methods.
> * dwarf2/expr.h (struct dwarf_expr_context): Add compilation
> context info. Remove get_addr_index and dwarf_variable_value.
> * dwarf2/frame.c (dwarf_expr_executor::get_addr_index): Remove
> method.
> (dwarf_expr_executor::dwarf_variable_value): Remove method.
> * dwarf2/loc.c (sect_variable_value): Expose function.
> (dwarf_evaluate_loc_desc::get_addr_index): Remove method.
> (dwarf_evaluate_loc_desc::dwarf_variable_value): Remove method.
> (class dwarf_evaluate_loc_desc): Move compilation unit context
> information to dwarf_expr_context class.
> * dwarf2/loc.h (sect_variable_value): Expose function.
> ---
> gdb/dwarf2/expr.c | 55 +++++++++++++++++++++++++++++++++++++++-------
> gdb/dwarf2/expr.h | 26 ++++++++--------------
> gdb/dwarf2/frame.c | 10 ---------
> gdb/dwarf2/loc.c | 35 +++--------------------------
> gdb/dwarf2/loc.h | 8 +++++++
> 5 files changed, 67 insertions(+), 67 deletions(-)
>
> diff --git a/gdb/dwarf2/expr.c b/gdb/dwarf2/expr.c
> index 6b5cba6b7b4..5a0a4a4299c 100644
> --- a/gdb/dwarf2/expr.c
> +++ b/gdb/dwarf2/expr.c
> @@ -72,6 +72,20 @@ ensure_have_frame (struct frame_info *frame, const char *op_name)
> _("%s evaluation requires a frame."), op_name);
> }
>
> +/* Ensure that a PER_CU is defined and throw an exception otherwise.
> +
> + Throwing NOT_AVAILABLE_ERROR error so that a client can chose
> + to react differently if the evaluation ended because there
> + was a missing context information. */
> +
> +static void
> +ensure_have_per_cu (struct dwarf2_per_cu_data *per_cu, const char* op_name)
> +{
> + if (per_cu == nullptr)
> + throw_error (NOT_AVAILABLE_ERROR,
> + _("%s evaluation requires a compilation unit."), op_name);
> +}
Same comment as earlier about NOT_AVAILABLE_ERROR, and about wrapping
per_cu to force accessing it through a getter that throws if it is
nullptr (whatever we end up doing for the frame should be done here).
> +
> /* See expr.h. */
>
> CORE_ADDR
> @@ -201,6 +215,25 @@ dwarf_expr_context::get_frame_base (const gdb_byte **start,
> start, length);
> }
>
> +/* See expr.h. */
> +
> +struct type *
> +dwarf_expr_context::get_base_type (cu_offset die_cu_off, int size)
> +{
> + if (per_cu == nullptr)
> + return builtin_type (this->gdbarch)->builtin_int;
Ok, so this seems to be a case where we need to check if per_cu is
nullptr or not. The getter that throws won't work here, but there could
be an `has_per_cu ()` method on the side.
> +
> + struct type *result = dwarf2_get_die_type (die_cu_off, per_cu, per_objfile);
> +
> + if (result == NULL)
> + error (_("Could not find type for DW_OP_const_type"));
Might as well change this NULL for nullptr.
> +
> + if (size != 0 && TYPE_LENGTH (result) != size)
> + error (_("DW_OP_const_type has different sizes for type and data"));
> +
> + return result;
> +}
I find get_base_type a bit awkward. Do you think you could split it in
two:
- get_base_type
- get_base_type_check_size
... where get_base_type_check_size uses get_base_type? The callers that
don't need the size checking wouldn't need to pass 0.
I also find it awkward that get_base_type hardcodes DW_OP_const_type in
its error message, given that it's used in the context of many other
operators. In the end we understand that DW_OP_const_type is the only
case that passes size != 0, so it's the only case where that error can
possibly be thrown. But if you could pass the op name as a parameter,
like you did for the ensure_have_per_cu function, I think it would make
things better.
Or, since that size checking is only used when handling
DW_OP_const_type, we could in-line that code in the caller and not
bother with having get_base_type_check_size.
> @@ -834,10 +873,7 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr,
> case DW_OP_GNU_implicit_pointer:
> {
> int64_t len;
> -
> - if (this->ref_addr_size == -1)
> - error (_("DWARF-2 expression error: DW_OP_implicit_pointer "
> - "is not allowed in frame context"));
> + ensure_have_per_cu (per_cu, "DW_OP_implicit_pointer");
>
> /* The referred-to DIE of sect_offset kind. */
> this->len = extract_unsigned_integer (op_ptr, this->ref_addr_size,
This case would be a bit weird with my suggestion of per_cu getter that
throws if per_cu is nullptr, because nothing actually uses per_cu here.
But, I think that in the end we could get rid of the
`this->ref_addr_size` field, and use `this->per_cu ()->ref_addr_size
()`.
Simon
next prev parent reply other threads:[~2021-04-27 2:58 UTC|newest]
Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-01 14:45 [PATCH 00/43 V2] Allow location description on the DWARF stack Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 01/43] Replace the symbol needs evaluator with a parser Zoran Zaric via Gdb-patches
2021-04-27 1:20 ` Simon Marchi via Gdb-patches
2021-04-28 10:17 ` Zoran Zaric via Gdb-patches
2021-04-28 14:08 ` Simon Marchi via Gdb-patches
2021-04-28 15:02 ` Zoran Zaric via Gdb-patches
2021-04-28 15:31 ` Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 02/43] Cleanup of the dwarf_expr_context constructor Zoran Zaric via Gdb-patches
2021-04-27 1:23 ` Simon Marchi via Gdb-patches
2021-04-28 10:19 ` Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 03/43] Move frame context info to dwarf_expr_context Zoran Zaric via Gdb-patches
2021-04-27 2:19 ` Simon Marchi via Gdb-patches
2021-04-28 10:51 ` Zoran Zaric via Gdb-patches
2021-04-28 14:14 ` Simon Marchi via Gdb-patches
2021-04-28 15:55 ` Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 04/43] Remove get_frame_cfa from dwarf_expr_context Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 05/43] Move compilation unit info to dwarf_expr_context Zoran Zaric via Gdb-patches
2021-04-27 2:58 ` Simon Marchi via Gdb-patches [this message]
2021-04-28 11:28 ` Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 06/43] Move dwarf_call " Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 07/43] Move get_object_address " Zoran Zaric via Gdb-patches
2021-04-27 3:12 ` Simon Marchi via Gdb-patches
2021-04-28 11:34 ` Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 08/43] Move read_mem " Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 09/43] Move push_dwarf_reg_entry_value to expr.c Zoran Zaric via Gdb-patches
2021-04-27 3:56 ` Simon Marchi via Gdb-patches
2021-04-28 11:36 ` Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 10/43] Inline get_reg_value method of dwarf_expr_context Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 11/43] Remove empty frame and full evaluators Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 12/43] Merge evaluate_for_locexpr_baton evaluator Zoran Zaric via Gdb-patches
2021-04-28 1:33 ` Simon Marchi via Gdb-patches
2021-04-28 11:39 ` Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 13/43] Move piece_closure and its support to expr.c Zoran Zaric via Gdb-patches
2021-04-28 1:56 ` Simon Marchi via Gdb-patches
2021-04-28 11:40 ` Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 14/43] Make value_copy also copy the stack data member Zoran Zaric via Gdb-patches
2021-04-28 2:01 ` Simon Marchi via Gdb-patches
2021-04-28 11:43 ` Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 15/43] Make DWARF evaluator return a single struct value Zoran Zaric via Gdb-patches
2021-04-28 2:21 ` Simon Marchi via Gdb-patches
2021-04-28 11:47 ` Zoran Zaric via Gdb-patches
2021-04-28 14:24 ` Simon Marchi via Gdb-patches
2021-03-01 14:45 ` [PATCH 16/43] Simplify dwarf_expr_context class interface Zoran Zaric via Gdb-patches
2021-04-28 2:45 ` Simon Marchi via Gdb-patches
2021-04-28 13:15 ` Zoran Zaric via Gdb-patches
2021-04-28 14:41 ` Simon Marchi via Gdb-patches
2021-04-28 15:39 ` Zoran Zaric via Gdb-patches
2021-04-28 19:19 ` Simon Marchi via Gdb-patches
2021-04-29 15:49 ` Simon Marchi via Gdb-patches
2021-04-29 15:55 ` Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 17/43] Add as_lval argument to expression evaluator Zoran Zaric via Gdb-patches
2021-04-28 3:04 ` Simon Marchi via Gdb-patches
2021-04-28 13:16 ` Zoran Zaric via Gdb-patches
2021-04-28 3:30 ` Simon Marchi via Gdb-patches
2021-03-01 14:45 ` [PATCH 18/43] Add new register access interface to expr.c Zoran Zaric via Gdb-patches
2021-03-08 23:52 ` Lancelot SIX via Gdb-patches
2021-04-28 3:25 ` Simon Marchi via Gdb-patches
2021-04-28 13:29 ` Zoran Zaric via Gdb-patches
2021-04-28 14:48 ` Simon Marchi via Gdb-patches
2021-04-28 15:42 ` Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 19/43] Add new memory " Zoran Zaric via Gdb-patches
2021-04-30 21:24 ` Simon Marchi via Gdb-patches
2021-03-01 14:45 ` [PATCH 20/43] Add new classes that model DWARF stack element Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 21/43] Add to_location method to DWARF entry classes Zoran Zaric via Gdb-patches
2021-03-01 14:45 ` [PATCH 22/43] Add to_value " Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 23/43] Add read method to location description classes Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 24/43] Add write " Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 25/43] Add deref " Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 26/43] Add read_from_gdb_value method to dwarf_location Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 27/43] Add write_to_gdb_value " Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 28/43] Add is_implicit_ptr_at " Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 29/43] Add indirect_implicit_ptr to dwarf_location class Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 30/43] Add new computed struct value callback interface Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 31/43] Add to_gdb_value method to DWARF entry class Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 32/43] Change DWARF stack to use new dwarf_entry classes Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 33/43] Remove old computed struct value callbacks Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 34/43] Comments cleanup between expr.h and expr.c Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 35/43] Remove dwarf_expr_context from expr.h interface Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 36/43] Move read_addr_from_reg function to frame.c Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 37/43] Add frame info check to DW_OP_reg operations Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 38/43] Remove DWARF expression composition check Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 39/43] Change back the symbol needs to use the evaluator Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 40/43] Add support for any location description in CFI Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 41/43] Add DWARF operations for byte and bit offset Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 42/43] Add support for DW_OP_LLVM_undefined operation Zoran Zaric via Gdb-patches
2021-03-01 14:46 ` [PATCH 43/43] Add support for nested composite locations Zoran Zaric 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=0f9cd647-7eef-0d22-875f-dc2bacd8ebe3@polymtl.ca \
--to=gdb-patches@sourceware.org \
--cc=Zoran.Zaric@amd.com \
--cc=simon.marchi@polymtl.ca \
/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