aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbarch.c
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2003-07-22 19:49:58 +0000
committerAndrew Cagney <cagney@redhat.com>2003-07-22 19:49:58 +0000
commitaebd7893d9fccba42783b14198455757cffd2cb3 (patch)
treeb3ba2971ec0218f18d0e8a9ad9321a8c88719d27 /gdb/gdbarch.c
parente22fef83d72c23935e2bca2bc71e87e7c911a229 (diff)
downloadgdb-aebd7893d9fccba42783b14198455757cffd2cb3.zip
gdb-aebd7893d9fccba42783b14198455757cffd2cb3.tar.gz
gdb-aebd7893d9fccba42783b14198455757cffd2cb3.tar.bz2
2003-07-22 Andrew Cagney <cagney@redhat.com>
* gdbarch.c Include "gdb_obstack.h". (struct gdbarch): Add an "obstack". (alloc_gdbarch_data): Allocate the gdbarch data using GDBARCH_OBSTACK_CALLOC. (free_gdbarch_data): Delete function. (gdbarch_obstack_zalloc): New function. (gdbarch_free): Free the obstack, do not call free_gdbarch_data. Assert that the architecture is not initialized. (gdbarch_alloc): Allocate an obstack, allocate the architecture vector from the obstack. (alloc_gdbarch_data, init_gdbarch_swap): Allocate memory using the architecture obstack. (GDBARCH_OBSTACK_CALLOC, GDBARCH_OBSTACK_ZALLOC): Define. (set_gdbarch_data): Assert that the data is not initialized. (struct gdbarch_data): Delete member "free". (register_gdbarch_data): Do not initialize "free". * gdbarch.h, gdbarch.c: Re-generate.
Diffstat (limited to 'gdb/gdbarch.c')
-rw-r--r--gdb/gdbarch.c70
1 files changed, 34 insertions, 36 deletions
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c
index ee06a95..9d34aa5 100644
--- a/gdb/gdbarch.c
+++ b/gdb/gdbarch.c
@@ -67,12 +67,12 @@
#include "reggroups.h"
#include "osabi.h"
#include "symfile.h" /* For entry_point_address. */
+#include "gdb_obstack.h"
/* Static function declarations */
static void verify_gdbarch (struct gdbarch *gdbarch);
static void alloc_gdbarch_data (struct gdbarch *);
-static void free_gdbarch_data (struct gdbarch *);
static void init_gdbarch_swap (struct gdbarch *);
static void clear_gdbarch_swap (struct gdbarch *);
static void swapout_gdbarch_swap (struct gdbarch *);
@@ -92,6 +92,10 @@ struct gdbarch
{
/* Has this architecture been fully initialized? */
int initialized_p;
+
+ /* An obstack bound to the lifetime of the architecture. */
+ struct obstack *obstack;
+
/* basic architectural information */
const struct bfd_arch_info * bfd_arch_info;
int byte_order;
@@ -291,6 +295,7 @@ extern const struct bfd_arch_info bfd_default_arch_struct;
struct gdbarch startup_gdbarch =
{
1, /* Always initialized. */
+ NULL, /* The obstack. */
/* basic architecture information */
&bfd_default_arch_struct, /* bfd_arch_info */
BFD_ENDIAN_BIG, /* byte_order */
@@ -477,8 +482,15 @@ gdbarch_alloc (const struct gdbarch_info *info,
architecture. This ensures that the new architectures initial
values are not influenced by the previous architecture. Once
everything is parameterised with gdbarch, this will go away. */
- struct gdbarch *current_gdbarch = XMALLOC (struct gdbarch);
+ struct gdbarch *current_gdbarch;
+
+ /* Create an obstack for allocating all the per-architecture memory,
+ then use that to allocate the architecture vector. */
+ struct obstack *obstack = XMALLOC (struct obstack);
+ obstack_init (obstack);
+ current_gdbarch = obstack_alloc (obstack, sizeof (*current_gdbarch));
memset (current_gdbarch, 0, sizeof (*current_gdbarch));
+ current_gdbarch->obstack = obstack;
alloc_gdbarch_data (current_gdbarch);
@@ -566,6 +578,17 @@ gdbarch_alloc (const struct gdbarch_info *info,
}
+/* Allocate extra space using the per-architecture obstack. */
+
+void *
+gdbarch_obstack_zalloc (struct gdbarch *arch, long size)
+{
+ void *data = obstack_alloc (arch->obstack, size);
+ memset (data, 0, size);
+ return data;
+}
+
+
/* Free a gdbarch struct. This should never happen in normal
operation --- once you've created a gdbarch, you keep it around.
However, if an architecture's init function encounters an error
@@ -575,9 +598,12 @@ gdbarch_alloc (const struct gdbarch_info *info,
void
gdbarch_free (struct gdbarch *arch)
{
+ struct obstack *obstack;
gdb_assert (arch != NULL);
- free_gdbarch_data (arch);
- xfree (arch);
+ gdb_assert (!arch->initialized_p);
+ obstack = arch->obstack;
+ obstack_free (obstack, 0); /* Includes the ARCH. */
+ xfree (obstack);
}
@@ -5600,7 +5626,6 @@ struct gdbarch_data
unsigned index;
int init_p;
gdbarch_data_init_ftype *init;
- gdbarch_data_free_ftype *free;
};
struct gdbarch_data_registration
@@ -5635,7 +5660,6 @@ register_gdbarch_data (gdbarch_data_init_ftype *init,
(*curr)->data->index = gdbarch_data_registry.nr++;
(*curr)->data->init = init;
(*curr)->data->init_p = 1;
- (*curr)->data->free = free;
return (*curr)->data;
}
@@ -5647,31 +5671,9 @@ alloc_gdbarch_data (struct gdbarch *gdbarch)
{
gdb_assert (gdbarch->data == NULL);
gdbarch->nr_data = gdbarch_data_registry.nr;
- gdbarch->data = xcalloc (gdbarch->nr_data, sizeof (void*));
-}
-
-static void
-free_gdbarch_data (struct gdbarch *gdbarch)
-{
- struct gdbarch_data_registration *rego;
- gdb_assert (gdbarch->data != NULL);
- for (rego = gdbarch_data_registry.registrations;
- rego != NULL;
- rego = rego->next)
- {
- struct gdbarch_data *data = rego->data;
- gdb_assert (data->index < gdbarch->nr_data);
- if (data->free != NULL && gdbarch->data[data->index] != NULL)
- {
- data->free (gdbarch, gdbarch->data[data->index]);
- gdbarch->data[data->index] = NULL;
- }
- }
- xfree (gdbarch->data);
- gdbarch->data = NULL;
+ gdbarch->data = GDBARCH_OBSTACK_CALLOC (gdbarch, gdbarch->nr_data, void *);
}
-
/* Initialize the current value of the specified per-architecture
data-pointer. */
@@ -5681,11 +5683,7 @@ set_gdbarch_data (struct gdbarch *gdbarch,
void *pointer)
{
gdb_assert (data->index < gdbarch->nr_data);
- if (gdbarch->data[data->index] != NULL)
- {
- gdb_assert (data->free != NULL);
- data->free (gdbarch, gdbarch->data[data->index]);
- }
+ gdb_assert (gdbarch->data[data->index] == NULL);
gdbarch->data[data->index] = pointer;
}
@@ -5782,9 +5780,9 @@ init_gdbarch_swap (struct gdbarch *gdbarch)
{
if (rego->data != NULL)
{
- (*curr) = XMALLOC (struct gdbarch_swap);
+ (*curr) = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct gdbarch_swap);
(*curr)->source = rego;
- (*curr)->swap = xmalloc (rego->sizeof_data);
+ (*curr)->swap = gdbarch_obstack_zalloc (gdbarch, rego->sizeof_data);
(*curr)->next = NULL;
curr = &(*curr)->next;
}