diff options
author | Andrew Cagney <cagney@redhat.com> | 2003-07-22 19:49:58 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2003-07-22 19:49:58 +0000 |
commit | aebd7893d9fccba42783b14198455757cffd2cb3 (patch) | |
tree | b3ba2971ec0218f18d0e8a9ad9321a8c88719d27 /gdb/gdbarch.c | |
parent | e22fef83d72c23935e2bca2bc71e87e7c911a229 (diff) | |
download | gdb-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.c | 70 |
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; } |