diff options
Diffstat (limited to 'gdb/trad-frame.c')
-rw-r--r-- | gdb/trad-frame.c | 84 |
1 files changed, 35 insertions, 49 deletions
diff --git a/gdb/trad-frame.c b/gdb/trad-frame.c index 2e98b79..17375e8 100644 --- a/gdb/trad-frame.c +++ b/gdb/trad-frame.c @@ -30,7 +30,7 @@ struct trad_frame_cache { struct frame_info *this_frame; CORE_ADDR this_base; - struct trad_frame_saved_reg *prev_regs; + trad_frame_saved_reg *prev_regs; struct frame_id this_id; }; @@ -49,23 +49,22 @@ trad_frame_cache_zalloc (struct frame_info *this_frame) void trad_frame_reset_saved_regs (struct gdbarch *gdbarch, - struct trad_frame_saved_reg *regs) + trad_frame_saved_reg *regs) { int numregs = gdbarch_num_cooked_regs (gdbarch); + for (int regnum = 0; regnum < numregs; regnum++) - { - regs[regnum].realreg = regnum; - regs[regnum].addr = -1; - regs[regnum].data = nullptr; - } + regs[regnum].set_realreg (regnum); } -struct trad_frame_saved_reg * +trad_frame_saved_reg * trad_frame_alloc_saved_regs (struct gdbarch *gdbarch) { + gdb_static_assert (std::is_trivially_default_constructible<trad_frame_saved_reg>::value); + int numregs = gdbarch_num_cooked_regs (gdbarch); - struct trad_frame_saved_reg *this_saved_regs - = FRAME_OBSTACK_CALLOC (numregs, struct trad_frame_saved_reg); + trad_frame_saved_reg *this_saved_regs + = FRAME_OBSTACK_CALLOC (numregs, trad_frame_saved_reg); trad_frame_reset_saved_regs (gdbarch, this_saved_regs); return this_saved_regs; @@ -76,7 +75,7 @@ trad_frame_alloc_saved_regs (struct gdbarch *gdbarch) non-optimized frames, the technique is reliable (just need to check for all potential instruction sequences). */ -struct trad_frame_saved_reg * +trad_frame_saved_reg * trad_frame_alloc_saved_regs (struct frame_info *this_frame) { struct gdbarch *gdbarch = get_frame_arch (this_frame); @@ -84,67 +83,57 @@ trad_frame_alloc_saved_regs (struct frame_info *this_frame) return trad_frame_alloc_saved_regs (gdbarch); } -enum { TF_REG_VALUE = -1, TF_REG_UNKNOWN = -2, TF_REG_VALUE_BYTES = -3 }; - int -trad_frame_value_p (struct trad_frame_saved_reg this_saved_regs[], int regnum) +trad_frame_value_p (trad_frame_saved_reg this_saved_regs[], int regnum) { - return (this_saved_regs[regnum].realreg == TF_REG_VALUE); + return this_saved_regs[regnum].is_value (); } int -trad_frame_addr_p (struct trad_frame_saved_reg this_saved_regs[], int regnum) +trad_frame_addr_p (trad_frame_saved_reg this_saved_regs[], int regnum) { - return (this_saved_regs[regnum].realreg >= 0 - && this_saved_regs[regnum].addr != -1); + return this_saved_regs[regnum].is_addr (); } int -trad_frame_realreg_p (struct trad_frame_saved_reg this_saved_regs[], +trad_frame_realreg_p (trad_frame_saved_reg this_saved_regs[], int regnum) { - return (this_saved_regs[regnum].realreg >= 0 - && this_saved_regs[regnum].addr == -1); + return this_saved_regs[regnum].is_realreg (); } /* See trad-frame.h. */ bool -trad_frame_value_bytes_p (struct trad_frame_saved_reg this_saved_regs[], +trad_frame_value_bytes_p (trad_frame_saved_reg this_saved_regs[], int regnum) { - return (this_saved_regs[regnum].realreg == TF_REG_VALUE_BYTES - && this_saved_regs[regnum].data != nullptr); + return this_saved_regs[regnum].is_value_bytes (); } void -trad_frame_set_value (struct trad_frame_saved_reg this_saved_regs[], +trad_frame_set_value (trad_frame_saved_reg this_saved_regs[], int regnum, LONGEST val) { - /* Make the REALREG invalid, indicating that the ADDR contains the - register's value. */ - this_saved_regs[regnum].realreg = TF_REG_VALUE; - this_saved_regs[regnum].addr = val; + this_saved_regs[regnum].set_value (val); } /* See trad-frame.h. */ void -trad_frame_set_realreg (struct trad_frame_saved_reg this_saved_regs[], +trad_frame_set_realreg (trad_frame_saved_reg this_saved_regs[], int regnum, int realreg) { - this_saved_regs[regnum].realreg = realreg; - this_saved_regs[regnum].addr = -1; + this_saved_regs[regnum].set_realreg (realreg); } /* See trad-frame.h. */ void -trad_frame_set_addr (struct trad_frame_saved_reg this_saved_regs[], +trad_frame_set_addr (trad_frame_saved_reg this_saved_regs[], int regnum, CORE_ADDR addr) { - this_saved_regs[regnum].realreg = regnum; - this_saved_regs[regnum].addr = addr; + this_saved_regs[regnum].set_addr (addr); } void @@ -227,26 +216,23 @@ trad_frame_set_reg_regmap (struct trad_frame_cache *this_trad_cache, } void -trad_frame_set_unknown (struct trad_frame_saved_reg this_saved_regs[], +trad_frame_set_unknown (trad_frame_saved_reg this_saved_regs[], int regnum) { - /* Make the REALREG invalid, indicating that the value is not known. */ - this_saved_regs[regnum].realreg = TF_REG_UNKNOWN; - this_saved_regs[regnum].addr = -1; + this_saved_regs[regnum].set_unknown (); } /* See trad-frame.h. */ void -trad_frame_set_value_bytes (struct trad_frame_saved_reg this_saved_regs[], +trad_frame_set_value_bytes (trad_frame_saved_reg this_saved_regs[], int regnum, const gdb_byte *bytes, size_t size) { - this_saved_regs[regnum].realreg = TF_REG_VALUE_BYTES; - /* Allocate the space and copy the data bytes. */ - this_saved_regs[regnum].data = FRAME_OBSTACK_CALLOC (size, gdb_byte); - memcpy (this_saved_regs[regnum].data, bytes, size); + gdb_byte *data = FRAME_OBSTACK_CALLOC (size, gdb_byte); + memcpy (data, bytes, size); + this_saved_regs[regnum].set_value_bytes (data); } /* See trad-frame.h. */ @@ -266,24 +252,24 @@ trad_frame_set_reg_value_bytes (struct trad_frame_cache *this_trad_cache, struct value * trad_frame_get_prev_register (struct frame_info *this_frame, - struct trad_frame_saved_reg this_saved_regs[], + trad_frame_saved_reg this_saved_regs[], int regnum) { if (trad_frame_addr_p (this_saved_regs, regnum)) /* The register was saved in memory. */ return frame_unwind_got_memory (this_frame, regnum, - this_saved_regs[regnum].addr); + this_saved_regs[regnum].addr ()); else if (trad_frame_realreg_p (this_saved_regs, regnum)) return frame_unwind_got_register (this_frame, regnum, - this_saved_regs[regnum].realreg); + this_saved_regs[regnum].realreg ()); else if (trad_frame_value_p (this_saved_regs, regnum)) /* The register's value is available. */ return frame_unwind_got_constant (this_frame, regnum, - this_saved_regs[regnum].addr); + this_saved_regs[regnum].value ()); else if (trad_frame_value_bytes_p (this_saved_regs, regnum)) /* The register's value is available as a sequence of bytes. */ return frame_unwind_got_bytes (this_frame, regnum, - this_saved_regs[regnum].data); + this_saved_regs[regnum].value_bytes ()); else return frame_unwind_got_optimized (this_frame, regnum); } |