From patchwork Tue Dec 19 15:57:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nikola Prica X-Patchwork-Id: 25014 Received: (qmail 94813 invoked by alias); 19 Dec 2017 15:57:42 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 93700 invoked by uid 89); 19 Dec 2017 15:57:41 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-23.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, KAM_SHORT, RCVD_IN_DNSWL_NONE, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=assigns, rights X-HELO: mail.rt-rk.com Received: from mx2.rt-rk.com (HELO mail.rt-rk.com) (89.216.37.149) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 19 Dec 2017 15:57:38 +0000 Received: from localhost (localhost [127.0.0.1]) by mail.rt-rk.com (Postfix) with ESMTP id 0A6E01A5395; Tue, 19 Dec 2017 16:57:35 +0100 (CET) Received: from [10.10.13.119] (rtrkw512-lin.domain.local [10.10.13.119]) by mail.rt-rk.com (Postfix) with ESMTPSA id E2CEE1A5390; Tue, 19 Dec 2017 16:57:34 +0100 (CET) Subject: Re: [PING][PATCH] Fix for prologue processing on PowerPC To: pedromfc , Kevin Buettner Cc: gdb-patches@sourceware.org, "Ananthakrishna Sowda (asowda)" , "Ivan Baev (ibaev)" , 'Nemanja Popov' , Djordje Todorovic , Ulrich.Weigand@de.ibm.com References: <20171108095850.394a48ca@pinnacle.lan> <8bf0014c-e83c-5988-4d06-173572f21186@rt-rk.com> <7ba16b14-9384-34d9-937e-531a2192842a@linux.vnet.ibm.com> From: Nikola Prica Message-ID: Date: Tue, 19 Dec 2017 16:57:34 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <7ba16b14-9384-34d9-937e-531a2192842a@linux.vnet.ibm.com> Hello Pedro and Kevi, I've created and tested example based on your example. Thank you for that. > - I think it's more clear to only set lr_register when needed (pc > reaches the limit), as opposed to resetting it to -1 if pc didn't reach > the limit. The body of condition that becomes visitable after this patch invalidates lr_reg by setting it to -2 before reaching the limit. else if (lr_reg >= 0 && /* std Rx, NUM(r1) || stdu Rx, NUM(r1) */ (((op & 0xffff0000) == (lr_reg | 0xf8010000)) || /* stw Rx, NUM(r1) */ ((op & 0xffff0000) == (lr_reg | 0x90010000)) || /* stwu Rx, NUM(r1) */ ((op & 0xffff0000) == (lr_reg | 0x94010000)))) { /* where Rx == lr */ fdata->lr_offset = offset; fdata->nosavedpc = 0; /* Invalidate lr_reg, but don't set it to -1. That would mean that it had never been set. */ lr_reg = -2; ... Thanks, Nikola From 9aaddf9670d9f4cb7f088499febd1fa9c6a7076c Mon Sep 17 00:00:00 2001 From: Prica Date: Tue, 19 Dec 2017 14:29:09 +0100 Subject: [PATCH] Fix for prologue processing on PowerPc One of conditions in skip_prologue() is never visited because it expects non shifted `lr_reg`. That condtition is supposed to set PC offset. When body of this condition is visited PC offset is set and there will be no need to look for it in next frames nor to use frame unwind directives. gdb/ChangeLog: *rs600-tdep.c (skip_prologue): Remove shifting for lr_reg and assign shifted lr_reg to fdata->lr_register when lr_reg is set. If iteration do not hit lim_pc lr_register is set as -1. *testsuite/gdb.arch/ppc-prologue-frame.s: New file. *testsuite/gdb.arch/ppc-prologue-frame.c: Likewise. *testsuite/gdb.arch/ppr-prologue-frame.exp: Likewise. --- gdb/rs6000-tdep.c | 14 ++++--- gdb/testsuite/gdb.arch/powerpc-prologue-frame.c | 28 +++++++++++++ gdb/testsuite/gdb.arch/powerpc-prologue-frame.exp | 48 +++++++++++++++++++++++ gdb/testsuite/gdb.arch/powerpc-prologue-frame.s | 40 +++++++++++++++++++ 4 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 gdb/testsuite/gdb.arch/powerpc-prologue-frame.c create mode 100644 gdb/testsuite/gdb.arch/powerpc-prologue-frame.exp create mode 100644 gdb/testsuite/gdb.arch/powerpc-prologue-frame.s + .section .note.GNU-stack,"",@progbits diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 456dbcc..f0d2781 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -1655,9 +1655,13 @@ skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR lim_pc, remember just the first one, but skip over additional ones. */ if (lr_reg == -1) - lr_reg = (op & 0x03e00000) >> 21; - if (lr_reg == 0) - r0_contains_arg = 0; + { + lr_reg = (op & 0x03e00000); + fdata->lr_register = lr_reg >> 21; + } + if (lr_reg == 0) + r0_contains_arg = 0; + continue; } else if ((op & 0xfc1fffff) == 0x7c000026) @@ -2180,8 +2184,8 @@ skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR lim_pc, } #endif /* 0 */ - if (pc == lim_pc && lr_reg >= 0) - fdata->lr_register = lr_reg; + if (pc != lim_pc) + fdata->lr_register = -1; fdata->offset = -fdata->offset; return last_prologue_pc; diff --git a/gdb/testsuite/gdb.arch/powerpc-prologue-frame.c b/gdb/testsuite/gdb.arch/powerpc-prologue-frame.c new file mode 100644 index 0000000..f59210a --- /dev/null +++ b/gdb/testsuite/gdb.arch/powerpc-prologue-frame.c @@ -0,0 +1,28 @@ +/* This test is part of GDB, the GNU debugger. + + Copyright 2017 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int bar() +{ + return 0; +} + +int foo(); + +int main(void) +{ + return foo(); +} diff --git a/gdb/testsuite/gdb.arch/powerpc-prologue-frame.exp b/gdb/testsuite/gdb.arch/powerpc-prologue-frame.exp new file mode 100644 index 0000000..e90a8c1 --- /dev/null +++ b/gdb/testsuite/gdb.arch/powerpc-prologue-frame.exp @@ -0,0 +1,48 @@ +# Copyright 2017 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see + +if {![istarget "powerpc*"] } { + verbose "Skipping powerpc back trace test." + return +} + + +set main_testfile ppc-prolog-frame + +if {![istarget "powerpc*-*-*"]} then { + verbose "Skipping PowerPC instructions disassembly." + return -1 +} + + +if {[gdb_compile \ + [list ${srcdir}/${subdir}/$main_testfile.c ${srcdir}/${subdir}/$main_testfile.S] \ + [standard_output_file ${main_testfile}] \ + executable {debug}] != ""} { + untested "failed to build $main_testfile" + return -1 +} + + +clean_restart ${main_testfile} + +if ![runto bar] { + untested "could not run to bar" + return -1 +} + +gdb_test "bt" \ + "#0 \[x0-9a-f\]* bar \\(\\) at .*#1 \[x0-9a-f in\]* foo \\(\\) at .*#2 \[x0-9a-f in\]* main \\(\\) at .*" \ + "Backtrace to the main frame" diff --git a/gdb/testsuite/gdb.arch/powerpc-prologue-frame.s b/gdb/testsuite/gdb.arch/powerpc-prologue-frame.s new file mode 100644 index 0000000..16cd7e2 --- /dev/null +++ b/gdb/testsuite/gdb.arch/powerpc-prologue-frame.s @@ -0,0 +1,40 @@ +/* This test is part of GDB, the GNU debugger. + + Copyright 2017 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + .file "foo.c" + .section ".text" + .align 2 + .globl foo + .type foo, @function +foo: + stwu 1,-32(1) + mflr 3 + stw 3,36(1) + stw 31,28(1) + mr 31,1 + bl bar + mr 9,3 + mr 3,9 + addi 11,31,32 + lwz 0,4(11) + mtlr 0 + lwz 31,-4(11) + mr 1,11 + blr + .size foo,.-foo + .ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"