gdb: LoongArch: Implement the iterate_over_regset_sections gdbarch method
authorTiezhu Yang <yangtiezhu@loongson.cn>
Mon, 23 May 2022 07:53:06 +0000 (15:53 +0800)
committerTiezhu Yang <yangtiezhu@loongson.cn>
Mon, 23 May 2022 14:31:24 +0000 (22:31 +0800)
When execute the following command on LoongArch:

  make check-gdb TESTS="gdb.base/auxv.exp"

there exist the following unsupported and failed testcases:

  UNSUPPORTED: gdb.base/auxv.exp: gcore
  FAIL: gdb.base/auxv.exp: load core file for info auxv on native core dump
  FAIL: gdb.base/auxv.exp: info auxv on native core dump
  FAIL: gdb.base/auxv.exp: matching auxv data from live and core
  UNSUPPORTED: gdb.base/auxv.exp: info auxv on gcore-created dump
  UNSUPPORTED: gdb.base/auxv.exp: matching auxv data from live and gcore

we can see the following messages in gdb/testsuite/gdb.log:

  gcore /home/loongson/build.git/gdb/testsuite/outputs/gdb.base/auxv/auxv.gcore
  Target does not support core file generation.
  (gdb) UNSUPPORTED: gdb.base/auxv.exp: gcore

In order to fix the above issues, implement the iterate_over_regset_sections
gdbarch method to iterate over core file register note sections on LoongArch.

By the way, with this patch, the failed testcases in gdb.base/corefile.exp
and gdb.base/gcore.exp can also be fixed.

Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
gdb/loongarch-linux-tdep.c

index 7e219c4b9a0e1db9a83c832408b5d082f1b1d1b7..f13756dd003077d6240bbd0cd71eed178593a63c 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "defs.h"
 #include "glibc-tdep.h"
+#include "gregset.h"
 #include "inferior.h"
 #include "linux-tdep.h"
 #include "loongarch-tdep.h"
@@ -163,6 +164,18 @@ static const struct tramp_frame loongarch_linux_rt_sigframe =
   NULL
 };
 
+/* Implement the "iterate_over_regset_sections" gdbarch method.  */
+
+static void
+loongarch_iterate_over_regset_sections (struct gdbarch *gdbarch,
+                                       iterate_over_regset_sections_cb *cb,
+                                       void *cb_data,
+                                       const struct regcache *regcache)
+{
+  cb (".reg", sizeof (elf_gregset_t), sizeof (elf_gregset_t),
+      &loongarch_gregset, NULL, cb_data);
+}
+
 /* Initialize LoongArch Linux ABI info.  */
 
 static void
@@ -186,6 +199,9 @@ loongarch_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 
   /* Prepend tramp frame unwinder for signal.  */
   tramp_frame_prepend_unwinder (gdbarch, &loongarch_linux_rt_sigframe);
+
+  /* Core file support.  */
+  set_gdbarch_iterate_over_regset_sections (gdbarch, loongarch_iterate_over_regset_sections);
 }
 
 /* Initialize LoongArch Linux target support.  */