diff options
Diffstat (limited to 'gdb/target-descriptions.c')
-rw-r--r-- | gdb/target-descriptions.c | 52 |
1 files changed, 21 insertions, 31 deletions
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c index 85954ac293..d5d795875c 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -479,7 +479,17 @@ get_tdesc_info (struct inferior *inf) /* A handle for architecture-specific data associated with the target description (see struct tdesc_arch_data). */ -static struct gdbarch_data *tdesc_data; +static const registry<gdbarch>::key<tdesc_arch_data> tdesc_data; + +/* Get or create the tdesc_data. */ +static tdesc_arch_data * +get_arch_data (struct gdbarch *gdbarch) +{ + tdesc_arch_data *result = tdesc_data.get (gdbarch); + if (result == nullptr) + result = tdesc_data.emplace (gdbarch); + return result; +} /* See target-descriptions.h. */ @@ -562,8 +572,7 @@ target_find_description (void) { struct tdesc_arch_data *data; - data = ((struct tdesc_arch_data *) - gdbarch_data (target_gdbarch (), tdesc_data)); + data = get_arch_data (target_gdbarch ()); if (tdesc_has_registers (tdesc_info->tdesc) && data->arch_regs.empty ()) warning (_("Target-supplied registers are not supported " @@ -742,8 +751,7 @@ tdesc_feature_name (const struct tdesc_feature *feature) struct type * tdesc_find_type (struct gdbarch *gdbarch, const char *id) { - tdesc_arch_data *data - = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data); + tdesc_arch_data *data = get_arch_data (gdbarch); for (const tdesc_arch_reg ® : data->arch_regs) { @@ -761,15 +769,6 @@ tdesc_find_type (struct gdbarch *gdbarch, const char *id) /* Construct the per-gdbarch data. */ -static void * -tdesc_data_init (struct obstack *obstack) -{ - return obstack_new<tdesc_arch_data> (obstack); -} - -/* Similar, but for the temporary copy used during architecture - initialization. */ - tdesc_arch_data_up tdesc_data_alloc (void) { @@ -867,9 +866,8 @@ tdesc_register_bitsize (const struct tdesc_feature *feature, const char *name) static struct tdesc_arch_reg * tdesc_find_arch_register (struct gdbarch *gdbarch, int regno) { - struct tdesc_arch_data *data; + struct tdesc_arch_data *data = get_arch_data (gdbarch); - data = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data); if (regno < data->arch_regs.size ()) return &data->arch_regs[regno]; else @@ -898,8 +896,7 @@ tdesc_register_name (struct gdbarch *gdbarch, int regno) if (regno >= num_regs && regno < gdbarch_num_cooked_regs (gdbarch)) { - struct tdesc_arch_data *data - = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data); + struct tdesc_arch_data *data = get_arch_data (gdbarch); gdb_assert (data->pseudo_register_name != NULL); return data->pseudo_register_name (gdbarch, regno); @@ -918,8 +915,7 @@ tdesc_register_type (struct gdbarch *gdbarch, int regno) if (reg == NULL && regno >= num_regs && regno < num_regs + num_pseudo_regs) { - struct tdesc_arch_data *data - = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data); + struct tdesc_arch_data *data = get_arch_data (gdbarch); gdb_assert (data->pseudo_register_type != NULL); return data->pseudo_register_type (gdbarch, regno); @@ -1036,8 +1032,7 @@ tdesc_register_reggroup_p (struct gdbarch *gdbarch, int regno, if (regno >= num_regs && regno < num_regs + num_pseudo_regs) { - struct tdesc_arch_data *data - = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data); + struct tdesc_arch_data *data = get_arch_data (gdbarch); if (data->pseudo_register_reggroup_p != NULL) return data->pseudo_register_reggroup_p (gdbarch, regno, reggroup); @@ -1058,8 +1053,7 @@ void set_tdesc_pseudo_register_name (struct gdbarch *gdbarch, gdbarch_register_name_ftype *pseudo_name) { - struct tdesc_arch_data *data - = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data); + struct tdesc_arch_data *data = get_arch_data (gdbarch); data->pseudo_register_name = pseudo_name; } @@ -1068,8 +1062,7 @@ void set_tdesc_pseudo_register_type (struct gdbarch *gdbarch, gdbarch_register_type_ftype *pseudo_type) { - struct tdesc_arch_data *data - = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data); + struct tdesc_arch_data *data = get_arch_data (gdbarch); data->pseudo_register_type = pseudo_type; } @@ -1079,8 +1072,7 @@ set_tdesc_pseudo_register_reggroup_p (struct gdbarch *gdbarch, gdbarch_register_reggroup_p_ftype *pseudo_reggroup_p) { - struct tdesc_arch_data *data - = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data); + struct tdesc_arch_data *data = get_arch_data (gdbarch); data->pseudo_register_reggroup_p = pseudo_reggroup_p; } @@ -1102,7 +1094,7 @@ tdesc_use_registers (struct gdbarch *gdbarch, included. */ gdb_assert (tdesc_has_registers (target_desc)); - data = (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data); + data = get_arch_data (gdbarch); data->arch_regs = std::move (early_data->arch_regs); /* Build up a set of all registers, so that we can assign register @@ -1962,8 +1954,6 @@ _initialize_target_descriptions () { cmd_list_element *cmd; - tdesc_data = gdbarch_data_register_pre_init (tdesc_data_init); - add_setshow_prefix_cmd ("tdesc", class_maintenance, _("Set target description specific variables."), _("Show target description specific variables."), |