public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Tom de Vries <tdevries@suse.de>
To: Luis Machado <luis.machado@arm.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH] Fix PR30369 regression on aarch64/arm (PR30506)
Date: Wed, 7 Jun 2023 11:55:06 +0200	[thread overview]
Message-ID: <ce62f8aa-5858-b0bc-1c93-c3f393a5ca32@suse.de> (raw)
In-Reply-To: <20230607094010.57892-1-luis.machado@arm.com>

On 6/7/23 11:40, Luis Machado wrote:
> From: Tom de Vries <tdevries@suse.de>
> 
> The gdb.dwarf2/dw2-prologue-end-2.exp test was failing for both AArch64 and
> Arm.
> 
> As Tom pointed out here (https://inbox.sourceware.org/gdb-patches/6663707c-4297-c2f2-a0bd-f3e84fc62aad@suse.de/),
> there are issues with both the prologue skipper for AArch64 and Arm and an
> incorrect assumption by the testcase.
> 
> This patch fixes both of AArch64's and Arm's prologue skippers to not skip past
> the end of a function.  It also incorporates a fix to the testcase so it
> doesn't assume the prologue skipper will stop at the first instruction of the
> functions/labels.
> 
> Regression-tested on aarch64-linux/arm-linux Ubuntu 20.04/22.04 and
> x86_64-linux Ubuntu 20.04.
> 

Hi Luis,

thanks for picking this up.

LGTM.

Thanks,
- Tom

> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30506
> 
> Co-Authored-By: Tom de Vries <tdevries@suse.de>
> Co-Authored-By: Luis Machado <luis.machado@arm.com>
> ---
>   gdb/aarch64-tdep.c                            | 10 +++++++--
>   gdb/arm-tdep.c                                | 21 ++++++++++++++++---
>   .../gdb.dwarf2/dw2-prologue-end-2.exp         | 10 ++++-----
>   3 files changed, 31 insertions(+), 10 deletions(-)
> 
> diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c
> index d8603c45fd3..84a90b63b55 100644
> --- a/gdb/aarch64-tdep.c
> +++ b/gdb/aarch64-tdep.c
> @@ -917,12 +917,15 @@ aarch64_analyze_prologue_test (void)
>   static CORE_ADDR
>   aarch64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
>   {
> -  CORE_ADDR func_addr, limit_pc;
> +  CORE_ADDR func_addr, func_end_addr, limit_pc;
>   
>     /* See if we can determine the end of the prologue via the symbol
>        table.  If so, then return either PC, or the PC after the
>        prologue, whichever is greater.  */
> -  if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
> +  bool func_addr_found
> +    = find_pc_partial_function (pc, NULL, &func_addr, &func_end_addr);
> +
> +  if (func_addr_found)
>       {
>         CORE_ADDR post_prologue_pc
>   	= skip_prologue_using_sal (gdbarch, func_addr);
> @@ -942,6 +945,9 @@ aarch64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
>     if (limit_pc == 0)
>       limit_pc = pc + 128;	/* Magic.  */
>   
> +  limit_pc
> +    = func_end_addr == 0? limit_pc : std::min (limit_pc, func_end_addr - 4);
> +
>     /* Try disassembling prologue.  */
>     return aarch64_analyze_prologue (gdbarch, pc, limit_pc, NULL);
>   }
> diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
> index d5128754f02..a0f59557072 100644
> --- a/gdb/arm-tdep.c
> +++ b/gdb/arm-tdep.c
> @@ -1769,12 +1769,18 @@ arm_skip_stack_protector(CORE_ADDR pc, struct gdbarch *gdbarch)
>   static CORE_ADDR
>   arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
>   {
> -  CORE_ADDR func_addr, limit_pc;
> +  CORE_ADDR func_addr, func_end_addr, limit_pc;
>   
>     /* See if we can determine the end of the prologue via the symbol table.
>        If so, then return either PC, or the PC after the prologue, whichever
>        is greater.  */
> -  if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
> +  bool func_addr_found
> +    = find_pc_partial_function (pc, NULL, &func_addr, &func_end_addr);
> +
> +  /* Whether the function is thumb mode or not.  */
> +  bool func_is_thumb = false;
> +
> +  if (func_addr_found)
>       {
>         CORE_ADDR post_prologue_pc
>   	= skip_prologue_using_sal (gdbarch, func_addr);
> @@ -1811,7 +1817,8 @@ arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
>   	     associate prologue code with the opening brace; so this
>   	     lets us skip the first line if we think it is the opening
>   	     brace.  */
> -	  if (arm_pc_is_thumb (gdbarch, func_addr))
> +	  func_is_thumb = arm_pc_is_thumb (gdbarch, func_addr);
> +	  if (func_is_thumb)
>   	    analyzed_limit = thumb_analyze_prologue (gdbarch, func_addr,
>   						     post_prologue_pc, NULL);
>   	  else
> @@ -1837,6 +1844,14 @@ arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
>     if (limit_pc == 0)
>       limit_pc = pc + 64;          /* Magic.  */
>   
> +  /* Set the correct adjustment based on whether the function is thumb mode or
> +     not.  We use it to get the address of the last instruction in the
> +     function (as opposed to the first address of the next function).  */
> +  CORE_ADDR adjustment = func_is_thumb? 2 : 4;
> +
> +  limit_pc
> +    = func_end_addr == 0? limit_pc : std::min (limit_pc,
> +					       func_end_addr - adjustment);
>   
>     /* Check if this is Thumb code.  */
>     if (arm_pc_is_thumb (gdbarch, pc))
> diff --git a/gdb/testsuite/gdb.dwarf2/dw2-prologue-end-2.exp b/gdb/testsuite/gdb.dwarf2/dw2-prologue-end-2.exp
> index 488f85f9674..c506cfd55cc 100644
> --- a/gdb/testsuite/gdb.dwarf2/dw2-prologue-end-2.exp
> +++ b/gdb/testsuite/gdb.dwarf2/dw2-prologue-end-2.exp
> @@ -95,15 +95,15 @@ if { $break_addr == "" } {
>   
>   # Get the "foo_label" address.
>   
> -set foo_label_addr ""
> -gdb_test_multiple "print /x &foo_label" "" {
> +set bar_label_addr ""
> +gdb_test_multiple "print /x &bar_label" "" {
>       -re -wrap "= ($hex)" {
> -	set foo_label_addr $expect_out(1,string)
> +	set bar_label_addr $expect_out(1,string)
>   	pass $gdb_test_name
>       }
>   }
>   
> -if { $foo_label_addr == "" } {
> +if { $bar_label_addr == "" } {
>       return
>   }
>   
> @@ -115,4 +115,4 @@ gdb_test "print &foo_end == &bar_label" " = 1"
>   # Check that the breakpoint is set at the expected address.  Regression test
>   # for PR30369.
>   
> -gdb_assert { $break_addr == $foo_label_addr }
> +gdb_assert { $break_addr < $bar_label_addr }


  reply	other threads:[~2023-06-07  9:55 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-07  9:40 Luis Machado
2023-06-07  9:55 ` Tom de Vries [this message]
2023-06-07 11:01   ` Luis Machado
2023-06-09 14:25 ` Tom Tromey
2023-06-09 14:44   ` Luis Machado
2023-06-09 15:26     ` Tom Tromey
2023-06-09 15:28       ` Luis Machado

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=ce62f8aa-5858-b0bc-1c93-c3f393a5ca32@suse.de \
    --to=tdevries@suse.de \
    --cc=gdb-patches@sourceware.org \
    --cc=luis.machado@arm.com \
    /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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).