forked from Imagelibrary/binutils-gdb
Change management of tdesc_arch_data
While working on something else, I noticed that tdesc_data_cleanup took a void* parameter. Looking more into this, I found that tdesc_use_registers expected a transfer of ownership. I think it's better to express this sort of thing via the type system, when possible. This patch changes tdesc_data_alloc to return a unique pointer, changes tdesc_use_registers to accept an rvalue reference, and then adapts all the users. Note that a deleter structure is introduced to avoid having to move tdesc_arch_data to the header file. 2020-09-17 Tom Tromey <tromey@adacore.com> * tic6x-tdep.c (tic6x_gdbarch_init): Update. * target-descriptions.h (struct tdesc_arch_data_deleter): New. (tdesc_arch_data_up): New typedef. (tdesc_use_registers, tdesc_data_alloc): Update. (tdesc_data_cleanup): Don't declare. * target-descriptions.c (tdesc_data_alloc): Return a tdesc_arch_data_up. (tdesc_arch_data_deleter::operator()): Rename from tdesc_data_cleanup. Change argument type. (tdesc_use_registers): Change early_data to an rvalue reference. (tdesc_use_registers): Don't use delete. * sparc-tdep.c (sparc32_gdbarch_init): Update. * s390-tdep.c (s390_gdbarch_init): Update. * rx-tdep.c (rx_gdbarch_init): Update. * rs6000-tdep.c (rs6000_gdbarch_init): Update. * riscv-tdep.c (riscv_gdbarch_init): Update. * or1k-tdep.c (or1k_gdbarch_init): Update. * nios2-tdep.c (nios2_gdbarch_init): Update. * nds32-tdep.c (nds32_gdbarch_init): Update. * mips-tdep.c (mips_gdbarch_init): Update. * microblaze-tdep.c (microblaze_gdbarch_init): Update. * m68k-tdep.c (m68k_gdbarch_init): Update. * i386-tdep.c (i386_gdbarch_init): Update. * arm-tdep.c (arm_gdbarch_init): Update. * arc-tdep.c (arc_tdesc_init): Update. (arc_gdbarch_init): Update. * aarch64-tdep.c (aarch64_gdbarch_init): Update.
This commit is contained in:
@@ -8047,7 +8047,7 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
enum mips_abi mips_abi, found_abi, wanted_abi;
|
||||
int i, num_regs;
|
||||
enum mips_fpu_type fpu_type;
|
||||
struct tdesc_arch_data *tdesc_data = NULL;
|
||||
tdesc_arch_data_up tdesc_data;
|
||||
int elf_fpu_type = Val_GNU_MIPS_ABI_FP_ANY;
|
||||
const char * const *reg_names;
|
||||
struct mips_regnum mips_regnum, *regnum;
|
||||
@@ -8310,73 +8310,58 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
|
||||
valid_p = 1;
|
||||
for (i = MIPS_ZERO_REGNUM; i <= MIPS_RA_REGNUM; i++)
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
|
||||
mips_gprs[i]);
|
||||
|
||||
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
mips_regnum.lo, "lo");
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
mips_regnum.hi, "hi");
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
mips_regnum.pc, "pc");
|
||||
|
||||
if (!valid_p)
|
||||
{
|
||||
tdesc_data_cleanup (tdesc_data);
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
feature = tdesc_find_feature (info.target_desc,
|
||||
"org.gnu.gdb.mips.cp0");
|
||||
if (feature == NULL)
|
||||
{
|
||||
tdesc_data_cleanup (tdesc_data);
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
valid_p = 1;
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
mips_regnum.badvaddr, "badvaddr");
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
MIPS_PS_REGNUM, "status");
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
mips_regnum.cause, "cause");
|
||||
|
||||
if (!valid_p)
|
||||
{
|
||||
tdesc_data_cleanup (tdesc_data);
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
/* FIXME drow/2007-05-17: The FPU should be optional. The MIPS
|
||||
backend is not prepared for that, though. */
|
||||
feature = tdesc_find_feature (info.target_desc,
|
||||
"org.gnu.gdb.mips.fpu");
|
||||
if (feature == NULL)
|
||||
{
|
||||
tdesc_data_cleanup (tdesc_data);
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
valid_p = 1;
|
||||
for (i = 0; i < 32; i++)
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
i + mips_regnum.fp0, mips_fprs[i]);
|
||||
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
mips_regnum.fp_control_status,
|
||||
"fcsr");
|
||||
valid_p
|
||||
&= tdesc_numbered_register (feature, tdesc_data,
|
||||
&= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
mips_regnum.fp_implementation_revision,
|
||||
"fir");
|
||||
|
||||
if (!valid_p)
|
||||
{
|
||||
tdesc_data_cleanup (tdesc_data);
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
num_regs = mips_regnum.fp_implementation_revision + 1;
|
||||
|
||||
@@ -8389,27 +8374,24 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
{
|
||||
i = 0;
|
||||
valid_p = 1;
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
dspacc + i++, "hi1");
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
dspacc + i++, "lo1");
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
dspacc + i++, "hi2");
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
dspacc + i++, "lo2");
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
dspacc + i++, "hi3");
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
dspacc + i++, "lo3");
|
||||
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
||||
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
|
||||
dspctl, "dspctl");
|
||||
|
||||
if (!valid_p)
|
||||
{
|
||||
tdesc_data_cleanup (tdesc_data);
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
mips_regnum.dspacc = dspacc;
|
||||
mips_regnum.dspctl = dspctl;
|
||||
@@ -8445,8 +8427,6 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
if (MIPS_FPU_TYPE (arches->gdbarch) != fpu_type)
|
||||
continue;
|
||||
|
||||
if (tdesc_data != NULL)
|
||||
tdesc_data_cleanup (tdesc_data);
|
||||
return arches->gdbarch;
|
||||
}
|
||||
|
||||
@@ -8743,7 +8723,7 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
mips_register_g_packet_guesses (gdbarch);
|
||||
|
||||
/* Hook in OS ABI-specific overrides, if they have been registered. */
|
||||
info.tdesc_data = tdesc_data;
|
||||
info.tdesc_data = tdesc_data.get ();
|
||||
gdbarch_init_osabi (info, gdbarch);
|
||||
|
||||
/* The hook may have adjusted num_regs, fetch the final value and
|
||||
@@ -8764,10 +8744,10 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
frame_base_append_sniffer (gdbarch, mips_micro_frame_base_sniffer);
|
||||
frame_base_append_sniffer (gdbarch, mips_insn32_frame_base_sniffer);
|
||||
|
||||
if (tdesc_data)
|
||||
if (tdesc_data != nullptr)
|
||||
{
|
||||
set_tdesc_pseudo_register_type (gdbarch, mips_pseudo_register_type);
|
||||
tdesc_use_registers (gdbarch, info.target_desc, tdesc_data);
|
||||
tdesc_use_registers (gdbarch, info.target_desc, std::move (tdesc_data));
|
||||
|
||||
/* Override the normal target description methods to handle our
|
||||
dual real and pseudo registers. */
|
||||
|
||||
Reference in New Issue
Block a user