From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 2E1E23858D38 for ; Tue, 11 Apr 2023 09:13:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2E1E23858D38 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1681204405; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=2rgvrnt1xReB/ceEAI0ljo8G8w+y3PXDmqiAcqqeWWo=; b=hbH6XUNiEWK5uxv6uYeu8FPXS9C7vjKbkz1jXimnm2Oj383fl/WWvnUVTBxXEprQfK2O3j 0q0ksLHXhwmL1YtKI4HRuuxcplJW5lLfCEx5AU8o6szrAtlgNMteemT8zyNvChkT8TPxHo y7/zSIrR0quJTXin3ML7ARiD5WYksZ4= Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-132-DFYn2a5WOta7vCWd5Tmxxw-1; Tue, 11 Apr 2023 05:13:24 -0400 X-MC-Unique: DFYn2a5WOta7vCWd5Tmxxw-1 Received: by mail-ed1-f69.google.com with SMTP id a40-20020a509eab000000b005024c025bf4so46684054edf.14 for ; Tue, 11 Apr 2023 02:13:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1681204403; h=mime-version:message-id:date:references:in-reply-to:subject:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=2rgvrnt1xReB/ceEAI0ljo8G8w+y3PXDmqiAcqqeWWo=; b=WANn3d+aakp55m6Ge6xRe/QJERSEG8FagSmWeKCfB/CVWtJ5hLNgHR1NtpzwRZh1EO kPUvCckFsFOL6GWwtjOQ5pzp4N2FyNI8FEFwV1y2lUGp6dOdF6D9MakByogzlHZN/2dj eCb/dCTDUWDHcMFOsSlaR6Tt1vQQ42CgKo3lmRBgfGqIz/bdrhVezx8ISeLe+Q27D6Im 0RnZCTl2y31O65wKhs6oQo2+2jsZ/Ciq2YQxoZ3j5pSX3mLm9AWJFzyIA1VgSqlr+Wyu 2zPL71sB/yVWUAKPyUfxUzwkqabxeXFuHSFmS2AhnWvswHJVlb7MY/4iVGJlUJBkNPro FYaw== X-Gm-Message-State: AAQBX9c5Nh7AlkwquM2+KtSZK98nzbmmKgMr/wsVjksdgGtOLopLrTeG 5yBGv+QS8wMS9AxnQEcPucFI+CHQSiDw1ZiRRY+QrtpnJH1nu8xc3oh4cjxxHpc+UvAJmLuufZJ GC+UT0OVo4brIWRdQCzEXLseg23+mr+35aru3jW7K4T+G+L+wTmHUP1HQFAVaw6c46zeCWJPy1U hzEEbj9w== X-Received: by 2002:a17:907:8a85:b0:94a:474a:4dd5 with SMTP id sf5-20020a1709078a8500b0094a474a4dd5mr8698879ejc.9.1681204403399; Tue, 11 Apr 2023 02:13:23 -0700 (PDT) X-Google-Smtp-Source: AKy350aoYfFv39bZd8zLWh3FkczSefFn3BXLPeGSeWG6EPxsigE5x3OmGHVUl0WOG472IKeFk2XudA== X-Received: by 2002:a17:907:8a85:b0:94a:474a:4dd5 with SMTP id sf5-20020a1709078a8500b0094a474a4dd5mr8698861ejc.9.1681204402963; Tue, 11 Apr 2023 02:13:22 -0700 (PDT) Received: from localhost (95.72.115.87.dyn.plus.net. [87.115.72.95]) by smtp.gmail.com with ESMTPSA id ww7-20020a170907084700b00947a40ded80sm5906057ejb.104.2023.04.11.02.13.21 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Apr 2023 02:13:22 -0700 (PDT) From: Andrew Burgess To: gdb-patches@sourceware.org Subject: Re: [PATCH] gdb/riscv: Support c.li in prologue unwinder In-Reply-To: <87cf5601a8e0bbec24f14d03fac0d3240e79d5c1.1679911542.git.aburgess@redhat.com> References: <87cf5601a8e0bbec24f14d03fac0d3240e79d5c1.1679911542.git.aburgess@redhat.com> Date: Tue, 11 Apr 2023 10:13:21 +0100 Message-ID: <874jpmbx3i.fsf@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,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: Andrew Burgess writes: > I was seeing some failures in gdb.threads/omp-par-scope.exp when run > on a riscv64 target. It turns out the cause of the problem is that I > didn't have debug information installed for libgomp.so, which this > test makes use of. The test requires GDB to backtrace through a > libgomp function, and the riscv prologue unwinder was failing to > unwind this particular stack frame. > > The reason for the failure to unwind was that the function prologue > includes a c.li (compressed load immediate) instruction, and the riscv > prologue scanning unwinder doesn't know what to do with this > instruction, though the unwinder does understand c.lui (compressed > load unsigned immediate). > > This commit adds support for c.li. After this GDB is able to unwind > through libgomp, and I no longer see any unexpected failures in > gdb.threads/omp-par-scope.exp. > > I've also included a new test in gdb.arch/ which specifically checks > for our c.li support. I've gone ahead and pushed this. Thanks, Andrew > --- > gdb/riscv-tdep.c | 8 +++- > .../riscv64-unwind-prologue-with-c_li-foo.s | 47 +++++++++++++++++++ > .../riscv64-unwind-prologue-with-c_li.c | 29 ++++++++++++ > .../riscv64-unwind-prologue-with-c_li.exp | 42 +++++++++++++++++ > 4 files changed, 124 insertions(+), 2 deletions(-) > create mode 100644 gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li-foo.s > create mode 100644 gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.c > create mode 100644 gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.exp > > diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c > index 8024ffed3c2..a9c5418a7d9 100644 > --- a/gdb/riscv-tdep.c > +++ b/gdb/riscv-tdep.c > @@ -1529,6 +1529,7 @@ class riscv_insn > ADDW, > AUIPC, > LUI, > + LI, > SD, > SW, > LD, > @@ -1901,6 +1902,8 @@ riscv_insn::decode (struct gdbarch *gdbarch, CORE_ADDR pc) > m_rd = decode_register_index (ival, OP_SH_CRS1S); > m_imm.s = EXTRACT_CITYPE_LUI_IMM (ival); > } > + else if (is_c_li_insn (ival)) > + decode_ci_type_insn (LI, ival); > /* C_SD and C_FSW have the same opcode. C_SD is RV64 and RV128 only, > and C_FSW is RV32 only. */ > else if (xlen != 4 && is_c_sd_insn (ival)) > @@ -2053,10 +2056,11 @@ riscv_scan_prologue (struct gdbarch *gdbarch, > gdb_assert (insn.rd () < RISCV_NUM_INTEGER_REGS); > regs[insn.rd ()] = pv_constant (cur_pc + insn.imm_signed ()); > } > - else if (insn.opcode () == riscv_insn::LUI) > + else if (insn.opcode () == riscv_insn::LUI > + || insn.opcode () == riscv_insn::LI) > { > /* Handle: lui REG, n > - Where REG is not gp register. */ > + or: li REG, n */ > gdb_assert (insn.rd () < RISCV_NUM_INTEGER_REGS); > regs[insn.rd ()] = pv_constant (insn.imm_signed ()); > } > diff --git a/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li-foo.s b/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li-foo.s > new file mode 100644 > index 00000000000..787aacdd8f3 > --- /dev/null > +++ b/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li-foo.s > @@ -0,0 +1,47 @@ > +/* Copyright 2023 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 . */ > + > + > +/* Simple asm function that makes use of c.li and c.lui in the > + function prologue before the return address and frame pointers are > + written the stack. This ensures that GDB's prologue unwinder can > + understand these instructions. */ > + > + .option pic > + .text > + > + .globl foo > + .type foo, @function > +foo: > + addi sp,sp,-32 > + sd s1,8(sp) > + > + c.li s1,-4 > + c.lui s1,4 > + > + sd fp,24(sp) > + sd ra,16(sp) > + addi fp,sp,32 > + > + call bar@plt > + > + ld s1,8(sp) > + ld ra,16(sp) > + ld fp,24(sp) > + addi sp,sp,32 > + jr ra > + > + .size foo, .-foo > + .section .note.GNU-stack,"",@progbits > diff --git a/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.c b/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.c > new file mode 100644 > index 00000000000..d3a0cb3ff40 > --- /dev/null > +++ b/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.c > @@ -0,0 +1,29 @@ > +/* Copyright 2023 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 . */ > + > +/* See riscv64-unwind-prologue-with-c_li-asm.s. */ > +extern int foo (void); > + > +int > +bar (void) > +{ > + return 0; > +} > + > +int > +main (void) > +{ > + return foo (); > +} > diff --git a/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.exp b/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.exp > new file mode 100644 > index 00000000000..069effa2b87 > --- /dev/null > +++ b/gdb/testsuite/gdb.arch/riscv64-unwind-prologue-with-c_li.exp > @@ -0,0 +1,42 @@ > +# Copyright 2023 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 . > + > +# This tests GDB's ability to use the RISC-V prologue scanner in order > +# to unwind through a function that uses the compressed 'c.li' > +# instruction in its prologue. > + > +require {istarget "riscv64-*-*"} > + > +standard_testfile .c -foo.s > + > +if {[prepare_for_testing "failed to prepare" $testfile \ > + "$srcfile $srcfile2" nodebug]} { > + return -1 > +} > + > +if {![runto_main]} { > + return 0 > +} > + > +gdb_breakpoint "bar" > +gdb_continue_to_breakpoint "bar" > +gdb_test "bt" \ > + [multi_line \ > + "#0\[ \t\]*$hex in bar \\\(\\\)" \ > + "#1\[ \t\]*$hex in foo \\\(\\\)" \ > + "#2\[ \t\]*$hex in main \\\(\\\)"] \ > + "Backtrace to the main frame" > +gdb_test "finish" "foo \\\(\\\)" "finish bar" > +gdb_test "finish" "main \\\(\\\)" "finish foo" > > base-commit: 1770eca698ad0018cd504b9744306fc9928d9a86 > -- > 2.25.4