diff options
author | Mark Kettenis <kettenis@gnu.org> | 2003-08-21 22:35:33 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@gnu.org> | 2003-08-21 22:35:33 +0000 |
commit | 0d0e1a63ef41342561755ff20bad14d778925152 (patch) | |
tree | c9cbe1a29625e351a2a6a0bb6efc15e8fc76b08d /gdb/objfiles.c | |
parent | d90cf509bd4aee2e024979a75685826a5289ba22 (diff) | |
download | gdb-0d0e1a63ef41342561755ff20bad14d778925152.zip gdb-0d0e1a63ef41342561755ff20bad14d778925152.tar.gz gdb-0d0e1a63ef41342561755ff20bad14d778925152.tar.bz2 |
* objfiles.h (struct objfile): Add memebers `data' and `num_data'.
(register_objfile_data, set_objfile_data, objfile_data): New
prototypes.
* objfiles.c (objfile_alloc_data, objfile_free_data): New
prototypes.
(allocate_objfile): Call objfile_alloc_data.
(free_objfile): Call objfile_free_data.
(struct objfile_data): New.
(struct objfile_data_registration): New.
(struct objfile_data_registry): New.
(objfile_data_registry): New variable.
(register_objfile_data): New function.
(objfile_alloc_data, objfile_free_data): New functions.
(set_objfile_data, objfile_data): New functions.
* dwarf2-frame.c (dwarf2_frame_data): New variable.
(dwarf2_frame_find_fde, add_fde): Use new per-objfile data mechanism.
(_initialize_dwarf2_frame): New function and prototype.
Diffstat (limited to 'gdb/objfiles.c')
-rw-r--r-- | gdb/objfiles.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 39f5623..ee4cdc4 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -34,6 +34,7 @@ #include "target.h" #include "bcache.h" +#include "gdb_assert.h" #include <sys/types.h> #include "gdb_stat.h" #include <fcntl.h> @@ -61,6 +62,9 @@ static void *map_to_file (int); static void add_to_objfile_sections (bfd *, sec_ptr, void *); +static void objfile_alloc_data (struct objfile *objfile); +static void objfile_free_data (struct objfile *objfile); + /* Externally visible variables that are owned by this module. See declarations in objfile.h for more info. */ @@ -302,6 +306,8 @@ allocate_objfile (bfd *abfd, int flags) terminate_minimal_symbol_table (objfile); } + objfile_alloc_data (objfile); + /* Update the per-objfile information that comes from the bfd, ensuring that any data that is reference is saved in the per-objfile data region. */ @@ -561,6 +567,7 @@ free_objfile (struct objfile *objfile) if (objfile != NULL) { + objfile_free_data (objfile); if (objfile->name != NULL) { xmfree (objfile->md, objfile->name); @@ -1097,4 +1104,74 @@ is_in_import_list (char *name, struct objfile *objfile) return 1; return 0; } + + +/* Keep a registry of per-objfile data-pointers required by other GDB + modules. */ + +struct objfile_data +{ + unsigned index; +}; + +struct objfile_data_registration +{ + struct objfile_data *data; + struct objfile_data_registration *next; +}; + +struct objfile_data_registry +{ + struct objfile_data_registration *registrations; + unsigned num_registrations; +}; + +static struct objfile_data_registry objfile_data_registry = { NULL, 0 }; + +const struct objfile_data * +register_objfile_data (void) +{ + struct objfile_data_registration **curr; + + /* Append new registration. */ + for (curr = &objfile_data_registry.registrations; + *curr != NULL; curr = &(*curr)->next); + *curr = XMALLOC (struct objfile_data_registration); + (*curr)->next = NULL; + (*curr)->data = XMALLOC (struct objfile_data); + (*curr)->data->index = objfile_data_registry.num_registrations++; + + return (*curr)->data; +} + +static void +objfile_alloc_data (struct objfile *objfile) +{ + gdb_assert (objfile->data == NULL); + objfile->num_data = objfile_data_registry.num_registrations; + objfile->data = XCALLOC (objfile->num_data, void *); +} + +static void +objfile_free_data (struct objfile *objfile) +{ + gdb_assert (objfile->data != NULL); + xfree (objfile->data); + objfile->data = NULL; +} + +void +set_objfile_data (struct objfile *objfile, const struct objfile_data *data, + void *value) +{ + gdb_assert (data->index < objfile->num_data); + objfile->data[data->index] = value; +} + +void * +objfile_data (struct objfile *objfile, const struct objfile_data *data) +{ + gdb_assert (data->index < objfile->num_data); + return objfile->data[data->index]; +} |