From 0d0e1a63ef41342561755ff20bad14d778925152 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Thu, 21 Aug 2003 22:35:33 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 20 ++++++++++++ gdb/dwarf2-frame.c | 17 ++++++++-- gdb/objfiles.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++ gdb/objfiles.h | 17 ++++++++++ 4 files changed, 128 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c0c62696c06..8ef8b5cc683 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,23 @@ +2003-07-13 Mark Kettenis + + * 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. + 2003-08-21 Andrew Cagney * sh3-rom.c (sh3_open, sh3e_open): Use gdbarch_update_p to select diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c index 6a40df5e325..c40726a5907 100644 --- a/gdb/dwarf2-frame.c +++ b/gdb/dwarf2-frame.c @@ -780,6 +780,8 @@ struct comp_unit bfd_vma dbase; }; +const struct objfile_data *dwarf2_frame_data; + static unsigned int read_1_byte (bfd *bfd, char *buf) { @@ -1024,7 +1026,7 @@ dwarf2_frame_find_fde (CORE_ADDR *pc) offset = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - fde = objfile->sym_private; + fde = objfile_data (objfile, dwarf2_frame_data); while (fde) { if (*pc >= fde->initial_location + offset @@ -1044,8 +1046,8 @@ dwarf2_frame_find_fde (CORE_ADDR *pc) static void add_fde (struct comp_unit *unit, struct dwarf2_fde *fde) { - fde->next = unit->objfile->sym_private; - unit->objfile->sym_private = fde; + fde->next = objfile_data (unit->objfile, dwarf2_frame_data); + set_objfile_data (unit->objfile, dwarf2_frame_data, fde); } #ifdef CC_HAS_LONG_LONG @@ -1441,3 +1443,12 @@ dwarf2_build_frame_info (struct objfile *objfile) frame_ptr = decode_frame_entry (&unit, frame_ptr, 0); } } + +/* Provide a prototype to silence -Wmissing-prototypes. */ +void _initialize_dwarf2_frame (void); + +void +_initialize_dwarf2_frame (void) +{ + dwarf2_frame_data = register_objfile_data (); +} diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 39f5623749d..ee4cdc4032c 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -34,6 +34,7 @@ #include "target.h" #include "bcache.h" +#include "gdb_assert.h" #include #include "gdb_stat.h" #include @@ -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]; +} diff --git a/gdb/objfiles.h b/gdb/objfiles.h index f747a680108..80e61c52348 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -379,6 +379,13 @@ struct objfile void *obj_private; + /* Per objfile data-pointers required by other GDB modules. */ + /* FIXME: kettenis/20030711: This mechanism could replace + sym_stab_info, sym_private and obj_private entirely. */ + + void **data; + unsigned num_data; + /* Set of relocation offsets to apply to each section. Currently on the psymbol_obstack (which makes no sense, but I'm not sure it's harming anything). @@ -565,6 +572,16 @@ extern int in_plt_section (CORE_ADDR, char *); extern int is_in_import_list (char *, struct objfile *); +/* Keep a registry of per-objfile data-pointers required by other GDB + modules. */ + +extern const struct objfile_data *register_objfile_data (void); +extern void set_objfile_data (struct objfile *objfile, + const struct objfile_data *data, void *value); +extern void *objfile_data (struct objfile *objfile, + const struct objfile_data *data); + + /* Traverse all object files. ALL_OBJFILES_SAFE works even if you delete the objfile during the traversal. */ -- 2.30.2