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:
Tom Tromey 2020-09-17 14:11:38 -06:00
parent 0363df3db7
commit c1e1314d00
19 changed files with 250 additions and 362 deletions

View File

@ -1,3 +1,33 @@
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.
2020-09-17 Hannes Domani <ssbssa@yahoo.de> 2020-09-17 Hannes Domani <ssbssa@yahoo.de>
* windows-nat.c (ctrl_c_handler): Use 32bit DbgUiRemoteBreakin * windows-nat.c (ctrl_c_handler): Use 32bit DbgUiRemoteBreakin

View File

@ -3403,12 +3403,12 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
if (feature_core == nullptr) if (feature_core == nullptr)
return nullptr; return nullptr;
struct tdesc_arch_data *tdesc_data = tdesc_data_alloc (); tdesc_arch_data_up tdesc_data = tdesc_data_alloc ();
/* Validate the description provides the mandatory core R registers /* Validate the description provides the mandatory core R registers
and allocate their numbers. */ and allocate their numbers. */
for (i = 0; i < ARRAY_SIZE (aarch64_r_register_names); i++) for (i = 0; i < ARRAY_SIZE (aarch64_r_register_names); i++)
valid_p &= tdesc_numbered_register (feature_core, tdesc_data, valid_p &= tdesc_numbered_register (feature_core, tdesc_data.get (),
AARCH64_X0_REGNUM + i, AARCH64_X0_REGNUM + i,
aarch64_r_register_names[i]); aarch64_r_register_names[i]);
@ -3423,7 +3423,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Validate the description provides the mandatory V registers /* Validate the description provides the mandatory V registers
and allocate their numbers. */ and allocate their numbers. */
for (i = 0; i < ARRAY_SIZE (aarch64_v_register_names); i++) for (i = 0; i < ARRAY_SIZE (aarch64_v_register_names); i++)
valid_p &= tdesc_numbered_register (feature_fpu, tdesc_data, valid_p &= tdesc_numbered_register (feature_fpu, tdesc_data.get (),
AARCH64_V0_REGNUM + i, AARCH64_V0_REGNUM + i,
aarch64_v_register_names[i]); aarch64_v_register_names[i]);
@ -3436,7 +3436,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Validate the description provides the mandatory SVE registers /* Validate the description provides the mandatory SVE registers
and allocate their numbers. */ and allocate their numbers. */
for (i = 0; i < ARRAY_SIZE (aarch64_sve_register_names); i++) for (i = 0; i < ARRAY_SIZE (aarch64_sve_register_names); i++)
valid_p &= tdesc_numbered_register (feature_sve, tdesc_data, valid_p &= tdesc_numbered_register (feature_sve, tdesc_data.get (),
AARCH64_SVE_Z0_REGNUM + i, AARCH64_SVE_Z0_REGNUM + i,
aarch64_sve_register_names[i]); aarch64_sve_register_names[i]);
@ -3461,7 +3461,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Validate the descriptor provides the mandatory PAUTH registers and /* Validate the descriptor provides the mandatory PAUTH registers and
allocate their numbers. */ allocate their numbers. */
for (i = 0; i < ARRAY_SIZE (aarch64_pauth_register_names); i++) for (i = 0; i < ARRAY_SIZE (aarch64_pauth_register_names); i++)
valid_p &= tdesc_numbered_register (feature_pauth, tdesc_data, valid_p &= tdesc_numbered_register (feature_pauth, tdesc_data.get (),
first_pauth_regnum + i, first_pauth_regnum + i,
aarch64_pauth_register_names[i]); aarch64_pauth_register_names[i]);
@ -3470,10 +3470,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
} }
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return nullptr; return nullptr;
}
/* AArch64 code is always little-endian. */ /* AArch64 code is always little-endian. */
info.byte_order_for_code = BFD_ENDIAN_LITTLE; info.byte_order_for_code = BFD_ENDIAN_LITTLE;
@ -3554,7 +3551,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Hook in the ABI-specific overrides, if they have been registered. */ /* Hook in the ABI-specific overrides, if they have been registered. */
info.target_desc = tdesc; info.target_desc = tdesc;
info.tdesc_data = tdesc_data; info.tdesc_data = tdesc_data.get ();
gdbarch_init_osabi (info, gdbarch); gdbarch_init_osabi (info, gdbarch);
dwarf2_frame_set_init_reg (gdbarch, aarch64_dwarf2_frame_init_reg); dwarf2_frame_set_init_reg (gdbarch, aarch64_dwarf2_frame_init_reg);
@ -3583,7 +3580,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_get_pc_address_flags (gdbarch, aarch64_get_pc_address_flags); set_gdbarch_get_pc_address_flags (gdbarch, aarch64_get_pc_address_flags);
tdesc_use_registers (gdbarch, tdesc, tdesc_data); tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
/* Add standard register aliases. */ /* Add standard register aliases. */
for (i = 0; i < ARRAY_SIZE (aarch64_register_aliases); i++) for (i = 0; i < ARRAY_SIZE (aarch64_register_aliases); i++)

View File

@ -2076,7 +2076,7 @@ arc_check_for_hw_loops (const struct target_desc *tdesc,
static bool static bool
arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc,
struct tdesc_arch_data **tdesc_data) tdesc_arch_data_up *tdesc_data)
{ {
const struct target_desc *tdesc_loc = info.target_desc; const struct target_desc *tdesc_loc = info.target_desc;
if (arc_debug) if (arc_debug)
@ -2125,15 +2125,15 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc,
const arc_register_feature *arc_aux_reg_feature const arc_register_feature *arc_aux_reg_feature
= determine_aux_reg_feature_set (); = determine_aux_reg_feature_set ();
struct tdesc_arch_data *tdesc_data_loc = tdesc_data_alloc (); tdesc_arch_data_up tdesc_data_loc = tdesc_data_alloc ();
arc_update_acc_reg_names (info.byte_order); arc_update_acc_reg_names (info.byte_order);
bool valid_p = arc_check_tdesc_feature (tdesc_data_loc, bool valid_p = arc_check_tdesc_feature (tdesc_data_loc.get (),
feature_core, feature_core,
arc_core_reg_feature); arc_core_reg_feature);
valid_p &= arc_check_tdesc_feature (tdesc_data_loc, valid_p &= arc_check_tdesc_feature (tdesc_data_loc.get (),
feature_aux, feature_aux,
arc_aux_reg_feature); arc_aux_reg_feature);
@ -2141,12 +2141,11 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc,
{ {
if (arc_debug) if (arc_debug)
debug_printf ("arc: Target description is not valid\n"); debug_printf ("arc: Target description is not valid\n");
tdesc_data_cleanup (tdesc_data_loc);
return false; return false;
} }
*tdesc = tdesc_loc; *tdesc = tdesc_loc;
*tdesc_data = tdesc_data_loc; *tdesc_data = std::move (tdesc_data_loc);
return true; return true;
} }
@ -2185,7 +2184,7 @@ static struct gdbarch *
arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
{ {
const struct target_desc *tdesc; const struct target_desc *tdesc;
struct tdesc_arch_data *tdesc_data; tdesc_arch_data_up tdesc_data;
if (arc_debug) if (arc_debug)
debug_printf ("arc: Architecture initialization.\n"); debug_printf ("arc: Architecture initialization.\n");
@ -2198,7 +2197,7 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
gdb::unique_xmalloc_ptr<struct gdbarch_tdep> tdep gdb::unique_xmalloc_ptr<struct gdbarch_tdep> tdep
(XCNEW (struct gdbarch_tdep)); (XCNEW (struct gdbarch_tdep));
tdep->jb_pc = -1; /* No longjmp support by default. */ tdep->jb_pc = -1; /* No longjmp support by default. */
tdep->has_hw_loops = arc_check_for_hw_loops (tdesc, tdesc_data); tdep->has_hw_loops = arc_check_for_hw_loops (tdesc, tdesc_data.get ());
struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep.release ()); struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep.release ());
/* Data types. */ /* Data types. */
@ -2338,7 +2337,7 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
} }
} }
tdesc_use_registers (gdbarch, tdesc, tdesc_data); tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
return gdbarch; return gdbarch;
} }

View File

@ -8967,7 +8967,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
struct gdbarch_list *best_arch; struct gdbarch_list *best_arch;
enum arm_abi_kind arm_abi = arm_abi_global; enum arm_abi_kind arm_abi = arm_abi_global;
enum arm_float_model fp_model = arm_fp_model; enum arm_float_model fp_model = arm_fp_model;
struct tdesc_arch_data *tdesc_data = NULL; tdesc_arch_data_up tdesc_data;
int i; int i;
bool is_m = false; bool is_m = false;
int vfp_register_count = 0; int vfp_register_count = 0;
@ -9156,29 +9156,26 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i < ARM_SP_REGNUM; i++) for (i = 0; i < ARM_SP_REGNUM; i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, i, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
arm_register_names[i]); arm_register_names[i]);
valid_p &= tdesc_numbered_register_choices (feature, tdesc_data, valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
ARM_SP_REGNUM, ARM_SP_REGNUM,
arm_sp_names); arm_sp_names);
valid_p &= tdesc_numbered_register_choices (feature, tdesc_data, valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
ARM_LR_REGNUM, ARM_LR_REGNUM,
arm_lr_names); arm_lr_names);
valid_p &= tdesc_numbered_register_choices (feature, tdesc_data, valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
ARM_PC_REGNUM, ARM_PC_REGNUM,
arm_pc_names); arm_pc_names);
if (is_m) if (is_m)
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
ARM_PS_REGNUM, "xpsr"); ARM_PS_REGNUM, "xpsr");
else else
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
ARM_PS_REGNUM, "cpsr"); ARM_PS_REGNUM, "cpsr");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
feature = tdesc_find_feature (tdesc, feature = tdesc_find_feature (tdesc,
"org.gnu.gdb.arm.fpa"); "org.gnu.gdb.arm.fpa");
@ -9186,14 +9183,11 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
{ {
valid_p = 1; valid_p = 1;
for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++) for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, i, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
arm_register_names[i]); arm_register_names[i]);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
} }
}
else else
have_fpa_registers = false; have_fpa_registers = false;
@ -9211,25 +9205,22 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++) for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++)
valid_p valid_p
&= tdesc_numbered_register (feature, tdesc_data, i, &= tdesc_numbered_register (feature, tdesc_data.get (), i,
iwmmxt_names[i - ARM_WR0_REGNUM]); iwmmxt_names[i - ARM_WR0_REGNUM]);
/* Check for the control registers, but do not fail if they /* Check for the control registers, but do not fail if they
are missing. */ are missing. */
for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++) for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++)
tdesc_numbered_register (feature, tdesc_data, i, tdesc_numbered_register (feature, tdesc_data.get (), i,
iwmmxt_names[i - ARM_WR0_REGNUM]); iwmmxt_names[i - ARM_WR0_REGNUM]);
for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++) for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++)
valid_p valid_p
&= tdesc_numbered_register (feature, tdesc_data, i, &= tdesc_numbered_register (feature, tdesc_data.get (), i,
iwmmxt_names[i - ARM_WR0_REGNUM]); iwmmxt_names[i - ARM_WR0_REGNUM]);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_wmmx_registers = true; have_wmmx_registers = true;
} }
@ -9253,7 +9244,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
{ {
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
ARM_D0_REGNUM + i, ARM_D0_REGNUM + i,
vfp_double_names[i]); vfp_double_names[i]);
if (!valid_p) if (!valid_p)
@ -9263,13 +9254,10 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
/* Also require FPSCR. */ /* Also require FPSCR. */
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
ARM_FPSCR_REGNUM, "fpscr"); ARM_FPSCR_REGNUM, "fpscr");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
if (tdesc_unnumbered_register (feature, "s0") == 0) if (tdesc_unnumbered_register (feature, "s0") == 0)
have_vfp_pseudos = true; have_vfp_pseudos = true;
@ -9285,10 +9273,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
{ {
/* NEON requires 32 double-precision registers. */ /* NEON requires 32 double-precision registers. */
if (i != 32) if (i != 32)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
/* If there are quad registers defined by the stub, use /* If there are quad registers defined by the stub, use
their type; otherwise (normally) provide them with their type; otherwise (normally) provide them with
@ -9328,11 +9313,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
} }
if (best_arch != NULL) if (best_arch != NULL)
{
if (tdesc_data != NULL)
tdesc_data_cleanup (tdesc_data);
return best_arch->gdbarch; return best_arch->gdbarch;
}
tdep = XCNEW (struct gdbarch_tdep); tdep = XCNEW (struct gdbarch_tdep);
gdbarch = gdbarch_alloc (&info, tdep); gdbarch = gdbarch_alloc (&info, tdep);
@ -9534,11 +9515,11 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write); set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write);
} }
if (tdesc_data) if (tdesc_data != nullptr)
{ {
set_tdesc_pseudo_register_name (gdbarch, arm_register_name); set_tdesc_pseudo_register_name (gdbarch, arm_register_name);
tdesc_use_registers (gdbarch, tdesc, tdesc_data); tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
/* Override tdesc_register_type to adjust the types of VFP /* Override tdesc_register_type to adjust the types of VFP
registers for NEON. */ registers for NEON. */

View File

@ -8430,7 +8430,6 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
{ {
struct gdbarch_tdep *tdep; struct gdbarch_tdep *tdep;
struct gdbarch *gdbarch; struct gdbarch *gdbarch;
struct tdesc_arch_data *tdesc_data;
const struct target_desc *tdesc; const struct target_desc *tdesc;
int mm0_regnum; int mm0_regnum;
int ymm0_regnum; int ymm0_regnum;
@ -8669,7 +8668,7 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* No segment base registers. */ /* No segment base registers. */
tdep->fsbase_regnum = -1; tdep->fsbase_regnum = -1;
tdesc_data = tdesc_data_alloc (); tdesc_arch_data_up tdesc_data = tdesc_data_alloc ();
set_gdbarch_relocate_instruction (gdbarch, i386_relocate_instruction); set_gdbarch_relocate_instruction (gdbarch, i386_relocate_instruction);
@ -8682,12 +8681,11 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Hook in ABI-specific overrides, if they have been registered. /* Hook in ABI-specific overrides, if they have been registered.
Note: If INFO specifies a 64 bit arch, this is where we turn Note: If INFO specifies a 64 bit arch, this is where we turn
a 32-bit i386 into a 64-bit amd64. */ a 32-bit i386 into a 64-bit amd64. */
info.tdesc_data = tdesc_data; info.tdesc_data = tdesc_data.get ();
gdbarch_init_osabi (info, gdbarch); gdbarch_init_osabi (info, gdbarch);
if (!i386_validate_tdesc_p (tdep, tdesc_data)) if (!i386_validate_tdesc_p (tdep, tdesc_data.get ()))
{ {
tdesc_data_cleanup (tdesc_data);
xfree (tdep); xfree (tdep);
gdbarch_free (gdbarch); gdbarch_free (gdbarch);
return NULL; return NULL;
@ -8709,7 +8707,7 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Target description may be changed. */ /* Target description may be changed. */
tdesc = tdep->tdesc; tdesc = tdep->tdesc;
tdesc_use_registers (gdbarch, tdesc, tdesc_data); tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
/* Override gdbarch_register_reggroup_p set in tdesc_use_registers. */ /* Override gdbarch_register_reggroup_p set in tdesc_use_registers. */
set_gdbarch_register_reggroup_p (gdbarch, tdep->register_reggroup_p); set_gdbarch_register_reggroup_p (gdbarch, tdep->register_reggroup_p);

View File

@ -1130,7 +1130,7 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
struct gdbarch_tdep *tdep = NULL; struct gdbarch_tdep *tdep = NULL;
struct gdbarch *gdbarch; struct gdbarch *gdbarch;
struct gdbarch_list *best_arch; struct gdbarch_list *best_arch;
struct tdesc_arch_data *tdesc_data = NULL; tdesc_arch_data_up tdesc_data;
int i; int i;
enum m68k_flavour flavour = m68k_no_flavour; enum m68k_flavour flavour = m68k_no_flavour;
int has_fp = 1; int has_fp = 1;
@ -1168,14 +1168,11 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i <= M68K_PC_REGNUM; i++) for (i = 0; i <= M68K_PC_REGNUM; i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, i, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
m68k_register_names[i]); m68k_register_names[i]);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
feature = tdesc_find_feature (info.target_desc, feature = tdesc_find_feature (info.target_desc,
"org.gnu.gdb.coldfire.fp"); "org.gnu.gdb.coldfire.fp");
@ -1183,14 +1180,11 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
{ {
valid_p = 1; valid_p = 1;
for (i = M68K_FP0_REGNUM; i <= M68K_FPI_REGNUM; i++) for (i = M68K_FP0_REGNUM; i <= M68K_FPI_REGNUM; i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, i, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
m68k_register_names[i]); m68k_register_names[i]);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
} }
}
else else
has_fp = 0; has_fp = 0;
} }
@ -1246,11 +1240,7 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
} }
if (best_arch != NULL) if (best_arch != NULL)
{
if (tdesc_data != NULL)
tdesc_data_cleanup (tdesc_data);
return best_arch->gdbarch; return best_arch->gdbarch;
}
tdep = XCNEW (struct gdbarch_tdep); tdep = XCNEW (struct gdbarch_tdep);
gdbarch = gdbarch_alloc (&info, tdep); gdbarch = gdbarch_alloc (&info, tdep);
@ -1327,8 +1317,8 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
frame_unwind_append_unwinder (gdbarch, &m68k_frame_unwind); frame_unwind_append_unwinder (gdbarch, &m68k_frame_unwind);
if (tdesc_data) if (tdesc_data != nullptr)
tdesc_use_registers (gdbarch, info.target_desc, tdesc_data); tdesc_use_registers (gdbarch, info.target_desc, std::move (tdesc_data));
return gdbarch; return gdbarch;
} }

View File

@ -651,7 +651,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
{ {
struct gdbarch_tdep *tdep; struct gdbarch_tdep *tdep;
struct gdbarch *gdbarch; struct gdbarch *gdbarch;
struct tdesc_arch_data *tdesc_data = NULL; tdesc_arch_data_up tdesc_data;
const struct target_desc *tdesc = info.target_desc; const struct target_desc *tdesc = info.target_desc;
/* If there is already a candidate, use it. */ /* If there is already a candidate, use it. */
@ -676,27 +676,24 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i < MICROBLAZE_NUM_CORE_REGS; i++) for (i = 0; i < MICROBLAZE_NUM_CORE_REGS; i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, i, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
microblaze_register_names[i]); microblaze_register_names[i]);
feature = tdesc_find_feature (tdesc, feature = tdesc_find_feature (tdesc,
"org.gnu.gdb.microblaze.stack-protect"); "org.gnu.gdb.microblaze.stack-protect");
if (feature != NULL) if (feature != NULL)
{ {
valid_p = 1; valid_p = 1;
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
MICROBLAZE_SLR_REGNUM, MICROBLAZE_SLR_REGNUM,
"rslr"); "rslr");
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
MICROBLAZE_SHR_REGNUM, MICROBLAZE_SHR_REGNUM,
"rshr"); "rshr");
} }
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
} }
}
/* Allocate space for the new architecture. */ /* Allocate space for the new architecture. */
tdep = XCNEW (struct gdbarch_tdep); tdep = XCNEW (struct gdbarch_tdep);
@ -748,7 +745,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
frame_unwind_append_unwinder (gdbarch, &microblaze_frame_unwind); frame_unwind_append_unwinder (gdbarch, &microblaze_frame_unwind);
frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer); frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
if (tdesc_data != NULL) if (tdesc_data != NULL)
tdesc_use_registers (gdbarch, tdesc, tdesc_data); tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
return gdbarch; return gdbarch;
} }

View File

@ -8047,7 +8047,7 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
enum mips_abi mips_abi, found_abi, wanted_abi; enum mips_abi mips_abi, found_abi, wanted_abi;
int i, num_regs; int i, num_regs;
enum mips_fpu_type fpu_type; 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; int elf_fpu_type = Val_GNU_MIPS_ABI_FP_ANY;
const char * const *reg_names; const char * const *reg_names;
struct mips_regnum mips_regnum, *regnum; struct mips_regnum mips_regnum, *regnum;
@ -8310,73 +8310,58 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = MIPS_ZERO_REGNUM; i <= MIPS_RA_REGNUM; i++) 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]); mips_gprs[i]);
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
mips_regnum.lo, "lo"); 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"); 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"); mips_regnum.pc, "pc");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
feature = tdesc_find_feature (info.target_desc, feature = tdesc_find_feature (info.target_desc,
"org.gnu.gdb.mips.cp0"); "org.gnu.gdb.mips.cp0");
if (feature == NULL) if (feature == NULL)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
valid_p = 1; valid_p = 1;
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
mips_regnum.badvaddr, "badvaddr"); 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"); 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"); mips_regnum.cause, "cause");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
/* FIXME drow/2007-05-17: The FPU should be optional. The MIPS /* FIXME drow/2007-05-17: The FPU should be optional. The MIPS
backend is not prepared for that, though. */ backend is not prepared for that, though. */
feature = tdesc_find_feature (info.target_desc, feature = tdesc_find_feature (info.target_desc,
"org.gnu.gdb.mips.fpu"); "org.gnu.gdb.mips.fpu");
if (feature == NULL) if (feature == NULL)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
valid_p = 1; valid_p = 1;
for (i = 0; i < 32; i++) 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]); 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, mips_regnum.fp_control_status,
"fcsr"); "fcsr");
valid_p valid_p
&= tdesc_numbered_register (feature, tdesc_data, &= tdesc_numbered_register (feature, tdesc_data.get (),
mips_regnum.fp_implementation_revision, mips_regnum.fp_implementation_revision,
"fir"); "fir");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
num_regs = mips_regnum.fp_implementation_revision + 1; 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; i = 0;
valid_p = 1; valid_p = 1;
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
dspacc + i++, "hi1"); dspacc + i++, "hi1");
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
dspacc + i++, "lo1"); dspacc + i++, "lo1");
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
dspacc + i++, "hi2"); dspacc + i++, "hi2");
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
dspacc + i++, "lo2"); dspacc + i++, "lo2");
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
dspacc + i++, "hi3"); dspacc + i++, "hi3");
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
dspacc + i++, "lo3"); dspacc + i++, "lo3");
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
dspctl, "dspctl"); dspctl, "dspctl");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
mips_regnum.dspacc = dspacc; mips_regnum.dspacc = dspacc;
mips_regnum.dspctl = dspctl; 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) if (MIPS_FPU_TYPE (arches->gdbarch) != fpu_type)
continue; continue;
if (tdesc_data != NULL)
tdesc_data_cleanup (tdesc_data);
return arches->gdbarch; return arches->gdbarch;
} }
@ -8743,7 +8723,7 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
mips_register_g_packet_guesses (gdbarch); mips_register_g_packet_guesses (gdbarch);
/* Hook in OS ABI-specific overrides, if they have been registered. */ /* 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); gdbarch_init_osabi (info, gdbarch);
/* The hook may have adjusted num_regs, fetch the final value and /* 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_micro_frame_base_sniffer);
frame_base_append_sniffer (gdbarch, mips_insn32_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); 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 /* Override the normal target description methods to handle our
dual real and pseudo registers. */ dual real and pseudo registers. */

View File

@ -1955,7 +1955,7 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
struct gdbarch *gdbarch; struct gdbarch *gdbarch;
struct gdbarch_tdep *tdep; struct gdbarch_tdep *tdep;
struct gdbarch_list *best_arch; struct gdbarch_list *best_arch;
struct tdesc_arch_data *tdesc_data = NULL; tdesc_arch_data_up tdesc_data;
const struct target_desc *tdesc = info.target_desc; const struct target_desc *tdesc = info.target_desc;
int elf_abi = E_NDS_ABI_AABI; int elf_abi = E_NDS_ABI_AABI;
int fpu_freg = -1; int fpu_freg = -1;
@ -1988,11 +1988,9 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
tdesc_data = tdesc_data_alloc (); tdesc_data = tdesc_data_alloc ();
if (!nds32_validate_tdesc_p (tdesc, tdesc_data, &fpu_freg, &use_pseudo_fsrs)) if (!nds32_validate_tdesc_p (tdesc, tdesc_data.get (), &fpu_freg,
{ &use_pseudo_fsrs))
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
/* Allocate space for the new architecture. */ /* Allocate space for the new architecture. */
tdep = XCNEW (struct gdbarch_tdep); tdep = XCNEW (struct gdbarch_tdep);
@ -2022,7 +2020,7 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
num_regs = NDS32_NUM_REGS + num_fdr_map[fpu_freg] + num_fsr_map[fpu_freg]; num_regs = NDS32_NUM_REGS + num_fdr_map[fpu_freg] + num_fsr_map[fpu_freg];
set_gdbarch_num_regs (gdbarch, num_regs); set_gdbarch_num_regs (gdbarch, num_regs);
tdesc_use_registers (gdbarch, tdesc, tdesc_data); tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
/* Cache the register number of fs0. */ /* Cache the register number of fs0. */
if (fpu_freg != -1) if (fpu_freg != -1)
@ -2061,7 +2059,7 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
nds32_add_reggroups (gdbarch); nds32_add_reggroups (gdbarch);
/* Hook in ABI-specific overrides, if they have been registered. */ /* Hook in ABI-specific overrides, if they have been registered. */
info.tdesc_data = tdesc_data; info.tdesc_data = tdesc_data.get ();
gdbarch_init_osabi (info, gdbarch); gdbarch_init_osabi (info, gdbarch);
/* Override tdesc_register callbacks for system registers. */ /* Override tdesc_register callbacks for system registers. */

View File

@ -2275,7 +2275,7 @@ nios2_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
struct gdbarch *gdbarch; struct gdbarch *gdbarch;
struct gdbarch_tdep *tdep; struct gdbarch_tdep *tdep;
int i; int i;
struct tdesc_arch_data *tdesc_data = NULL; tdesc_arch_data_up tdesc_data;
const struct target_desc *tdesc = info.target_desc; const struct target_desc *tdesc = info.target_desc;
if (!tdesc_has_registers (tdesc)) if (!tdesc_has_registers (tdesc))
@ -2297,15 +2297,12 @@ nios2_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i < NIOS2_NUM_REGS; i++) for (i = 0; i < NIOS2_NUM_REGS; i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, i, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
nios2_reg_names[i]); nios2_reg_names[i]);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
} }
}
/* Find a candidate among the list of pre-declared architectures. */ /* Find a candidate among the list of pre-declared architectures. */
arches = gdbarch_list_lookup_by_info (arches, &info); arches = gdbarch_list_lookup_by_info (arches, &info);
@ -2384,8 +2381,8 @@ nios2_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Enable inferior call support. */ /* Enable inferior call support. */
set_gdbarch_push_dummy_call (gdbarch, nios2_push_dummy_call); set_gdbarch_push_dummy_call (gdbarch, nios2_push_dummy_call);
if (tdesc_data) if (tdesc_data != nullptr)
tdesc_use_registers (gdbarch, tdesc, tdesc_data); tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
return gdbarch; return gdbarch;
} }

View File

@ -1113,7 +1113,7 @@ or1k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
struct gdbarch *gdbarch; struct gdbarch *gdbarch;
struct gdbarch_tdep *tdep; struct gdbarch_tdep *tdep;
const struct bfd_arch_info *binfo; const struct bfd_arch_info *binfo;
struct tdesc_arch_data *tdesc_data = NULL; tdesc_arch_data_up tdesc_data;
const struct target_desc *tdesc = info.target_desc; const struct target_desc *tdesc = info.target_desc;
/* Find a candidate among the list of pre-declared architectures. */ /* Find a candidate among the list of pre-declared architectures. */
@ -1221,15 +1221,12 @@ or1k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i < OR1K_NUM_REGS; i++) for (i = 0; i < OR1K_NUM_REGS; i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, i, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
or1k_reg_names[i]); or1k_reg_names[i]);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
} }
}
if (tdesc_data != NULL) if (tdesc_data != NULL)
{ {
@ -1243,7 +1240,7 @@ or1k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
reggroup_add (gdbarch, save_reggroup); reggroup_add (gdbarch, save_reggroup);
reggroup_add (gdbarch, restore_reggroup); reggroup_add (gdbarch, restore_reggroup);
tdesc_use_registers (gdbarch, tdesc, tdesc_data); tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
} }
/* Hook in ABI-specific overrides, if they have been registered. */ /* Hook in ABI-specific overrides, if they have been registered. */

View File

@ -3320,10 +3320,10 @@ riscv_gdbarch_init (struct gdbarch_info info,
if (feature_cpu == NULL) if (feature_cpu == NULL)
return NULL; return NULL;
struct tdesc_arch_data *tdesc_data = tdesc_data_alloc (); tdesc_arch_data_up tdesc_data = tdesc_data_alloc ();
std::vector<riscv_pending_register_alias> pending_aliases; std::vector<riscv_pending_register_alias> pending_aliases;
bool valid_p = riscv_check_tdesc_feature (tdesc_data, bool valid_p = riscv_check_tdesc_feature (tdesc_data.get (),
feature_cpu, feature_csr, feature_cpu, feature_csr,
&riscv_xreg_feature, &riscv_xreg_feature,
&pending_aliases); &pending_aliases);
@ -3345,7 +3345,7 @@ riscv_gdbarch_init (struct gdbarch_info info,
if (feature_fpu != NULL) if (feature_fpu != NULL)
{ {
valid_p &= riscv_check_tdesc_feature (tdesc_data, feature_fpu, valid_p &= riscv_check_tdesc_feature (tdesc_data.get (), feature_fpu,
feature_csr, feature_csr,
&riscv_freg_feature, &riscv_freg_feature,
&pending_aliases); &pending_aliases);
@ -3383,12 +3383,12 @@ riscv_gdbarch_init (struct gdbarch_info info,
} }
if (feature_virtual) if (feature_virtual)
riscv_check_tdesc_feature (tdesc_data, feature_virtual, feature_csr, riscv_check_tdesc_feature (tdesc_data.get (), feature_virtual, feature_csr,
&riscv_virtual_feature, &riscv_virtual_feature,
&pending_aliases); &pending_aliases);
if (feature_csr) if (feature_csr)
riscv_check_tdesc_feature (tdesc_data, feature_csr, nullptr, riscv_check_tdesc_feature (tdesc_data.get (), feature_csr, nullptr,
&riscv_csr_feature, &riscv_csr_feature,
&pending_aliases); &pending_aliases);
@ -3396,7 +3396,6 @@ riscv_gdbarch_init (struct gdbarch_info info,
{ {
if (riscv_debug_gdbarch) if (riscv_debug_gdbarch)
fprintf_unfiltered (gdb_stdlog, "Target description is not valid\n"); fprintf_unfiltered (gdb_stdlog, "Target description is not valid\n");
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
} }
@ -3442,10 +3441,7 @@ riscv_gdbarch_init (struct gdbarch_info info,
} }
if (arches != NULL) if (arches != NULL)
{
tdesc_data_cleanup (tdesc_data);
return arches->gdbarch; return arches->gdbarch;
}
/* None found, so create a new architecture from the information provided. */ /* None found, so create a new architecture from the information provided. */
tdep = new (struct gdbarch_tdep); tdep = new (struct gdbarch_tdep);
@ -3511,7 +3507,8 @@ riscv_gdbarch_init (struct gdbarch_info info,
set_gdbarch_print_registers_info (gdbarch, riscv_print_registers_info); set_gdbarch_print_registers_info (gdbarch, riscv_print_registers_info);
/* Finalise the target description registers. */ /* Finalise the target description registers. */
tdesc_use_registers (gdbarch, tdesc, tdesc_data, riscv_tdesc_unknown_reg); tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data),
riscv_tdesc_unknown_reg);
/* Override the register type callback setup by the target description /* Override the register type callback setup by the target description
mechanism. This allows us to provide special type for floating point mechanism. This allows us to provide special type for floating point

View File

@ -6138,7 +6138,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
int have_htm_tar = 0; int have_htm_tar = 0;
int tdesc_wordsize = -1; int tdesc_wordsize = -1;
const struct target_desc *tdesc = info.target_desc; const struct target_desc *tdesc = info.target_desc;
struct tdesc_arch_data *tdesc_data = NULL; tdesc_arch_data_up tdesc_data;
int num_pseudoregs = 0; int num_pseudoregs = 0;
int cur_reg; int cur_reg;
@ -6235,31 +6235,29 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i < ppc_num_gprs; i++) for (i = 0; i < ppc_num_gprs; i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, i, gprs[i]); valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
valid_p &= tdesc_numbered_register (feature, tdesc_data, PPC_PC_REGNUM, i, gprs[i]);
"pc"); valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
valid_p &= tdesc_numbered_register (feature, tdesc_data, PPC_LR_REGNUM, PPC_PC_REGNUM, "pc");
"lr"); valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
valid_p &= tdesc_numbered_register (feature, tdesc_data, PPC_XER_REGNUM, PPC_LR_REGNUM, "lr");
"xer"); valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_XER_REGNUM, "xer");
/* Allow alternate names for these registers, to accomodate GDB's /* Allow alternate names for these registers, to accomodate GDB's
historic naming. */ historic naming. */
valid_p &= tdesc_numbered_register_choices (feature, tdesc_data, valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
PPC_MSR_REGNUM, msr_names); PPC_MSR_REGNUM, msr_names);
valid_p &= tdesc_numbered_register_choices (feature, tdesc_data, valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
PPC_CR_REGNUM, cr_names); PPC_CR_REGNUM, cr_names);
valid_p &= tdesc_numbered_register_choices (feature, tdesc_data, valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
PPC_CTR_REGNUM, ctr_names); PPC_CTR_REGNUM, ctr_names);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_mq = tdesc_numbered_register (feature, tdesc_data, PPC_MQ_REGNUM, have_mq = tdesc_numbered_register (feature, tdesc_data.get (),
"mq"); PPC_MQ_REGNUM, "mq");
tdesc_wordsize = tdesc_register_bitsize (feature, "pc") / 8; tdesc_wordsize = tdesc_register_bitsize (feature, "pc") / 8;
if (wordsize == -1) if (wordsize == -1)
@ -6277,16 +6275,13 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
}; };
valid_p = 1; valid_p = 1;
for (i = 0; i < ppc_num_fprs; i++) for (i = 0; i < ppc_num_fprs; i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_F0_REGNUM + i, fprs[i]); PPC_F0_REGNUM + i, fprs[i]);
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_FPSCR_REGNUM, "fpscr"); PPC_FPSCR_REGNUM, "fpscr");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_fpu = 1; have_fpu = 1;
/* The fpscr register was expanded in isa 2.05 to 64 bits /* The fpscr register was expanded in isa 2.05 to 64 bits
@ -6311,19 +6306,16 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i < ppc_num_gprs; i++) for (i = 0; i < ppc_num_gprs; i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_VR0_REGNUM + i, PPC_VR0_REGNUM + i,
vector_regs[i]); vector_regs[i]);
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_VSCR_REGNUM, "vscr"); PPC_VSCR_REGNUM, "vscr");
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_VRSAVE_REGNUM, "vrsave"); PPC_VRSAVE_REGNUM, "vrsave");
if (have_spe || !valid_p) if (have_spe || !valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_altivec = 1; have_altivec = 1;
} }
else else
@ -6347,15 +6339,12 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i < ppc_num_vshrs; i++) for (i = 0; i < ppc_num_vshrs; i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_VSR0_UPPER_REGNUM + i, PPC_VSR0_UPPER_REGNUM + i,
vsx_regs[i]); vsx_regs[i]);
if (!valid_p || !have_fpu || !have_altivec) if (!valid_p || !have_fpu || !have_altivec)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_vsx = 1; have_vsx = 1;
} }
@ -6392,19 +6381,16 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i < ppc_num_gprs; i++) for (i = 0; i < ppc_num_gprs; i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_SPE_UPPER_GP0_REGNUM + i, PPC_SPE_UPPER_GP0_REGNUM + i,
upper_spe[i]); upper_spe[i]);
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_SPE_ACC_REGNUM, "acc"); PPC_SPE_ACC_REGNUM, "acc");
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_SPE_FSCR_REGNUM, "spefscr"); PPC_SPE_FSCR_REGNUM, "spefscr");
if (have_mq || have_fpu || !valid_p) if (have_mq || have_fpu || !valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_spe = 1; have_spe = 1;
} }
else else
@ -6416,14 +6402,11 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
if (feature != NULL) if (feature != NULL)
{ {
valid_p = 1; valid_p = 1;
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_PPR_REGNUM, "ppr"); PPC_PPR_REGNUM, "ppr");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_ppr = 1; have_ppr = 1;
} }
else else
@ -6435,14 +6418,11 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
if (feature != NULL) if (feature != NULL)
{ {
valid_p = 1; valid_p = 1;
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_DSCR_REGNUM, "dscr"); PPC_DSCR_REGNUM, "dscr");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_dscr = 1; have_dscr = 1;
} }
else else
@ -6454,14 +6434,11 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
if (feature != NULL) if (feature != NULL)
{ {
valid_p = 1; valid_p = 1;
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_TAR_REGNUM, "tar"); PPC_TAR_REGNUM, "tar");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_tar = 1; have_tar = 1;
} }
else else
@ -6478,14 +6455,11 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i < ARRAY_SIZE (ebb_regs); i++) for (i = 0; i < ARRAY_SIZE (ebb_regs); i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_BESCR_REGNUM + i, PPC_BESCR_REGNUM + i,
ebb_regs[i]); ebb_regs[i]);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_ebb = 1; have_ebb = 1;
} }
else else
@ -6499,27 +6473,24 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
{ {
valid_p = 1; valid_p = 1;
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_MMCR0_REGNUM, PPC_MMCR0_REGNUM,
"mmcr0"); "mmcr0");
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_MMCR2_REGNUM, PPC_MMCR2_REGNUM,
"mmcr2"); "mmcr2");
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_SIAR_REGNUM, PPC_SIAR_REGNUM,
"siar"); "siar");
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_SDAR_REGNUM, PPC_SDAR_REGNUM,
"sdar"); "sdar");
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_SIER_REGNUM, PPC_SIER_REGNUM,
"sier"); "sier");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_pmu = 1; have_pmu = 1;
} }
else else
@ -6536,14 +6507,11 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i < ARRAY_SIZE (tm_spr_regs); i++) for (i = 0; i < ARRAY_SIZE (tm_spr_regs); i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_TFHAR_REGNUM + i, PPC_TFHAR_REGNUM + i,
tm_spr_regs[i]); tm_spr_regs[i]);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_htm_spr = 1; have_htm_spr = 1;
} }
@ -6565,14 +6533,11 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i < ARRAY_SIZE (cgprs); i++) for (i = 0; i < ARRAY_SIZE (cgprs); i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_CR0_REGNUM + i, PPC_CR0_REGNUM + i,
cgprs[i]); cgprs[i]);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_htm_core = 1; have_htm_core = 1;
} }
@ -6594,15 +6559,12 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
}; };
for (i = 0; i < ARRAY_SIZE (cfprs); i++) for (i = 0; i < ARRAY_SIZE (cfprs); i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_CF0_REGNUM + i, PPC_CF0_REGNUM + i,
cfprs[i]); cfprs[i]);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_htm_fpu = 1; have_htm_fpu = 1;
} }
else else
@ -6624,15 +6586,12 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
}; };
for (i = 0; i < ARRAY_SIZE (cvmx); i++) for (i = 0; i < ARRAY_SIZE (cvmx); i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
PPC_CVR0_REGNUM + i, PPC_CVR0_REGNUM + i,
cvmx[i]); cvmx[i]);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_htm_altivec = 1; have_htm_altivec = 1;
} }
else else
@ -6654,16 +6613,13 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
}; };
for (i = 0; i < ARRAY_SIZE (cvsx); i++) for (i = 0; i < ARRAY_SIZE (cvsx); i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
(PPC_CVSR0_UPPER_REGNUM (PPC_CVSR0_UPPER_REGNUM
+ i), + i),
cvsx[i]); cvsx[i]);
if (!valid_p || !have_htm_fpu || !have_htm_altivec) if (!valid_p || !have_htm_fpu || !have_htm_altivec)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_htm_vsx = 1; have_htm_vsx = 1;
} }
else else
@ -6673,14 +6629,11 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
"org.gnu.gdb.power.htm.ppr"); "org.gnu.gdb.power.htm.ppr");
if (feature != NULL) if (feature != NULL)
{ {
valid_p = tdesc_numbered_register (feature, tdesc_data, valid_p = tdesc_numbered_register (feature, tdesc_data.get (),
PPC_CPPR_REGNUM, "cppr"); PPC_CPPR_REGNUM, "cppr");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_htm_ppr = 1; have_htm_ppr = 1;
} }
else else
@ -6690,14 +6643,11 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
"org.gnu.gdb.power.htm.dscr"); "org.gnu.gdb.power.htm.dscr");
if (feature != NULL) if (feature != NULL)
{ {
valid_p = tdesc_numbered_register (feature, tdesc_data, valid_p = tdesc_numbered_register (feature, tdesc_data.get (),
PPC_CDSCR_REGNUM, "cdscr"); PPC_CDSCR_REGNUM, "cdscr");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_htm_dscr = 1; have_htm_dscr = 1;
} }
else else
@ -6707,14 +6657,11 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
"org.gnu.gdb.power.htm.tar"); "org.gnu.gdb.power.htm.tar");
if (feature != NULL) if (feature != NULL)
{ {
valid_p = tdesc_numbered_register (feature, tdesc_data, valid_p = tdesc_numbered_register (feature, tdesc_data.get (),
PPC_CTAR_REGNUM, "ctar"); PPC_CTAR_REGNUM, "ctar");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
have_htm_tar = 1; have_htm_tar = 1;
} }
else else
@ -6733,10 +6680,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
supplies a 64-bit description while debugging a 32-bit supplies a 64-bit description while debugging a 32-bit
binary. */ binary. */
if (tdesc_wordsize != -1 && tdesc_wordsize != wordsize) if (tdesc_wordsize != -1 && tdesc_wordsize != wordsize)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
#ifdef HAVE_ELF #ifdef HAVE_ELF
if (from_elf_exec) if (from_elf_exec)
@ -6872,12 +6816,8 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
if (tdep && tdep->vector_abi != vector_abi) if (tdep && tdep->vector_abi != vector_abi)
continue; continue;
if (tdep && tdep->wordsize == wordsize) if (tdep && tdep->wordsize == wordsize)
{
if (tdesc_data != NULL)
tdesc_data_cleanup (tdesc_data);
return arches->gdbarch; return arches->gdbarch;
} }
}
/* None found, create a new architecture from INFO, whose bfd_arch_info /* None found, create a new architecture from INFO, whose bfd_arch_info
validity depends on the source: validity depends on the source:
@ -7070,7 +7010,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Hook in ABI-specific overrides, if they have been registered. */ /* Hook in ABI-specific overrides, if they have been registered. */
info.target_desc = tdesc; info.target_desc = tdesc;
info.tdesc_data = tdesc_data; info.tdesc_data = tdesc_data.get ();
gdbarch_init_osabi (info, gdbarch); gdbarch_init_osabi (info, gdbarch);
switch (info.osabi) switch (info.osabi)
@ -7093,7 +7033,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_tdesc_pseudo_register_type (gdbarch, rs6000_pseudo_register_type); set_tdesc_pseudo_register_type (gdbarch, rs6000_pseudo_register_type);
set_tdesc_pseudo_register_reggroup_p (gdbarch, set_tdesc_pseudo_register_reggroup_p (gdbarch,
rs6000_pseudo_register_reggroup_p); rs6000_pseudo_register_reggroup_p);
tdesc_use_registers (gdbarch, tdesc, tdesc_data); tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
/* Override the normal target description method to make the SPE upper /* Override the normal target description method to make the SPE upper
halves anonymous. */ halves anonymous. */

View File

@ -944,7 +944,7 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
struct gdbarch *gdbarch; struct gdbarch *gdbarch;
struct gdbarch_tdep *tdep; struct gdbarch_tdep *tdep;
int elf_flags; int elf_flags;
struct tdesc_arch_data *tdesc_data = NULL; tdesc_arch_data_up tdesc_data;
const struct target_desc *tdesc = info.target_desc; const struct target_desc *tdesc = info.target_desc;
/* Extract the elf_flags if available. */ /* Extract the elf_flags if available. */
@ -982,16 +982,13 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
{ {
tdesc_data = tdesc_data_alloc (); tdesc_data = tdesc_data_alloc ();
for (int i = 0; i < RX_NUM_REGS; i++) for (int i = 0; i < RX_NUM_REGS; i++)
valid_p &= tdesc_numbered_register (feature, tdesc_data, i, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
rx_register_names[i]); rx_register_names[i]);
} }
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
} }
}
gdb_assert(tdesc_data != NULL); gdb_assert(tdesc_data != NULL);
@ -1000,7 +997,7 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
tdep->elf_flags = elf_flags; tdep->elf_flags = elf_flags;
set_gdbarch_num_regs (gdbarch, RX_NUM_REGS); set_gdbarch_num_regs (gdbarch, RX_NUM_REGS);
tdesc_use_registers (gdbarch, tdesc, tdesc_data); tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
set_gdbarch_num_pseudo_regs (gdbarch, 0); set_gdbarch_num_pseudo_regs (gdbarch, 0);
set_gdbarch_pc_regnum (gdbarch, RX_PC_REGNUM); set_gdbarch_pc_regnum (gdbarch, RX_PC_REGNUM);

View File

@ -7022,8 +7022,8 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
struct gdbarch_tdep *tdep = s390_gdbarch_tdep_alloc (); struct gdbarch_tdep *tdep = s390_gdbarch_tdep_alloc ();
struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep); struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
struct tdesc_arch_data *tdesc_data = tdesc_data_alloc (); tdesc_arch_data_up tdesc_data = tdesc_data_alloc ();
info.tdesc_data = tdesc_data; info.tdesc_data = tdesc_data.get ();
set_gdbarch_believe_pcc_promotion (gdbarch, 0); set_gdbarch_believe_pcc_promotion (gdbarch, 0);
set_gdbarch_char_signed (gdbarch, 0); set_gdbarch_char_signed (gdbarch, 0);
@ -7149,9 +7149,8 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
tdep->tdesc = tdesc; tdep->tdesc = tdesc;
/* Check any target description for validity. */ /* Check any target description for validity. */
if (!s390_tdesc_valid (tdep, tdesc_data)) if (!s390_tdesc_valid (tdep, tdesc_data.get ()))
{ {
tdesc_data_cleanup (tdesc_data);
xfree (tdep); xfree (tdep);
gdbarch_free (gdbarch); gdbarch_free (gdbarch);
return NULL; return NULL;
@ -7182,13 +7181,12 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
if (tmp->vector_abi != tdep->vector_abi) if (tmp->vector_abi != tdep->vector_abi)
continue; continue;
tdesc_data_cleanup (tdesc_data);
xfree (tdep); xfree (tdep);
gdbarch_free (gdbarch); gdbarch_free (gdbarch);
return arches->gdbarch; return arches->gdbarch;
} }
tdesc_use_registers (gdbarch, tdep->tdesc, tdesc_data); tdesc_use_registers (gdbarch, tdep->tdesc, std::move (tdesc_data));
set_gdbarch_register_name (gdbarch, s390_register_name); set_gdbarch_register_name (gdbarch, s390_register_name);
/* Assign pseudo register numbers. */ /* Assign pseudo register numbers. */

View File

@ -1898,35 +1898,32 @@ sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
if (tdesc_has_registers (tdesc)) if (tdesc_has_registers (tdesc))
{ {
struct tdesc_arch_data *tdesc_data = tdesc_data_alloc (); tdesc_arch_data_up tdesc_data = tdesc_data_alloc ();
/* Validate that the descriptor provides the mandatory registers /* Validate that the descriptor provides the mandatory registers
and allocate their numbers. */ and allocate their numbers. */
valid_p &= validate_tdesc_registers (tdesc, tdesc_data, valid_p &= validate_tdesc_registers (tdesc, tdesc_data.get (),
"org.gnu.gdb.sparc.cpu", "org.gnu.gdb.sparc.cpu",
sparc_core_register_names, sparc_core_register_names,
ARRAY_SIZE (sparc_core_register_names), ARRAY_SIZE (sparc_core_register_names),
SPARC_G0_REGNUM); SPARC_G0_REGNUM);
valid_p &= validate_tdesc_registers (tdesc, tdesc_data, valid_p &= validate_tdesc_registers (tdesc, tdesc_data.get (),
"org.gnu.gdb.sparc.fpu", "org.gnu.gdb.sparc.fpu",
tdep->fpu_register_names, tdep->fpu_register_names,
tdep->fpu_registers_num, tdep->fpu_registers_num,
SPARC_F0_REGNUM); SPARC_F0_REGNUM);
valid_p &= validate_tdesc_registers (tdesc, tdesc_data, valid_p &= validate_tdesc_registers (tdesc, tdesc_data.get (),
"org.gnu.gdb.sparc.cp0", "org.gnu.gdb.sparc.cp0",
tdep->cp0_register_names, tdep->cp0_register_names,
tdep->cp0_registers_num, tdep->cp0_registers_num,
SPARC_F0_REGNUM SPARC_F0_REGNUM
+ tdep->fpu_registers_num); + tdep->fpu_registers_num);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
/* Target description may have changed. */ /* Target description may have changed. */
info.tdesc_data = tdesc_data; info.tdesc_data = tdesc_data.get ();
tdesc_use_registers (gdbarch, tdesc, tdesc_data); tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
} }
/* If we have register sets, enable the generic core file support. */ /* If we have register sets, enable the generic core file support. */

View File

@ -779,21 +779,17 @@ tdesc_data_init (struct obstack *obstack)
/* Similar, but for the temporary copy used during architecture /* Similar, but for the temporary copy used during architecture
initialization. */ initialization. */
struct tdesc_arch_data * tdesc_arch_data_up
tdesc_data_alloc (void) tdesc_data_alloc (void)
{ {
return new tdesc_arch_data (); return tdesc_arch_data_up (new tdesc_arch_data ());
} }
/* Free something allocated by tdesc_data_alloc, if it is not going /* See target-descriptions.h. */
to be used (for instance if it was unsuitable for the
architecture). */
void void
tdesc_data_cleanup (void *data_untyped) tdesc_arch_data_deleter::operator() (struct tdesc_arch_data *data) const
{ {
struct tdesc_arch_data *data = (struct tdesc_arch_data *) data_untyped;
delete data; delete data;
} }
@ -1103,7 +1099,7 @@ set_tdesc_pseudo_register_reggroup_p
void void
tdesc_use_registers (struct gdbarch *gdbarch, tdesc_use_registers (struct gdbarch *gdbarch,
const struct target_desc *target_desc, const struct target_desc *target_desc,
struct tdesc_arch_data *early_data, tdesc_arch_data_up &&early_data,
tdesc_unknown_register_ftype unk_reg_cb) tdesc_unknown_register_ftype unk_reg_cb)
{ {
int num_regs = gdbarch_num_regs (gdbarch); int num_regs = gdbarch_num_regs (gdbarch);
@ -1116,8 +1112,7 @@ tdesc_use_registers (struct gdbarch *gdbarch,
gdb_assert (tdesc_has_registers (target_desc)); gdb_assert (tdesc_has_registers (target_desc));
data = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data); data = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data);
data->arch_regs = early_data->arch_regs; data->arch_regs = std::move (early_data->arch_regs);
delete early_data;
/* Build up a set of all registers, so that we can assign register /* Build up a set of all registers, so that we can assign register
numbers where needed. The hash table expands as necessary, so numbers where needed. The hash table expands as necessary, so

View File

@ -104,6 +104,18 @@ typedef int (*tdesc_unknown_register_ftype)
(struct gdbarch *gdbarch, tdesc_feature *feature, (struct gdbarch *gdbarch, tdesc_feature *feature,
const char *reg_name, int possible_regnum); const char *reg_name, int possible_regnum);
/* A deleter adapter for a target arch data. */
struct tdesc_arch_data_deleter
{
void operator() (struct tdesc_arch_data *data) const;
};
/* A unique pointer specialization that holds a target_desc. */
typedef std::unique_ptr<tdesc_arch_data, tdesc_arch_data_deleter>
tdesc_arch_data_up;
/* Update GDBARCH to use the TARGET_DESC for registers. TARGET_DESC /* Update GDBARCH to use the TARGET_DESC for registers. TARGET_DESC
may be GDBARCH's target description or (if GDBARCH does not have may be GDBARCH's target description or (if GDBARCH does not have
one which describes registers) another target description one which describes registers) another target description
@ -119,19 +131,13 @@ typedef int (*tdesc_unknown_register_ftype)
void tdesc_use_registers (struct gdbarch *gdbarch, void tdesc_use_registers (struct gdbarch *gdbarch,
const struct target_desc *target_desc, const struct target_desc *target_desc,
struct tdesc_arch_data *early_data, tdesc_arch_data_up &&early_data,
tdesc_unknown_register_ftype unk_reg_cb = NULL); tdesc_unknown_register_ftype unk_reg_cb = NULL);
/* Allocate initial data for validation of a target description during /* Allocate initial data for validation of a target description during
gdbarch initialization. */ gdbarch initialization. */
struct tdesc_arch_data *tdesc_data_alloc (void); tdesc_arch_data_up tdesc_data_alloc ();
/* Clean up data allocated by tdesc_data_alloc. This should only
be called to discard the data; tdesc_use_registers takes ownership
of its EARLY_DATA argument. */
void tdesc_data_cleanup (void *data_untyped);
/* Search FEATURE for a register named NAME. Record REGNO and the /* Search FEATURE for a register named NAME. Record REGNO and the
register in DATA; when tdesc_use_registers is called, REGNO will be register in DATA; when tdesc_use_registers is called, REGNO will be

View File

@ -1140,7 +1140,7 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
{ {
struct gdbarch *gdbarch; struct gdbarch *gdbarch;
struct gdbarch_tdep *tdep; struct gdbarch_tdep *tdep;
struct tdesc_arch_data *tdesc_data = NULL; tdesc_arch_data_up tdesc_data;
const struct target_desc *tdesc = info.target_desc; const struct target_desc *tdesc = info.target_desc;
int has_gp = 0; int has_gp = 0;
@ -1159,20 +1159,17 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
valid_p = 1; valid_p = 1;
for (i = 0; i < 32; i++) /* A0 - A15, B0 - B15 */ for (i = 0; i < 32; i++) /* A0 - A15, B0 - B15 */
valid_p &= tdesc_numbered_register (feature, tdesc_data, i, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
tic6x_register_names[i]); tic6x_register_names[i]);
/* CSR */ /* CSR */
valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i++,
tic6x_register_names[TIC6X_CSR_REGNUM]); tic6x_register_names[TIC6X_CSR_REGNUM]);
valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i++,
tic6x_register_names[TIC6X_PC_REGNUM]); tic6x_register_names[TIC6X_PC_REGNUM]);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
}
feature = tdesc_find_feature (tdesc, "org.gnu.gdb.tic6x.gp"); feature = tdesc_find_feature (tdesc, "org.gnu.gdb.tic6x.gp");
if (feature) if (feature)
@ -1189,29 +1186,26 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
has_gp = 1; has_gp = 1;
valid_p = 1; valid_p = 1;
for (j = 0; j < 32; j++) /* A16 - A31, B16 - B31 */ for (j = 0; j < 32; j++) /* A16 - A31, B16 - B31 */
valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
gp[j]); i++, gp[j]);
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
} }
}
feature = tdesc_find_feature (tdesc, "org.gnu.gdb.tic6x.c6xp"); feature = tdesc_find_feature (tdesc, "org.gnu.gdb.tic6x.c6xp");
if (feature) if (feature)
{ {
valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, "TSR"); valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, "ILC"); i++, "TSR");
valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, "RILC"); valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
i++, "ILC");
valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
i++, "RILC");
if (!valid_p) if (!valid_p)
{
tdesc_data_cleanup (tdesc_data);
return NULL; return NULL;
} }
}
} }
@ -1295,8 +1289,8 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Hook in ABI-specific overrides, if they have been registered. */ /* Hook in ABI-specific overrides, if they have been registered. */
gdbarch_init_osabi (info, gdbarch); gdbarch_init_osabi (info, gdbarch);
if (tdesc_data) if (tdesc_data != nullptr)
tdesc_use_registers (gdbarch, tdesc, tdesc_data); tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
return gdbarch; return gdbarch;
} }