This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[rfa/dwarf] Use objfile_data mechanism for per-objfile data
- From: Daniel Jacobowitz <drow at false dot org>
- To: gdb-patches at sources dot redhat dot com
- Cc: jimb at redhat dot com, ezannoni at redhat dot com
- Date: Thu, 1 Apr 2004 12:15:57 -0500
- Subject: [rfa/dwarf] Use objfile_data mechanism for per-objfile data
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 <drow@mvista.com>
* 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);