+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"
+    }
+}