From 0757a50396e3638434f806aec2ee8c8f79a7026c Mon Sep 17 00:00:00 2001 From: Tiezhu Yang Date: Sat, 25 Jun 2022 09:20:00 +0800 Subject: gdb: LoongArch: Define register numbers and clean up code This commit defines register numbers of various important registers, we can use them directly in the related code, and also clean up some code to make them more clear and readable. Signed-off-by: Tiezhu Yang --- gdb/loongarch-linux-tdep.c | 92 +++++++++++++++++----------------------------- 1 file changed, 34 insertions(+), 58 deletions(-) (limited to 'gdb/loongarch-linux-tdep.c') diff --git a/gdb/loongarch-linux-tdep.c b/gdb/loongarch-linux-tdep.c index 3726437..5da48a4 100644 --- a/gdb/loongarch-linux-tdep.c +++ b/gdb/loongarch-linux-tdep.c @@ -28,90 +28,73 @@ #include "trad-frame.h" #include "tramp-frame.h" -/* The general-purpose regset consists of 32 R registers, plus PC, - and BADV registers. In addition, reserved 11 for extension in glibc. */ - -#define LOONGARCH_LINUX_NUM_GREGSET (45) - /* Unpack an elf_gregset_t into GDB's register cache. */ static void -loongarch_supply_gregset (const struct regset *r, - struct regcache *regcache, int regno, +loongarch_supply_gregset (const struct regset *regset, + struct regcache *regcache, int regnum, const void *gprs, size_t len) { - loongarch_gdbarch_tdep *tdep - = (loongarch_gdbarch_tdep *) gdbarch_tdep (regcache->arch ()); - auto regs = tdep->regs; - - int regsize = register_size (regcache->arch (), regs.r); + int regsize = register_size (regcache->arch (), 0); const gdb_byte *buf = nullptr; - if (regno == -1) + if (regnum == -1) { - /* Set $r0 = 0. */ - regcache->raw_supply_zeroed (regs.r); + regcache->raw_supply_zeroed (0); for (int i = 1; i < 32; i++) { buf = (const gdb_byte*) gprs + regsize * i; - regcache->raw_supply (regs.r + i, (const void *) buf); + regcache->raw_supply (i, (const void *) buf); } - /* Size base (pc) = regsize * regs.pc. */ - buf = (const gdb_byte*) gprs + regsize * regs.pc; - regcache->raw_supply (regs.pc, (const void *) buf); + buf = (const gdb_byte*) gprs + regsize * LOONGARCH_PC_REGNUM; + regcache->raw_supply (LOONGARCH_PC_REGNUM, (const void *) buf); - /* Size base (badv) = regsize * regs.badv. */ - buf = (const gdb_byte*) gprs + regsize * regs.badv; - regcache->raw_supply (regs.badv, (const void *) buf); + buf = (const gdb_byte*) gprs + regsize * LOONGARCH_BADV_REGNUM; + regcache->raw_supply (LOONGARCH_BADV_REGNUM, (const void *) buf); } - else if (regs.r == regno) - regcache->raw_supply_zeroed (regno); - else if ((regs.r < regno && regno < regs.r + 32) - || regs.pc == regno || regs.badv == regno) + else if (regnum == 0) + regcache->raw_supply_zeroed (0); + else if ((regnum > 0 && regnum < 32) + || regnum == LOONGARCH_PC_REGNUM + || regnum == LOONGARCH_BADV_REGNUM) { - /* Offset offset (regno) = regsize * (regno - regs.r). */ - buf = (const gdb_byte*) gprs + regsize * (regno - regs.r); - regcache->raw_supply (regno, (const void *) buf); + buf = (const gdb_byte*) gprs + regsize * regnum; + regcache->raw_supply (regnum, (const void *) buf); } } /* Pack the GDB's register cache value into an elf_gregset_t. */ static void -loongarch_fill_gregset (const struct regset *r, - const struct regcache *regcache, int regno, +loongarch_fill_gregset (const struct regset *regset, + const struct regcache *regcache, int regnum, void *gprs, size_t len) { - loongarch_gdbarch_tdep *tdep - = (loongarch_gdbarch_tdep *) gdbarch_tdep (regcache->arch ()); - auto regs = tdep->regs; - int regsize = register_size (regcache->arch (), regs.r); + int regsize = register_size (regcache->arch (), 0); gdb_byte *buf = nullptr; - if (regno == -1) + if (regnum == -1) { for (int i = 0; i < 32; i++) { buf = (gdb_byte *) gprs + regsize * i; - regcache->raw_collect (regs.r + i, (void *) buf); + regcache->raw_collect (i, (void *) buf); } - /* Size base (pc) = regsize * regs.pc. */ - buf = (gdb_byte *) gprs + regsize * regs.pc; - regcache->raw_collect (regs.pc, (void *) buf); + buf = (gdb_byte *) gprs + regsize * LOONGARCH_PC_REGNUM; + regcache->raw_collect (LOONGARCH_PC_REGNUM, (void *) buf); - /* Size base (badv) = regsize * regs.badv. */ - buf = (gdb_byte *) gprs + regsize * regs.badv; - regcache->raw_collect (regs.badv, (void *) buf); + buf = (gdb_byte *) gprs + regsize * LOONGARCH_BADV_REGNUM; + regcache->raw_collect (LOONGARCH_BADV_REGNUM, (void *) buf); } - else if ((regs.r <= regno && regno < regs.r + 32) - || regs.pc == regno || regs.badv == regno) + else if ((regnum >= 0 && regnum < 32) + || regnum == LOONGARCH_PC_REGNUM + || regnum == LOONGARCH_BADV_REGNUM) { - /* Offset offset (regno) = regsize * (regno - regs.r). */ - buf = (gdb_byte *) gprs + regsize * (regno - regs.r); - regcache->raw_collect (regno, (void *) buf); + buf = (gdb_byte *) gprs + regsize * regnum; + regcache->raw_collect (regnum, (void *) buf); } } @@ -135,17 +118,13 @@ loongarch_linux_rt_sigframe_init (const struct tramp_frame *self, struct trad_frame_cache *this_cache, CORE_ADDR func) { - struct gdbarch *gdbarch = get_frame_arch (this_frame); - loongarch_gdbarch_tdep *tdep = (loongarch_gdbarch_tdep *) gdbarch_tdep (gdbarch); - auto regs = tdep->regs; - CORE_ADDR frame_sp = get_frame_sp (this_frame); CORE_ADDR sigcontext_base = (frame_sp + LOONGARCH_RT_SIGFRAME_UCONTEXT_OFFSET + LOONGARCH_UCONTEXT_SIGCONTEXT_OFFSET); - trad_frame_set_reg_addr (this_cache, regs.pc, sigcontext_base); + trad_frame_set_reg_addr (this_cache, LOONGARCH_PC_REGNUM, sigcontext_base); for (int i = 0; i < 32; i++) - trad_frame_set_reg_addr (this_cache, regs.r + i, sigcontext_base + 8 + i * 8); + trad_frame_set_reg_addr (this_cache, i, sigcontext_base + 8 + i * 8); trad_frame_set_id (this_cache, frame_id_build (frame_sp, func)); } @@ -176,10 +155,7 @@ loongarch_iterate_over_regset_sections (struct gdbarch *gdbarch, void *cb_data, const struct regcache *regcache) { - loongarch_gdbarch_tdep *tdep - = (loongarch_gdbarch_tdep *) gdbarch_tdep (gdbarch); - auto regs = tdep->regs; - int regsize = register_size (gdbarch, regs.r); + int regsize = register_size (gdbarch, 0); cb (".reg", LOONGARCH_LINUX_NUM_GREGSET * regsize, LOONGARCH_LINUX_NUM_GREGSET * regsize, &loongarch_gregset, NULL, cb_data); -- cgit v1.1