aboutsummaryrefslogtreecommitdiff
path: root/gdb/loongarch-linux-tdep.c
diff options
context:
space:
mode:
authorTiezhu Yang <yangtiezhu@loongson.cn>2022-06-25 09:20:00 +0800
committerTiezhu Yang <yangtiezhu@loongson.cn>2022-06-25 10:12:48 +0800
commit0757a50396e3638434f806aec2ee8c8f79a7026c (patch)
tree0ff0f17828e57b093d8503649d5205e0c91ddf04 /gdb/loongarch-linux-tdep.c
parentc3467df4acf770ad6ed1a7c826843fee22396b38 (diff)
downloadbinutils-0757a50396e3638434f806aec2ee8c8f79a7026c.zip
binutils-0757a50396e3638434f806aec2ee8c8f79a7026c.tar.gz
binutils-0757a50396e3638434f806aec2ee8c8f79a7026c.tar.bz2
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 <yangtiezhu@loongson.cn>
Diffstat (limited to 'gdb/loongarch-linux-tdep.c')
-rw-r--r--gdb/loongarch-linux-tdep.c92
1 files changed, 34 insertions, 58 deletions
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);