From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id 554413858D32 for ; Mon, 23 Jan 2023 11:59:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 554413858D32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 8A83D1FDAA; Mon, 23 Jan 2023 11:59:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1674475190; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5RDEmRRrOoY7Wz+xHRmjk55h/lNYAaEqI3xcHSi4XMU=; b=CC6J4fkTCplMZ2pUuQuZUwrYNRvXKbRk2mJ2LbF9Vkgi16U+qEtgY86p+RBs+CdzwOUsFM n/n3uOtQ7MtvyJKxWMcg40jgyQ6FIsS5ExeAd1lpeYOPYLOYT1zhiEIdRY48FUcgfBWbHP OQ4mL9YyR8pqEeKuGgF4MzwbGWrd5cw= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1674475190; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5RDEmRRrOoY7Wz+xHRmjk55h/lNYAaEqI3xcHSi4XMU=; b=X+yjibKe249NnH6QjCFZefZ5tA2c83YE8r2TsNbphnz4ynn/iv22Lv7HsUbeWJHY4BBYb2 T5onvt/znmDQxRDw== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 68ECF134F5; Mon, 23 Jan 2023 11:59:50 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id mwxqGLZ2zmO0VQAAMHmgww (envelope-from ); Mon, 23 Jan 2023 11:59:50 +0000 Message-ID: <88c66a57-e69e-bd9f-7407-3b71fa9c6630@suse.de> Date: Mon, 23 Jan 2023 12:59:50 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Subject: Re: [PATCH 3/4] [gdb/tdep, aarch64] Fix frame address of last insn in leaf function Content-Language: en-US To: Luis Machado , gdb-patches@sourceware.org Cc: Bruno Larsen , Andrew Burgess References: <20230119104618.15503-1-tdevries@suse.de> <20230119104618.15503-4-tdevries@suse.de> From: Tom de Vries In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On 1/23/23 11:07, Luis Machado wrote: > On 1/19/23 10:46, Tom de Vries wrote: >> Consider the test-case test.c, compiled without debug info: >> ... >> void >> foo (const char *s) >> { >> } >> >> int >> main (void) >> { >>    foo ("foo"); >>    return 0; >> } >> ... >> >> Disassembly of foo: >> ... >> 0000000000400564 : >>    400564:       d10043ff        sub     sp, sp, #0x10 >>    400568:       f90007e0        str     x0, [sp, #8] >>    40056c:       d503201f        nop >>    400570:       910043ff        add     sp, sp, #0x10 >>    400574:       d65f03c0        ret >> ... >> >> Now, let's do "info frame" at each insn in foo, as well as printing $sp >> and $x29 (and strip the output of info frame to the first line, for >> brevity): >> ... >> $ gdb -q a.out >> Reading symbols from a.out... >> (gdb) b *foo >> Breakpoint 1 at 0x400564 >> (gdb) r >> Starting program: a.out >> >> Breakpoint 1, 0x0000000000400564 in foo () >> (gdb) display /x $sp >> 1: /x $sp = 0xfffffffff3a0 >> (gdb) display /x $x29 >> 2: /x $x29 = 0xfffffffff3a0 >> (gdb) info frame >> Stack level 0, frame at 0xfffffffff3a0: >> (gdb) si >> 0x0000000000400568 in foo () >> 1: /x $sp = 0xfffffffff390 >> 2: /x $x29 = 0xfffffffff3a0 >> (gdb) info frame >> Stack level 0, frame at 0xfffffffff3a0: >> (gdb) si >> 0x000000000040056c in foo () >> 1: /x $sp = 0xfffffffff390 >> 2: /x $x29 = 0xfffffffff3a0 >> (gdb) info frame >> Stack level 0, frame at 0xfffffffff3a0: >> (gdb) si >> 0x0000000000400570 in foo () >> 1: /x $sp = 0xfffffffff390 >> 2: /x $x29 = 0xfffffffff3a0 >> (gdb) info frame >> Stack level 0, frame at 0xfffffffff3a0: >> (gdb) si >> 0x0000000000400574 in foo () >> 1: /x $sp = 0xfffffffff3a0 >> 2: /x $x29 = 0xfffffffff3a0 >> (gdb) info frame >> Stack level 0, frame at 0xfffffffff3b0: >>   pc = 0x400574 in foo; saved pc = 0x40058c >> (gdb) si >> 0x000000000040058c in main () >> 1: /x $sp = 0xfffffffff3a0 >> 2: /x $x29 = 0xfffffffff3a0 >> ... >> >> The "frame at" bit lists 0xfffffffff3a0 except at the last insn, where it >> lists 0xfffffffff3b0. >> >> The frame address is calculated here in aarch64_make_prologue_cache_1: >> ... >>    unwound_fp = get_frame_register_unsigned (this_frame, >> cache->framereg); >>    if (unwound_fp == 0) >>      return; >> >>    cache->prev_sp = unwound_fp + cache->framesize; >> ... >> >> For insns after the prologue, we have cache->framereg == sp and >> cache->framesize == 16, so unwound_fp + cache->framesize gives the wrong >> answer once sp has been restored to entry value by the before-last insn. >> >> Fix this by detecting the situation that the sp has been restored. >> >> This fixes PR tdep/30011. >> >> This also fixes the aarch64 FAILs in gdb.reverse/solib-precsave.exp and >> gdb.reverse/solib-reverse.exp I reported in PR gdb/PR29721. > > I still see failures for gdb.reverse/solib-precsave.exp and > gdb.reverse/solib-reverse.exp for both Ubuntu 22.04 and 20.04 > on aarch64-linux. > > Running > /work/luimac01/work/builds/binutils-gdb-arm64-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.reverse/solib-prec > save.exp ... > FAIL: gdb.reverse/solib-precsave.exp: reverse-step into solib function one > FAIL: gdb.reverse/solib-precsave.exp: reverse-step within solib function > one > FAIL: gdb.reverse/solib-precsave.exp: reverse-step back to main one > FAIL: gdb.reverse/solib-precsave.exp: reverse-step into solib function two > FAIL: gdb.reverse/solib-precsave.exp: reverse-step within solib function > two > > Running > /work/luimac01/work/builds/binutils-gdb-arm64-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.reverse/solib-reve > rse.exp ... > FAIL: gdb.reverse/solib-reverse.exp: reverse-step into solib function one > FAIL: gdb.reverse/solib-reverse.exp: reverse-step within solib function one > FAIL: gdb.reverse/solib-reverse.exp: reverse-step back to main one > FAIL: gdb.reverse/solib-reverse.exp: reverse-step into solib function two > FAIL: gdb.reverse/solib-reverse.exp: reverse-step within solib function two > > Maybe it addresses a different issue, but what I'm seeing is possibly > something else (the linetable issue? I vaguely recall the situation for > that). >> Hi, that is very well possible. I'm not claiming to fix the test-case on aarch64 in general, I'm very specifically claiming to fix the FAILs I reported in a PR. BTW the first FAIL in the PR is also different than the one you report above, which is usually a hint that there may be a different root cause. I'll commit (using an updated commit message claiming both PRs tdep/30010 and tdep/30011) once I do another round of testing. Thanks, - Tom >> Tested on aarch64-linux. >> PR tdep/30011 >> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30011 >> --- >>   gdb/aarch64-tdep.c | 6 +++++- >>   1 file changed, 5 insertions(+), 1 deletion(-) >> >> diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c >> index b576d3b9d99..06349353716 100644 >> --- a/gdb/aarch64-tdep.c >> +++ b/gdb/aarch64-tdep.c >> @@ -996,7 +996,11 @@ aarch64_make_prologue_cache_1 (frame_info_ptr >> this_frame, >>     if (unwound_fp == 0) >>       return; >> -  cache->prev_sp = unwound_fp + cache->framesize; >> +  if (cache->framereg == AARCH64_SP_REGNUM >> +      && get_frame_register_unsigned (this_frame, AARCH64_FP_REGNUM) >> == unwound_fp) >> +    cache->prev_sp = unwound_fp; >> +  else >> +    cache->prev_sp = unwound_fp + cache->framesize; >>     /* Calculate actual addresses of saved registers using offsets >>        determined by aarch64_analyze_prologue.  */ >