From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id sKZKNrFcHGCwCgAAWB0awg (envelope-from ) for ; Thu, 04 Feb 2021 15:44:33 -0500 Received: by simark.ca (Postfix, from userid 112) id DB6D31EFCB; Thu, 4 Feb 2021 15:44:33 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED, MAILING_LIST_MULTI,T_DKIM_INVALID,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id AE6C31E945 for ; Thu, 4 Feb 2021 15:44:32 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7681139D00DC; Thu, 4 Feb 2021 20:44:32 +0000 (GMT) Received: from mail-wr1-x42c.google.com (mail-wr1-x42c.google.com [IPv6:2a00:1450:4864:20::42c]) by sourceware.org (Postfix) with ESMTPS id BB0E039450DB for ; Thu, 4 Feb 2021 20:44:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org BB0E039450DB Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=andrew.burgess@embecosm.com Received: by mail-wr1-x42c.google.com with SMTP id q7so5087228wre.13 for ; Thu, 04 Feb 2021 12:44:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=S1nTFYzkGdH0UHYxCVsJq2DLaT5t6LYuNqF+xj/Jx/M=; b=B09n70suBhLZ93jzR85UyTiKGo/IuMCO09xVjDOlzdAStfGSh3k4NOVax29NrYsRDY pOpphEHl5pQFutvsgvLaDjV3nw7cwSEBAzZ+tAyL96i/bf93n2ubuLAe7C7xBAcnngs1 u5UGw1XCXUL3hMVlokmgCSbu37BKfyaPKl/RrF21GTTDlFtKGeEeqLSIKvQ2Zers6X9t fEronkVoPWaKU0V7WdPdzAfveSL1WaoBXA37Vsx5NdTUjupfQWM9TU9eU6NBK8VaENOn uPCcNWs+Toc8QahWpJZS6RroJq6HiHxmaa+R3NtNBQthsByYrGMYxhlLAxHgnabnU+cL sX8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=S1nTFYzkGdH0UHYxCVsJq2DLaT5t6LYuNqF+xj/Jx/M=; b=L6xVSMih83fWomUcPUVrvLIZgbuJsWLxdx3qGI0SuCV3TQ6knO0ahHDi/RUmeIBsJX WfhQSa82B8yskFNaQrapAvvqiGT0yTBvYrmug0jMSMFuX2jDAt/x0aQuoRqqeiZQfm+Q /X3hKM87aJaz3/v6cOX6WUHRLAlmkuJ+3rrisrWA5KnN8Fuvm/oAmiG6aSS4hwwKPXPe qfH12yVzcJJrZtkgFhSsvSZPpV/Rk9qSaauF1K6jGiXbUS2uXmbH4E/C9TSW2vHR8JK0 yo4x9bklF7OdPCm/zDTwgUAzjdTShowCaZ5oreRwP9+x+XdAGGXNMrS1PFR/i6D5QLPq NPwA== X-Gm-Message-State: AOAM530A9l3WbUbRtJkRZU4uCZ4Mao8lHKJT5Ytmh/jAY1DzQ9mhSzmH y0VXx0uLWJnF9ZwFuEhglv97Xt6GcSN7cQ== X-Google-Smtp-Source: ABdhPJzGKWmm8s3gPVoLQRL/1p2YW/m52ygCZ5JZpGJbyXoUPBT9ZaDJTBehnVYlmya0tZMtI/PD6Q== X-Received: by 2002:a5d:4242:: with SMTP id s2mr1290885wrr.108.1612471468330; Thu, 04 Feb 2021 12:44:28 -0800 (PST) Received: from localhost (host109-151-46-64.range109-151.btcentralplus.com. [109.151.46.64]) by smtp.gmail.com with ESMTPSA id i7sm9642514wru.49.2021.02.04.12.44.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Feb 2021 12:44:27 -0800 (PST) From: Andrew Burgess To: gdb-patches@sourceware.org Subject: [PATCH] gdb/riscv: select rv32 target by default when requested Date: Thu, 4 Feb 2021 20:44:26 +0000 Message-Id: <20210204204426.608948-1-andrew.burgess@embecosm.com> X-Mailer: git-send-email 2.25.4 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" GDB for RISC-V always uses target descriptions. When the target doesn't provide a target description then a default is selected. Usually this default is selected based on the properties of the executable being debugged. However, when there is no executable being debugged we currently fallback to the riscv:rv64 target description as the default. This leads to strange behaviour like this: $ gdb (gdb) set architecture riscv:rv32 (gdb) p sizeof ($pc) $1 = 8 Despite the users specifically setting the architecture to riscv:rv32 GDB still thinks that the target has riscv:rv64 register sizes. The above is a bit of a contrived situation. I actually ran into this situation while trying to connect to a running riscv:rv32 target without supplying an executable (the target didn't provide a target description). When I tried to set a register on the target I ran into errors because GDB was passing 8 bytes to the target rather than the expected 4. Even when I manually specified the architecture (as above) I couldn't convince GDB to only send 4 bytes. This patch fixes this issue. Now, when we selected a default target description we will make use of the user selected architecture to guide our choice. In the above example we now get: $ gdb (gdb) set architecture riscv:rv32 (gdb) p sizeof ($pc) $1 = 4 And my real world example of connecting to a remote without an executable works fine. I've used the fact that we can ask GDB about $pc even when no executable is loaded as the basis for a test to cover this situation. gdb/ChangeLog: * riscv-tdep.c (riscv_features_from_gdbarch_info): Rename to... (riscv_features_from_bfd): ...this. Change parameter type to 'bfd*', and update as required. (riscv_find_default_target_description): Update call to riscv_features_from_bfd. Select a default xlen based on info.bfd_arch_info. (riscv_gdbarch_init): Update call to riscv_features_from_bfd. gdb/testsuite/ChangeLog: * gdb.arch/riscv-default-tdesc.exp: New file. --- gdb/ChangeLog | 10 ++++ gdb/riscv-tdep.c | 28 ++++----- gdb/testsuite/ChangeLog | 4 ++ .../gdb.arch/riscv-default-tdesc.exp | 59 +++++++++++++++++++ 4 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 gdb/testsuite/gdb.arch/riscv-default-tdesc.exp diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c index 460746a9bfe..2a7b792893d 100644 --- a/gdb/riscv-tdep.c +++ b/gdb/riscv-tdep.c @@ -3215,13 +3215,11 @@ static const struct frame_unwind riscv_frame_unwind = /*.prev_arch =*/ NULL, }; -/* Extract a set of required target features out of INFO, specifically the - bfd being executed is examined to see what target features it requires. - IF there is no current bfd, or the bfd doesn't indicate any useful - features then a RISCV_GDBARCH_FEATURES is returned in its default state. */ +/* Extract a set of required target features out of ABFD. If ABFD is + nullptr then a RISCV_GDBARCH_FEATURES is returned in its default state. */ static struct riscv_gdbarch_features -riscv_features_from_gdbarch_info (const struct gdbarch_info info) +riscv_features_from_bfd (const bfd *abfd) { struct riscv_gdbarch_features features; @@ -3231,11 +3229,10 @@ riscv_features_from_gdbarch_info (const struct gdbarch_info info) only used at all if the target hasn't given us a description, so this is really a last ditched effort to do something sane before giving up. */ - if (info.abfd != NULL - && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour) + if (abfd != nullptr && bfd_get_flavour (abfd) == bfd_target_elf_flavour) { - unsigned char eclass = elf_elfheader (info.abfd)->e_ident[EI_CLASS]; - int e_flags = elf_elfheader (info.abfd)->e_flags; + unsigned char eclass = elf_elfheader (abfd)->e_ident[EI_CLASS]; + int e_flags = elf_elfheader (abfd)->e_flags; if (eclass == ELFCLASS32) features.xlen = 4; @@ -3273,13 +3270,14 @@ riscv_find_default_target_description (const struct gdbarch_info info) { /* Extract desired feature set from INFO. */ struct riscv_gdbarch_features features - = riscv_features_from_gdbarch_info (info); + = riscv_features_from_bfd (info.abfd); - /* If the XLEN field is still 0 then we got nothing useful from INFO. In - this case we fall back to a minimal useful target, 8-byte x-registers, - with no floating point. */ + /* If the XLEN field is still 0 then we got nothing useful from INFO.BFD, + maybe there was no bfd object. In this case we fall back to a minimal + useful target with no floating point, the x-register size is selected + based on the architecture from INFO. */ if (features.xlen == 0) - features.xlen = 8; + features.xlen = info.bfd_arch_info->bits_per_word == 32 ? 4 : 8; /* Now build a target description based on the feature set. */ return riscv_lookup_target_description (features); @@ -3497,7 +3495,7 @@ riscv_gdbarch_init (struct gdbarch_info info, target, then check that this matches with what the target is providing. */ struct riscv_gdbarch_features abi_features - = riscv_features_from_gdbarch_info (info); + = riscv_features_from_bfd (info.abfd); /* If the ABI_FEATURES xlen is 0 then this indicates we got no useful abi features from the INFO object. In this case we just treat the diff --git a/gdb/testsuite/gdb.arch/riscv-default-tdesc.exp b/gdb/testsuite/gdb.arch/riscv-default-tdesc.exp new file mode 100644 index 00000000000..2b7e8fa63e8 --- /dev/null +++ b/gdb/testsuite/gdb.arch/riscv-default-tdesc.exp @@ -0,0 +1,59 @@ +# Copyright 2021 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 . + +# Check the size of the $pc register as the user changes the selected +# architecture. As no executable is provided then the size of the $pc +# register is defined by the default target description selected by +# GDB. +# +# This test ensures that GDB is selecting an RV32 default if the user +# has forced the current architecture to be riscv:rv32. +# +# In all other cases the default will be RV64. + +if {![istarget "riscv*-*-*"]} { + verbose "Skipping ${gdb_test_file_name}." + return +} + +# Start GDB with no executable. +gdb_start + +# The tests are defined by a list of architecture names to switch too +# and the expected size of $pc. The first list entry is special and +# has an empty architecture string, this checks GDB's default value on +# startup. +foreach data {{"" 8} {"riscv:rv32" 4} {"riscv:rv64" 8} {"riscv" 8} \ + {"auto" 8}} { + set arch [lindex $data 0] + set size [lindex $data 1] + + # Switch architecture. + if { $arch != "" && $arch != "auto" } { + gdb_test "set architecture $arch" \ + "The target architecture is set to \"$arch\"\\." + } elseif { $arch == "auto" } { + gdb_test "set architecture $arch" \ + "The target architecture is set to \"auto\" \\(currently \"riscv\"\\)\\." + } else { + set arch "default architecture" + } + + # Check the size of $pc. + with_test_prefix "$arch" { + gdb_test "p sizeof (\$pc)" " = $size" \ + "size of \$pc register is $size" + } +} -- 2.25.4