From: Andrew Cagney Date: Tue, 22 Jul 2003 19:49:58 +0000 (+0000) Subject: 2003-07-22 Andrew Cagney X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=aebd7893d9fccba42783b14198455757cffd2cb3;p=deliverable%2Fbinutils-gdb.git 2003-07-22 Andrew Cagney * 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2b1b693437..df30a0b60a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,23 @@ +2003-07-22 Andrew Cagney + + * 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. + 2003-07-22 Andrew Cagney * configure.in (build_warnings): Add -Wformat-nonliteral. diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index ee06a95e67..9d34aa5a76 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; } diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 9de12223fa..7753022a64 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -3227,6 +3227,15 @@ extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gd extern void gdbarch_free (struct gdbarch *); +/* Helper function. Allocate memory from the ``struct gdbarch'' + obstack. The memory is freed when the corresponding architecture + is also freed. */ + +extern void *gdbarch_obstack_zalloc (struct gdbarch *gdbarch, long size); +#define GDBARCH_OBSTACK_CALLOC(GDBARCH, NR, TYPE) ((TYPE *) gdbarch_obstack_zalloc ((GDBARCH), (NR) * sizeof (TYPE))) +#define GDBARCH_OBSTACK_ZALLOC(GDBARCH, TYPE) ((TYPE *) gdbarch_obstack_zalloc ((GDBARCH), sizeof (TYPE))) + + /* Helper function. Force an update of the current architecture. The actual architecture selected is determined by INFO, ``(gdb) set @@ -3248,9 +3257,7 @@ extern int gdbarch_update_p (struct gdbarch_info info); The per-architecture data-pointer is either initialized explicitly (set_gdbarch_data()) or implicitly (by INIT() via a call to - gdbarch_data()). FREE() is called to delete either an existing - data-pointer overridden by set_gdbarch_data() or when the - architecture object is being deleted. + gdbarch_data()). FREE() is ignored. When a previously created architecture is re-selected, the per-architecture data-pointer for that previous architecture is diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index 4a16d53fa8..fc72ce2980 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -1145,6 +1145,15 @@ extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gd extern void gdbarch_free (struct gdbarch *); +/* Helper function. Allocate memory from the \`\`struct gdbarch'' + obstack. The memory is freed when the corresponding architecture + is also freed. */ + +extern void *gdbarch_obstack_zalloc (struct gdbarch *gdbarch, long size); +#define GDBARCH_OBSTACK_CALLOC(GDBARCH, NR, TYPE) ((TYPE *) gdbarch_obstack_zalloc ((GDBARCH), (NR) * sizeof (TYPE))) +#define GDBARCH_OBSTACK_ZALLOC(GDBARCH, TYPE) ((TYPE *) gdbarch_obstack_zalloc ((GDBARCH), sizeof (TYPE))) + + /* Helper function. Force an update of the current architecture. The actual architecture selected is determined by INFO, \`\`(gdb) set @@ -1166,9 +1175,7 @@ extern int gdbarch_update_p (struct gdbarch_info info); The per-architecture data-pointer is either initialized explicitly (set_gdbarch_data()) or implicitly (by INIT() via a call to - gdbarch_data()). FREE() is called to delete either an existing - data-pointer overridden by set_gdbarch_data() or when the - architecture object is being deleted. + gdbarch_data()). FREE() is ignored. When a previously created architecture is re-selected, the per-architecture data-pointer for that previous architecture is @@ -1314,12 +1321,12 @@ cat <obstack = obstack; alloc_gdbarch_data (current_gdbarch); @@ -1513,6 +1532,17 @@ EOF printf "\n" printf "\n" cat <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 @@ -1522,9 +1552,12 @@ cat <initialized_p); + obstack = arch->obstack; + obstack_free (obstack, 0); /* Includes the ARCH. */ + xfree (obstack); } EOF @@ -1837,7 +1870,6 @@ struct gdbarch_data unsigned index; int init_p; gdbarch_data_init_ftype *init; - gdbarch_data_free_ftype *free; }; struct gdbarch_data_registration @@ -1872,7 +1904,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; } @@ -1884,31 +1915,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*)); + gdbarch->data = GDBARCH_OBSTACK_CALLOC (gdbarch, gdbarch->nr_data, 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; -} - - /* Initialize the current value of the specified per-architecture data-pointer. */ @@ -1918,11 +1927,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; } @@ -2019,9 +2024,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; }