Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
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

  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