From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lndn.lancelotsix.com (lndn.lancelotsix.com [51.195.220.111]) by sourceware.org (Postfix) with ESMTPS id 294DD3858C60 for ; Tue, 26 Oct 2021 20:52:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 294DD3858C60 Received: from ubuntu.lan (cust120-dsl54.idnet.net [212.69.54.120]) by lndn.lancelotsix.com (Postfix) with ESMTPSA id 24435819D4; Tue, 26 Oct 2021 20:52:12 +0000 (UTC) Date: Tue, 26 Oct 2021 20:52:07 +0000 From: Lancelot SIX To: Zoran Zaric Cc: gdb-patches@sourceware.org Subject: Re: [PATCH v3 12/28] Add indirect_implicit_ptr to dwarf_location class Message-ID: <20211026205207.4clp32vexbfxejme@ubuntu.lan> References: <20211014093235.69756-1-zoran.zaric@amd.com> <20211014093235.69756-13-zoran.zaric@amd.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20211014093235.69756-13-zoran.zaric@amd.com> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.5.11 (lndn.lancelotsix.com [0.0.0.0]); Tue, 26 Oct 2021 20:52:12 +0000 (UTC) X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Oct 2021 20:52:15 -0000 Hi, I have included very minor comments in the patch. On Thu, Oct 14, 2021 at 10:32:19AM +0100, Zoran Zaric via Gdb-patches wrote: > From: Zoran Zaric > > Similarly to the is_implicit_ptr_at method, the existing function > callback interface of the computed struct value, requiers a way to > apply indirection to an implicit pointer on a given offset of a given > length of an underlying location description. > > This is different then reading from a struct value object (previously then -> than > described write_to_gdb_value method) in a way that the result of this > operation is expected to be a struct value of a pointed source level > variable instead of reading the value of that variable. > > In the same way this is also different operation then the deref method then -> than > because the deref returns a read value of a given type from that > location description. > > gdb/ChangeLog: > > * dwarf2/expr.c (dwarf_location::indirect_implicit_ptr): > New method. > (dwarf_implicit_pointer::indirect_implicit_ptr): New method. > (dwarf_composite::indirect_implicit_ptr): New method. > --- > gdb/dwarf2/expr.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 73 insertions(+) > > diff --git a/gdb/dwarf2/expr.c b/gdb/dwarf2/expr.c > index aa36a992e09..af84710b054 100644 > --- a/gdb/dwarf2/expr.c > +++ b/gdb/dwarf2/expr.c > @@ -474,6 +474,24 @@ class dwarf_location : public dwarf_entry > return false; > } > > + /* Recursive indirecting of the implicit pointer location description > + if that location is or encapsulates an implicit pointer. The > + operation is performed in a given FRAME context, using the TYPE as > + the type of the pointer. Where POINTER_OFFSET is an offset > + applied to that implicit pointer location description before the > + operation. BIT_OFFSET is a bit offset applied to the location and ^^ Two spaces after the '.' here. Best, Lancelot. > + BIT_LENGTH is a bit length of the read. > + > + Indirecting is only performed on the implicit pointer location > + description parts of the location. */ > + virtual value *indirect_implicit_ptr (frame_info *frame, struct type *type, > + LONGEST pointer_offset = 0, > + LONGEST bit_offset = 0, > + int bit_length = 0) const > + { > + return nullptr; > + } > + > protected: > /* Architecture of the location. */ > gdbarch *m_arch; > @@ -1103,6 +1121,11 @@ class dwarf_implicit_pointer final : public dwarf_location > return true; > } > > + value *indirect_implicit_ptr (frame_info *frame, struct type *type, > + LONGEST pointer_offset = 0, > + LONGEST bit_offset = 0, > + int bit_length = 0) const override; > + > private: > /* Per object file data of the implicit pointer. */ > dwarf2_per_objfile *m_per_objfile; > @@ -1155,6 +1178,17 @@ dwarf_implicit_pointer::read (frame_info *frame, gdb_byte *buf, > } > } > > +value * > +dwarf_implicit_pointer::indirect_implicit_ptr (frame_info *frame, > + struct type *type, > + LONGEST pointer_offset, > + LONGEST bit_offset, > + int bit_length) const > +{ > + return indirect_synthetic_pointer (m_die_offset, m_offset + pointer_offset, > + m_per_cu, m_per_objfile, frame, type); > +} > + > /* Composite location description entry. */ > > class dwarf_composite final : public dwarf_location > @@ -1191,6 +1225,11 @@ class dwarf_composite final : public dwarf_location > > bool is_implicit_ptr_at (LONGEST bit_offset, int bit_length) const override; > > + value *indirect_implicit_ptr (frame_info *frame, struct type *type, > + LONGEST pointer_offset = 0, > + LONGEST bit_offset = 0, > + int bit_length = 0) const override; > + > private: > /* Composite piece that contains a piece location > description and it's size. */ > @@ -1424,6 +1463,40 @@ dwarf_composite::is_implicit_ptr_at (LONGEST bit_offset, int bit_length) const > return false; > } > > +value * > +dwarf_composite::indirect_implicit_ptr (frame_info *frame, struct type *type, > + LONGEST pointer_offset, > + LONGEST bit_offset, > + int bit_length) const > +{ > + LONGEST total_bit_offset = HOST_CHAR_BIT * m_offset > + + m_bit_suboffset + bit_offset; > + > + /* Advance to the first non-skipped piece. */ > + for (const piece &piece : m_pieces) > + { > + ULONGEST read_bit_length = piece.size; > + > + if (total_bit_offset >= read_bit_length) > + { > + total_bit_offset -= read_bit_length; > + continue; > + } > + > + read_bit_length -= total_bit_offset; > + > + if (bit_length < read_bit_length) > + read_bit_length = bit_length; > + > + return piece.location->indirect_implicit_ptr (frame, type, > + pointer_offset, > + total_bit_offset, > + read_bit_length); > + } > + > + return nullptr; > +} > + > struct piece_closure > { > /* Reference count. */ > -- > 2.17.1 >