From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27921 invoked by alias); 13 Jul 2003 17:17:17 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 27908 invoked from network); 13 Jul 2003 17:17:11 -0000 Received: from unknown (HELO walton.kettenis.dyndns.org) (62.163.169.212) by sources.redhat.com with SMTP; 13 Jul 2003 17:17:11 -0000 Received: from elgar.kettenis.dyndns.org (elgar.kettenis.dyndns.org [192.168.0.2]) by walton.kettenis.dyndns.org (8.12.6p2/8.12.5) with ESMTP id h6DHH4aM010049 for ; Sun, 13 Jul 2003 19:17:04 +0200 (CEST) (envelope-from kettenis@elgar.kettenis.dyndns.org) Received: from elgar.kettenis.dyndns.org (localhost [127.0.0.1]) by elgar.kettenis.dyndns.org (8.12.6p2/8.12.6) with ESMTP id h6DHH4t3098572 for ; Sun, 13 Jul 2003 19:17:04 +0200 (CEST) (envelope-from kettenis@elgar.kettenis.dyndns.org) Received: (from kettenis@localhost) by elgar.kettenis.dyndns.org (8.12.6p2/8.12.6/Submit) id h6DHH425098569; Sun, 13 Jul 2003 19:17:04 +0200 (CEST) Date: Sun, 13 Jul 2003 17:17:00 -0000 Message-Id: <200307131717.h6DHH425098569@elgar.kettenis.dyndns.org> From: Mark Kettenis To: gdb-patches@sources.redhat.com Subject: [RFC/RFA] Per-objfile data mechanism X-SW-Source: 2003-07/txt/msg00264.txt.bz2 This patch adds a per-objfile data mechanism to GDB, and uses that to store DWARF2 frame info instead of abusing objfile->sym_private. The latter could lead to problems on certain platforms according to Daniel. Comments? OK to check this in? Do we want this on the release branch too? Mark Index: ChangeLog from 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. Index: objfiles.h =================================================================== RCS file: /cvs/src/src/gdb/objfiles.h,v retrieving revision 1.22 diff -u -p -r1.22 objfiles.h --- objfiles.h 24 Mar 2003 03:54:48 -0000 1.22 +++ objfiles.h 13 Jul 2003 17:16:04 -0000 @@ -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). @@ -564,6 +571,16 @@ extern struct obj_section *find_pc_sect_ 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. */ Index: objfiles.c =================================================================== RCS file: /cvs/src/src/gdb/objfiles.c,v retrieving revision 1.33 diff -u -p -r1.33 objfiles.c --- objfiles.c 11 Jun 2003 23:29:47 -0000 1.33 +++ objfiles.c 13 Jul 2003 17:16:05 -0000 @@ -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 ob 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]; +} Index: dwarf2-frame.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2-frame.c,v retrieving revision 1.8 diff -u -p -r1.8 dwarf2-frame.c --- dwarf2-frame.c 11 Jul 2003 16:22:17 -0000 1.8 +++ dwarf2-frame.c 13 Jul 2003 17:16:21 -0000 @@ -785,6 +785,8 @@ struct comp_unit bfd_vma dbase; }; +const struct objfile_data *dwarf2_frame_data; + static unsigned int read_1_byte (bfd *bfd, char *buf) { @@ -1029,7 +1031,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 @@ -1049,8 +1051,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 @@ -1445,4 +1447,13 @@ dwarf2_build_frame_info (struct objfile while (frame_ptr < unit.dwarf_frame_buffer + unit.dwarf_frame_size) 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 (); }