+2021-02-24 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * 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 <andrew.burgess@embecosm.com>
* eval.c (evaluate_subexp_standard): Call value_ind for points to
/*.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;
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;
{
/* 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);
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
+2021-02-24 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.arch/riscv-default-tdesc.exp: New file.
+
2021-02-24 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.fortran/pointer-to-pointer.exp: Additional tests.
--- /dev/null
+# 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 <http://www.gnu.org/licenses/>.
+
+# 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"
+ }
+}