Fix loongarch_iterate_over_regset_sections for non-native targets.
authorJohn Baldwin <jhb@FreeBSD.org>
Mon, 23 May 2022 17:59:13 +0000 (10:59 -0700)
committerJohn Baldwin <jhb@FreeBSD.org>
Mon, 23 May 2022 17:59:13 +0000 (10:59 -0700)
Define a constant for the number of registers stored in a register set
and use this with register_size to compute the size of the
general-purpose register set in core dumps.

This also fixes the build on hosts such as FreeBSD that do not define
an elf_gregset_t type.

gdb/loongarch-linux-tdep.c

index f13756dd003077d6240bbd0cd71eed178593a63c..bbb43abe13f380b93b0e2f1b514013437364b729 100644 (file)
 #include "trad-frame.h"
 #include "tramp-frame.h"
 
+/* The general-purpose regset consists of 32 R registers, plus PC,
+   and BADV registers.  */
+
+#define LOONGARCH_LINUX_NUM_GREGSET    (34)
+
 /* Unpack an elf_gregset_t into GDB's register cache.  */
 
 static void
@@ -172,8 +177,13 @@ loongarch_iterate_over_regset_sections (struct gdbarch *gdbarch,
                                        void *cb_data,
                                        const struct regcache *regcache)
 {
-  cb (".reg", sizeof (elf_gregset_t), sizeof (elf_gregset_t),
-      &loongarch_gregset, NULL, cb_data);
+  loongarch_gdbarch_tdep *tdep
+    = (loongarch_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+  auto regs = tdep->regs;
+  int regsize = register_size (gdbarch, regs.r);
+
+  cb (".reg", LOONGARCH_LINUX_NUM_GREGSET * regsize,
+      LOONGARCH_LINUX_NUM_GREGSET * regsize, &loongarch_gregset, NULL, cb_data);
 }
 
 /* Initialize LoongArch Linux ABI info.  */