From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12950 invoked by alias); 1 Apr 2004 17:16:08 -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 12925 invoked from network); 1 Apr 2004 17:16:00 -0000 Received: from unknown (HELO nevyn.them.org) (66.93.172.17) by sources.redhat.com with SMTP; 1 Apr 2004 17:16:00 -0000 Received: from drow by nevyn.them.org with local (Exim 4.30 #1 (Debian)) id 1B95nJ-0004m4-Su; Thu, 01 Apr 2004 12:15:57 -0500 Date: Thu, 01 Apr 2004 17:16:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sources.redhat.com Cc: jimb@redhat.com, ezannoni@redhat.com Subject: [rfa/dwarf] Use objfile_data mechanism for per-objfile data Message-ID: <20040401171557.GA17948@nevyn.them.org> Mail-Followup-To: gdb-patches@sources.redhat.com, jimb@redhat.com, ezannoni@redhat.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.1i X-SW-Source: 2004-04/txt/msg00024.txt.bz2 Right now we keep a lot of crud in the per-psymtab data that is really per-objfile. I'm going to be adding additional per-objfile data, and I need it to be per-objfile rather than duplicated, so I took a moment to clean this up. This gathers about twenty static variables in dwarf2read.c that were saved/restored from the per-psymtab data, and replaces them with pointers into a single per-objfile structure. It doesn't eliminate use of a global variable to access the per-objfile structure, but that's an easy cleanup after this patch has been applied. Tested on i686-pc-linux-gnu. OK? -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer 2004-04-01 Daniel Jacobowitz * dwarf2read.c (dwarf2_per_objfile_data): New. (struct dwarf2_per_objfile_data): New. (dwarf2_per_objfile): New. (dwarf_info_size, dwarf_abbrev_size, dwarf_line_size) (dwarf_pubnames_size, dwarf_aranges_size, dwarf_loc_size) (dwarf_macinfo_size, dwarf_str_size, dwarf_ranges_size) (dwarf_frame_size, dwarf_eh_frame_size, dwarf_info_buffer) (dwarf_abbrev_buffer, dwarf_line_buffer, dwarf_str_buffer) (dwarf_macinfo_buffer, dwarf_ranges_buffer, dwarf_loc_buffer): Replace with macros. (struct dwarf2_pinfo): Remove per-objfile members. Update comments. (DWARF_ABBREV_SIZE, DWARF_LINE_SIZE) (DWARF_LOC_SIZE, DWARF_MACINFO_SIZE, DWARF_STR_SIZE) (DWARF_RANGES_SIZE, DWARF_INFO_BUFFER) (DWARF_ABBREV_BUFFER, DWARF_LINE_BUFFER, DWARF_STR_BUFFER) (DWARF_MACINFO_BUFFER, DWARF_RANGES_BUFFER, DWARF_LOC_BUFFER): Remove macros. (dwarf2_has_info): Take an objfile argument. Allocate per-objfile data. (dwarf2_build_psymtabs_hard): Remove use of removed macros. (psymtab_to_symtab_1): Restore per-objfile data pointer. Remove use of removed macros. (_initialize_dwarf2_read): New function. * symfile.h (dwarf2_has_info): Update prototype. * coffread.c (coff_symfile_read): Update call to dwarf2_has_info. * elfread.c (elf_symfile_read): Likewise. Index: dwarf2read.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2read.c,v retrieving revision 1.141 diff -u -p -r1.141 dwarf2read.c --- dwarf2read.c 16 Mar 2004 22:43:15 -0000 1.141 +++ dwarf2read.c 1 Apr 2004 17:09:38 -0000 @@ -140,19 +140,54 @@ typedef struct statement_prologue } _STATEMENT_PROLOGUE; -/* offsets and sizes of debugging sections */ +static const struct objfile_data *dwarf2_per_objfile_data; -static unsigned int dwarf_info_size; -static unsigned int dwarf_abbrev_size; -static unsigned int dwarf_line_size; -static unsigned int dwarf_pubnames_size; -static unsigned int dwarf_aranges_size; -static unsigned int dwarf_loc_size; -static unsigned int dwarf_macinfo_size; -static unsigned int dwarf_str_size; -static unsigned int dwarf_ranges_size; -unsigned int dwarf_frame_size; -unsigned int dwarf_eh_frame_size; +struct dwarf2_per_objfile_data +{ + /* Sizes of debugging sections. */ + unsigned int dwarf_info_size; + unsigned int dwarf_abbrev_size; + unsigned int dwarf_line_size; + unsigned int dwarf_pubnames_size; + unsigned int dwarf_aranges_size; + unsigned int dwarf_loc_size; + unsigned int dwarf_macinfo_size; + unsigned int dwarf_str_size; + unsigned int dwarf_ranges_size; + unsigned int dwarf_frame_size; + unsigned int dwarf_eh_frame_size; + + /* Loaded data from the sections. */ + char *dwarf_info_buffer; + char *dwarf_abbrev_buffer; + char *dwarf_line_buffer; + char *dwarf_str_buffer; + char *dwarf_macinfo_buffer; + char *dwarf_ranges_buffer; + char *dwarf_loc_buffer; +}; + +#define dwarf_info_size dwarf2_per_objfile->dwarf_info_size +#define dwarf_abbrev_size dwarf2_per_objfile->dwarf_abbrev_size +#define dwarf_line_size dwarf2_per_objfile->dwarf_line_size +#define dwarf_pubnames_size dwarf2_per_objfile->dwarf_pubnames_size +#define dwarf_aranges_size dwarf2_per_objfile->dwarf_aranges_size +#define dwarf_loc_size dwarf2_per_objfile->dwarf_loc_size +#define dwarf_macinfo_size dwarf2_per_objfile->dwarf_macinfo_size +#define dwarf_str_size dwarf2_per_objfile->dwarf_str_size +#define dwarf_ranges_size dwarf2_per_objfile->dwarf_ranges_size +#define dwarf_frame_size dwarf2_per_objfile->dwarf_frame_size +#define dwarf_eh_frame_size dwarf2_per_objfile->dwarf_eh_frame_size + +#define dwarf_info_buffer dwarf2_per_objfile->dwarf_info_buffer +#define dwarf_abbrev_buffer dwarf2_per_objfile->dwarf_abbrev_buffer +#define dwarf_line_buffer dwarf2_per_objfile->dwarf_line_buffer +#define dwarf_loc_buffer dwarf2_per_objfile->dwarf_loc_buffer +#define dwarf_macinfo_buffer dwarf2_per_objfile->dwarf_macinfo_buffer +#define dwarf_str_buffer dwarf2_per_objfile->dwarf_str_buffer +#define dwarf_ranges_buffer dwarf2_per_objfile->dwarf_ranges_buffer + +static struct dwarf2_per_objfile_data *dwarf2_per_objfile; static asection *dwarf_info_section; static asection *dwarf_abbrev_section; @@ -436,15 +471,6 @@ static struct obstack dwarf2_tmp_obstack #define DW_FIELD_ALLOC_CHUNK 4 #endif -/* Actually data from the sections. */ -static char *dwarf_info_buffer; -static char *dwarf_abbrev_buffer; -static char *dwarf_line_buffer; -static char *dwarf_str_buffer; -static char *dwarf_macinfo_buffer; -static char *dwarf_ranges_buffer; -static char *dwarf_loc_buffer; - /* A zeroed version of a partial die for initialization purposes. */ static struct partial_die_info zeroed_partial_die; @@ -458,87 +484,17 @@ static int isreg; /* Object lives in re the register number. */ /* We put a pointer to this structure in the read_symtab_private field - of the psymtab. - - Most of the information in this structure is related to an entire - object file and could be passed via the sym_private field of the - objfile. It is possible to have both dwarf2 and some other form - of debug symbols in one object file. */ + of the psymtab. */ struct dwarf2_pinfo { - /* Pointer to start of dwarf info buffer for the objfile. */ - - char *dwarf_info_buffer; - /* Offset in dwarf_info_buffer for this compilation unit. */ unsigned long dwarf_info_offset; - - /* Pointer to start of dwarf abbreviation buffer for the objfile. */ - - char *dwarf_abbrev_buffer; - - /* Size of dwarf abbreviation section for the objfile. */ - - unsigned int dwarf_abbrev_size; - - /* Pointer to start of dwarf line buffer for the objfile. */ - - char *dwarf_line_buffer; - - /* Size of dwarf_line_buffer, in bytes. */ - - unsigned int dwarf_line_size; - - /* Pointer to start of dwarf string buffer for the objfile. */ - - char *dwarf_str_buffer; - - /* Size of dwarf string section for the objfile. */ - - unsigned int dwarf_str_size; - - /* Pointer to start of dwarf macro buffer for the objfile. */ - - char *dwarf_macinfo_buffer; - - /* Size of dwarf macinfo section for the objfile. */ - - unsigned int dwarf_macinfo_size; - - /* Pointer to start of dwarf ranges buffer for the objfile. */ - - char *dwarf_ranges_buffer; - - /* Size of dwarf ranges buffer for the objfile. */ - - unsigned int dwarf_ranges_size; - - /* Pointer to start of dwarf locations buffer for the objfile. */ - - char *dwarf_loc_buffer; - - /* Size of dwarf locations buffer for the objfile. */ - - unsigned int dwarf_loc_size; }; #define PST_PRIVATE(p) ((struct dwarf2_pinfo *)(p)->read_symtab_private) -#define DWARF_INFO_BUFFER(p) (PST_PRIVATE(p)->dwarf_info_buffer) #define DWARF_INFO_OFFSET(p) (PST_PRIVATE(p)->dwarf_info_offset) -#define DWARF_ABBREV_BUFFER(p) (PST_PRIVATE(p)->dwarf_abbrev_buffer) -#define DWARF_ABBREV_SIZE(p) (PST_PRIVATE(p)->dwarf_abbrev_size) -#define DWARF_LINE_BUFFER(p) (PST_PRIVATE(p)->dwarf_line_buffer) -#define DWARF_LINE_SIZE(p) (PST_PRIVATE(p)->dwarf_line_size) -#define DWARF_STR_BUFFER(p) (PST_PRIVATE(p)->dwarf_str_buffer) -#define DWARF_STR_SIZE(p) (PST_PRIVATE(p)->dwarf_str_size) -#define DWARF_MACINFO_BUFFER(p) (PST_PRIVATE(p)->dwarf_macinfo_buffer) -#define DWARF_MACINFO_SIZE(p) (PST_PRIVATE(p)->dwarf_macinfo_size) -#define DWARF_RANGES_BUFFER(p) (PST_PRIVATE(p)->dwarf_ranges_buffer) -#define DWARF_RANGES_SIZE(p) (PST_PRIVATE(p)->dwarf_ranges_size) -#define DWARF_LOC_BUFFER(p) (PST_PRIVATE(p)->dwarf_loc_buffer) -#define DWARF_LOC_SIZE(p) (PST_PRIVATE(p)->dwarf_loc_size) /* FIXME: We might want to set this from BFD via bfd_arch_bits_per_byte, but this would require a corresponding change in unpack_field_as_long @@ -948,8 +904,16 @@ static char *skip_one_die (char *info_pt information and return true if we have enough to do something. */ int -dwarf2_has_info (bfd *abfd) +dwarf2_has_info (struct objfile *objfile) { + struct dwarf2_per_objfile_data *data; + + /* Initialize per-objfile state. */ + data = obstack_alloc (&objfile->objfile_obstack, sizeof (*data)); + memset (data, 0, sizeof (*data)); + set_objfile_data (objfile, dwarf2_per_objfile_data, data); + dwarf2_per_objfile = data; + dwarf_info_section = 0; dwarf_abbrev_section = 0; dwarf_line_section = 0; @@ -960,7 +924,7 @@ dwarf2_has_info (bfd *abfd) dwarf_ranges_section = 0; dwarf_loc_section = 0; - bfd_map_over_sections (abfd, dwarf2_locate_sections, NULL); + bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, NULL); return (dwarf_info_section != NULL && dwarf_abbrev_section != NULL); } @@ -1037,7 +1001,6 @@ dwarf2_locate_sections (bfd *ignore_abfd void dwarf2_build_psymtabs (struct objfile *objfile, int mainline) { - /* We definitely need the .debug_info and .debug_abbrev sections */ dwarf_info_buffer = dwarf2_read_section (objfile, dwarf_info_section); @@ -1278,20 +1241,7 @@ dwarf2_build_psymtabs_hard (struct objfi pst->read_symtab_private = (char *) obstack_alloc (&objfile->objfile_obstack, sizeof (struct dwarf2_pinfo)); - DWARF_INFO_BUFFER (pst) = dwarf_info_buffer; DWARF_INFO_OFFSET (pst) = beg_of_comp_unit - dwarf_info_buffer; - DWARF_ABBREV_BUFFER (pst) = dwarf_abbrev_buffer; - DWARF_ABBREV_SIZE (pst) = dwarf_abbrev_size; - DWARF_LINE_BUFFER (pst) = dwarf_line_buffer; - DWARF_LINE_SIZE (pst) = dwarf_line_size; - DWARF_STR_BUFFER (pst) = dwarf_str_buffer; - DWARF_STR_SIZE (pst) = dwarf_str_size; - DWARF_MACINFO_BUFFER (pst) = dwarf_macinfo_buffer; - DWARF_MACINFO_SIZE (pst) = dwarf_macinfo_size; - DWARF_RANGES_BUFFER (pst) = dwarf_ranges_buffer; - DWARF_RANGES_SIZE (pst) = dwarf_ranges_size; - DWARF_LOC_BUFFER (pst) = dwarf_loc_buffer; - DWARF_LOC_SIZE (pst) = dwarf_loc_size; baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); /* Store the function that reads in the rest of the symbol table */ @@ -1985,21 +1935,11 @@ psymtab_to_symtab_1 (struct partial_symt struct attribute *attr; CORE_ADDR baseaddr; + dwarf2_per_objfile = objfile_data (pst->objfile, dwarf2_per_objfile_data); + /* Set local variables from the partial symbol table info. */ offset = DWARF_INFO_OFFSET (pst); - dwarf_info_buffer = DWARF_INFO_BUFFER (pst); - dwarf_abbrev_buffer = DWARF_ABBREV_BUFFER (pst); - dwarf_abbrev_size = DWARF_ABBREV_SIZE (pst); - dwarf_line_buffer = DWARF_LINE_BUFFER (pst); - dwarf_line_size = DWARF_LINE_SIZE (pst); - dwarf_str_buffer = DWARF_STR_BUFFER (pst); - dwarf_str_size = DWARF_STR_SIZE (pst); - dwarf_macinfo_buffer = DWARF_MACINFO_BUFFER (pst); - dwarf_macinfo_size = DWARF_MACINFO_SIZE (pst); - dwarf_ranges_buffer = DWARF_RANGES_BUFFER (pst); - dwarf_ranges_size = DWARF_RANGES_SIZE (pst); - dwarf_loc_buffer = DWARF_LOC_BUFFER (pst); - dwarf_loc_size = DWARF_LOC_SIZE (pst); + info_ptr = dwarf_info_buffer + offset; baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); @@ -8244,4 +8184,12 @@ dwarf2_symbol_mark_computed (struct attr SYMBOL_OPS (sym) = &dwarf2_locexpr_funcs; SYMBOL_LOCATION_BATON (sym) = baton; } +} + +void _initialize_dwarf2_read (void); + +void +_initialize_dwarf2_read (void) +{ + dwarf2_per_objfile_data = register_objfile_data (); } Index: symfile.h =================================================================== RCS file: /cvs/src/src/gdb/symfile.h,v retrieving revision 1.27 diff -u -p -r1.27 symfile.h --- symfile.h 14 Feb 2004 15:46:33 -0000 1.27 +++ symfile.h 1 Apr 2004 17:09:39 -0000 @@ -315,7 +315,7 @@ extern void dwarf_build_psymtabs (struct /* From dwarf2read.c */ -extern int dwarf2_has_info (bfd *abfd); +extern int dwarf2_has_info (struct objfile *); extern void dwarf2_build_psymtabs (struct objfile *, int); extern void dwarf2_build_frame_info (struct objfile *); Index: coffread.c =================================================================== RCS file: /cvs/src/src/gdb/coffread.c,v retrieving revision 1.53 diff -u -p -r1.53 coffread.c --- coffread.c 27 Feb 2004 17:46:11 -0000 1.53 +++ coffread.c 1 Apr 2004 17:09:42 -0000 @@ -634,7 +634,7 @@ coff_symfile_read (struct objfile *objfi info->stabsects, info->stabstrsect->filepos, stabstrsize); } - if (dwarf2_has_info (abfd)) + if (dwarf2_has_info (objfile)) { /* DWARF2 sections. */ dwarf2_build_psymtabs (objfile, mainline); Index: elfread.c =================================================================== RCS file: /cvs/src/src/gdb/elfread.c,v retrieving revision 1.42 diff -u -p -r1.42 elfread.c --- elfread.c 7 Feb 2004 23:13:47 -0000 1.42 +++ elfread.c 1 Apr 2004 17:09:43 -0000 @@ -575,7 +575,7 @@ elf_symfile_read (struct objfile *objfil str_sect->filepos, bfd_section_size (abfd, str_sect)); } - if (dwarf2_has_info (abfd)) + if (dwarf2_has_info (objfile)) { /* DWARF 2 sections */ dwarf2_build_psymtabs (objfile, mainline);