diff options
author | Yao Qi <yao.qi@linaro.org> | 2017-08-11 09:30:02 +0100 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2017-08-11 09:30:02 +0100 |
commit | 1c90d9f022469629c255d44664b4452998168359 (patch) | |
tree | 5ae995a5dc538729561ca26f9f85ec9d5ef98a78 /gdb/dwarf2-frame.h | |
parent | afe37d6be57a505e6abd01778474a2b73dff52c4 (diff) | |
download | gdb-1c90d9f022469629c255d44664b4452998168359.zip gdb-1c90d9f022469629c255d44664b4452998168359.tar.gz gdb-1c90d9f022469629c255d44664b4452998168359.tar.bz2 |
Class-fy dwarf2_frame_state_reg_info
This patch adds dwarf2_frame_state_reg_info ctor, dtor, copy ctor,
assignment operator, and move assignment. This patch also adds unit test
to execute_cfa_program to cover the changes.
gdb:
2017-08-11 Yao Qi <yao.qi@linaro.org>
* dwarf2-frame.c (dwarf2_frame_state_alloc_regs): Remove.
(dwarf2_frame_state_copy_regs): Remove.
(dwarf2_frame_state_free_regs): Remove.
(dwarf2_frame_state::~dwarf2_frame_state): Remove.
(dwarf2_restore_rule): Call method .alloc_regs instead of
dwarf2_frame_state_alloc_regs.
(execute_cfa_program): Likewise. Call dwarf2_frame_state_reg_info
constructor. Call std::move.
(dwarf2_fetch_cfa_info): Don't call dwarf2_frame_state_copy_regs.
(dwarf2_frame_cache): Likewise.
[GDB_SELF_TEST]: Include selftest.h and
selftest-arch.h.
[GDB_SELF_TEST] (execute_cfa_program_test): New function.
(_initialize_dwarf2_frame) [GDB_SELF_TEST]: Register
execute_cfa_program_test.
* dwarf2-frame.h (dwarf2_frame_state_reg_info): Add ctor, dtor,
copy ctor, assignment operator, move assignment.
<alloc_regs>: New method.
<swap>: New method.
(struct dwarf2_frame_state): Delete dtor.
(dwarf2_frame_state_alloc_regs): Remove declaration.
* sparc-tdep.c (sparc_execute_dwarf_cfa_vendor_op): Don't call
dwarf2_frame_state_alloc_regs, use .alloc_regs instead.
Diffstat (limited to 'gdb/dwarf2-frame.h')
-rw-r--r-- | gdb/dwarf2-frame.h | 90 |
1 files changed, 76 insertions, 14 deletions
diff --git a/gdb/dwarf2-frame.h b/gdb/dwarf2-frame.h index c952a20..2c3d14c 100644 --- a/gdb/dwarf2-frame.h +++ b/gdb/dwarf2-frame.h @@ -94,16 +94,85 @@ enum cfa_how_kind struct dwarf2_frame_state_reg_info { - struct dwarf2_frame_state_reg *reg; - int num_regs; + dwarf2_frame_state_reg_info () = default; + ~dwarf2_frame_state_reg_info () + { + delete prev; + xfree (reg); + } + + /* Copy constructor. */ + dwarf2_frame_state_reg_info (const dwarf2_frame_state_reg_info &src) + : num_regs (src.num_regs), cfa_offset (src.cfa_offset), + cfa_reg (src.cfa_reg), cfa_how (src.cfa_how), cfa_exp (src.cfa_exp), + prev (src.prev) + { + size_t size = src.num_regs * sizeof (struct dwarf2_frame_state_reg); + + reg = (struct dwarf2_frame_state_reg *) xmalloc (size); + memcpy (reg, src.reg, size); + } + + /* Assignment operator for both move-assignment and copy-assignment. */ + dwarf2_frame_state_reg_info& + operator= (dwarf2_frame_state_reg_info rhs) + { + swap (*this, rhs); + return *this; + } + + /* Move constructor. */ + dwarf2_frame_state_reg_info (dwarf2_frame_state_reg_info &&rhs) noexcept + : reg (rhs.reg), num_regs (rhs.num_regs), cfa_offset (rhs.cfa_offset), + cfa_reg (rhs.cfa_reg), cfa_how (rhs.cfa_how), cfa_exp (rhs.cfa_exp), + prev (rhs.prev) + { + rhs.prev = nullptr; + rhs.reg = nullptr; + } - LONGEST cfa_offset; - ULONGEST cfa_reg; - enum cfa_how_kind cfa_how; - const gdb_byte *cfa_exp; +/* Assert that the register set RS is large enough to store gdbarch_num_regs + columns. If necessary, enlarge the register set. */ + void alloc_regs (int num_regs_requested) + { + if (num_regs_requested <= num_regs) + return; + + size_t size = sizeof (struct dwarf2_frame_state_reg); + + reg = (struct dwarf2_frame_state_reg *) + xrealloc (reg, num_regs_requested * size); + + /* Initialize newly allocated registers. */ + memset (reg + num_regs, 0, (num_regs_requested - num_regs) * size); + num_regs = num_regs_requested; + } + + struct dwarf2_frame_state_reg *reg = NULL; + int num_regs = 0; + + LONGEST cfa_offset = 0; + ULONGEST cfa_reg = 0; + enum cfa_how_kind cfa_how = CFA_UNSET; + const gdb_byte *cfa_exp = NULL; /* Used to implement DW_CFA_remember_state. */ - struct dwarf2_frame_state_reg_info *prev; + struct dwarf2_frame_state_reg_info *prev = NULL; + +private: + friend void swap (dwarf2_frame_state_reg_info& lhs, + dwarf2_frame_state_reg_info& rhs) + { + using std::swap; + + swap (lhs.reg, rhs.reg); + swap (lhs.num_regs, rhs.num_regs); + swap (lhs.cfa_offset, rhs.cfa_offset); + swap (lhs.cfa_reg, rhs.cfa_reg); + swap (lhs.cfa_how, rhs.cfa_how); + swap (lhs.cfa_exp, rhs.cfa_exp); + swap (lhs.prev, rhs.prev); + } }; struct dwarf2_cie; @@ -113,7 +182,6 @@ struct dwarf2_cie; struct dwarf2_frame_state { dwarf2_frame_state (CORE_ADDR pc, struct dwarf2_cie *cie); - ~dwarf2_frame_state (); /* Each register save state can be described in terms of a CFA slot, another register, or a location expression. */ @@ -180,12 +248,6 @@ extern const struct frame_base * CORE_ADDR dwarf2_frame_cfa (struct frame_info *this_frame); -/* Assert that the register set RS is large enough to store gdbarch_num_regs - columns. If necessary, enlarge the register set. */ - -void dwarf2_frame_state_alloc_regs (struct dwarf2_frame_state_reg_info *rs, - int num_regs); - /* Find the CFA information for PC. Return 1 if a register is used for the CFA, or 0 if another |