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.
This commit is contained in:
parent
e22fef83d7
commit
aebd7893d9
4 changed files with 108 additions and 78 deletions
|
@ -1,3 +1,23 @@
|
|||
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.
|
||||
|
||||
2003-07-22 Andrew Cagney <cagney@redhat.com>
|
||||
|
||||
* configure.in (build_warnings): Add -Wformat-nonliteral.
|
||||
|
|
|
@ -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*));
|
||||
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. */
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 <<EOF
|
|||
#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 *);
|
||||
|
@ -1342,6 +1349,10 @@ printf "struct gdbarch\n"
|
|||
printf "{\n"
|
||||
printf " /* Has this architecture been fully initialized? */\n"
|
||||
printf " int initialized_p;\n"
|
||||
printf "\n"
|
||||
printf " /* An obstack bound to the lifetime of the architecture. */\n"
|
||||
printf " struct obstack *obstack;\n"
|
||||
printf "\n"
|
||||
printf " /* basic architectural information */\n"
|
||||
function_list | while do_read
|
||||
do
|
||||
|
@ -1415,6 +1426,7 @@ printf "\n"
|
|||
printf "struct gdbarch startup_gdbarch =\n"
|
||||
printf "{\n"
|
||||
printf " 1, /* Always initialized. */\n"
|
||||
printf " NULL, /* The obstack. */\n"
|
||||
printf " /* basic architecture information */\n"
|
||||
function_list | while do_read
|
||||
do
|
||||
|
@ -1475,8 +1487,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);
|
||||
|
||||
|
@ -1513,6 +1532,17 @@ EOF
|
|||
printf "\n"
|
||||
printf "\n"
|
||||
cat <<EOF
|
||||
/* 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
|
||||
|
@ -1522,9 +1552,12 @@ cat <<EOF
|
|||
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);
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue