From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7850) id 28782385771E; Fri, 26 May 2023 06:57:54 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 28782385771E Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Indu Bhagat To: bfd-cvs@sourceware.org, gdb-cvs@sourceware.org Subject: [binutils-gdb] libsframe: revisit sframe_find_fre API X-Act-Checkin: binutils-gdb X-Git-Author: Indu Bhagat X-Git-Refname: refs/heads/master X-Git-Oldrev: 812d868850126d8e791795c7e248ffbf580925f6 X-Git-Newrev: 83c219872b2131546ccec7edc57eb47c64b8911d Message-Id: <20230526065754.28782385771E@sourceware.org> Date: Fri, 26 May 2023 06:57:54 +0000 (GMT) X-BeenThere: binutils-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 26 May 2023 06:57:54 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D83c219872b21= 31546ccec7edc57eb47c64b8911d commit 83c219872b2131546ccec7edc57eb47c64b8911d Author: Indu Bhagat Date: Thu May 25 23:44:09 2023 -0700 libsframe: revisit sframe_find_fre API =20 Inspite of implementing a rather simple functionality, this function was relatively difficult to follow, and maintain. Some changes are done now to address that - refactor the function and use better names to make it more readable. =20 The changes to the implementation do not cause any change in the contract of the API. =20 libsframe/ * sframe.c (sframe_fre_get_end_ip_offset): to here... (sframe_find_fre): Refactor some bits from... Diff: --- libsframe/sframe.c | 83 ++++++++++++++++++++++++++++++++------------------= ---- 1 file changed, 49 insertions(+), 34 deletions(-) diff --git a/libsframe/sframe.c b/libsframe/sframe.c index 72b221349ad..dadce2c1262 100644 --- a/libsframe/sframe.c +++ b/libsframe/sframe.c @@ -980,6 +980,32 @@ sframe_get_funcdesc_with_addr (sframe_decoder_ctx *ctx, return sframe_ret_set_errno (errp, SFRAME_ERR_FDE_NOTFOUND); } =20 +/* Get the end IP offset for the FRE at index i in the FDEP. The buffer F= RES + is the starting location for the FRE. */ + +static uint32_t +sframe_fre_get_end_ip_offset (sframe_func_desc_entry *fdep, unsigned int i, + const char *fres) +{ + uint32_t end_ip_offset; + uint32_t fre_type; + + fre_type =3D sframe_get_fre_type (fdep); + + /* Get the start address of the next FRE in sequence. */ + if (i < fdep->sfde_func_num_fres - 1) + { + sframe_decode_fre_start_address (fres, &end_ip_offset, fre_type); + end_ip_offset -=3D 1; + } + else + /* The end IP offset for the FRE needs to be deduced from the function + size. */ + end_ip_offset =3D fdep->sfde_func_size - 1; + + return end_ip_offset; +} + /* Find the SFrame Row Entry which contains the PC. Returns SFRAME_ERR if failure. */ =20 @@ -987,14 +1013,15 @@ int sframe_find_fre (sframe_decoder_ctx *ctx, int32_t pc, sframe_frame_row_entry *frep) { + sframe_frame_row_entry cur_fre; sframe_func_desc_entry *fdep; - uint32_t start_address, i; - sframe_frame_row_entry cur_fre, next_fre; - const char *fres; unsigned int fre_type, fde_type; - size_t esz; - int err =3D 0; + uint32_t end_ip_offset, i; + int32_t start_ip, end_ip; + int32_t func_start_addr; + const char *fres; size_t size =3D 0; + int err =3D 0; /* For regular FDEs (i.e. fde_type SFRAME_FDE_TYPE_PCINC), where the start address in the FRE is an offset from start pc, use a bitmask with all bits set so that none of the address bits are @@ -1022,40 +1049,28 @@ sframe_find_fre (sframe_decoder_ctx *ctx, int32_t p= c, bitmask =3D 0xff; =20 fres =3D ctx->sfd_fres + fdep->sfde_func_start_fre_off; + func_start_addr =3D fdep->sfde_func_start_address; + for (i =3D 0; i < fdep->sfde_func_num_fres; i++) { - err =3D sframe_decode_fre (fres, &next_fre, fre_type, &esz); - start_address =3D next_fre.fre_start_addr; + err =3D sframe_decode_fre (fres, &cur_fre, fre_type, &size); + if (err) + return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL); =20 - if (((fdep->sfde_func_start_address - + (int32_t) start_address) & bitmask) <=3D (pc & bitmask)) + start_ip =3D func_start_addr + cur_fre.fre_start_addr; + end_ip_offset =3D sframe_fre_get_end_ip_offset (fdep, i, fres + size); + end_ip =3D func_start_addr + end_ip_offset; + + if ((start_ip & bitmask) > (pc & bitmask)) + return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL); + + if (((start_ip & bitmask) <=3D (pc & bitmask)) + && (end_ip & bitmask) >=3D (pc & bitmask)) { - sframe_frame_row_entry_copy (&cur_fre, &next_fre); - - /* Get the next FRE in sequence. */ - if (i < fdep->sfde_func_num_fres - 1) - { - sp +=3D esz; - err =3D sframe_decode_fre (fres, &next_fre, fre_type, &esz); - - /* Sanity check the next FRE. */ - if (!sframe_fre_sanity_check_p (&next_fre)) - return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL); - - size =3D next_fre.fre_start_addr; - } - else size =3D fdep->sfde_func_size; - - /* If the cur FRE is the one that contains the PC, return it. */ - if (((fdep->sfde_func_start_address - + (int32_t)size) & bitmask) > (pc & bitmask)) - { - sframe_frame_row_entry_copy (frep, &cur_fre); - return 0; - } + sframe_frame_row_entry_copy (frep, &cur_fre); + return 0; } - else - return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL); + fres +=3D size; } return sframe_set_errno (&err, SFRAME_ERR_FDE_INVAL); }