summaryrefslogtreecommitdiff
path: root/gdb/target-descriptions.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/target-descriptions.c')
-rw-r--r--gdb/target-descriptions.c52
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 &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."),