diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b50a48ca1e5..e136c98985f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2021-02-24 Andrew Burgess + + * 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. + 2021-02-24 Andrew Burgess * eval.c (evaluate_subexp_standard): Call value_ind for points to diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c index 7463b0c3336..da86ed12716 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/ChangeLog b/gdb/testsuite/ChangeLog index 6f1cb0a8526..4d2d5434aa0 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2021-02-24 Andrew Burgess + + * gdb.arch/riscv-default-tdesc.exp: New file. + 2021-02-24 Andrew Burgess * gdb.fortran/pointer-to-pointer.exp: Additional tests. 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" + } +}