/* Frame unwinder for frames with DWARF Call Frame Information.
- Copyright (C) 2003-2018 Free Software Foundation, Inc.
+ Copyright (C) 2003-2019 Free Software Foundation, Inc.
Contributed by Mark Kettenis.
DWARF2_FRAME_REG_UNSPECIFIED = 0,
/* The term "undefined" comes from the DWARF2 CFI spec which this
- code is moddeling; it indicates that the register's value is
+ code is modeling; it indicates that the register's value is
"undefined". GCC uses the less formal term "unsaved". Its
definition is a combination of REG_UNDEFINED and REG_UNSPECIFIED.
The failure to differentiate the two helps explain a few problems
~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),
+ : reg (src.reg), 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. */
/* 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),
+ : reg (std::move (rhs.reg)), 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;
}
-/* Assert that the register set RS is large enough to store gdbarch_num_regs
- columns. If necessary, enlarge the register set. */
+ /* If necessary, enlarge the register set to hold NUM_REGS_REQUESTED
+ registers. */
void alloc_regs (int num_regs_requested)
{
- if (num_regs_requested <= num_regs)
- return;
+ gdb_assert (num_regs_requested > 0);
- size_t size = sizeof (struct dwarf2_frame_state_reg);
-
- reg = (struct dwarf2_frame_state_reg *)
- xrealloc (reg, num_regs_requested * size);
+ if (num_regs_requested <= reg.size ())
+ return;
- /* Initialize newly allocated registers. */
- memset (reg + num_regs, 0, (num_regs_requested - num_regs) * size);
- num_regs = num_regs_requested;
+ reg.resize (num_regs_requested);
}
- struct dwarf2_frame_state_reg *reg = NULL;
- int num_regs = 0;
+ std::vector<struct dwarf2_frame_state_reg> reg;
LONGEST cfa_offset = 0;
ULONGEST cfa_reg = 0;
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);
registered with the gdbarch. Not all architectures can or do use the
DWARF unwinders. Setting this to true on a target that does not
otherwise support the DWARF unwinders has no effect. */
-extern int dwarf2_frame_unwinders_enabled_p;
+extern bool dwarf2_frame_unwinders_enabled_p;
/* Set the architecture-specific register state initialization
function for GDBARCH to INIT_REG. */