2007-01-21 Jan Kratochvil <jan.kratochvil@redhat.com>

Daniel Jacobowitz  <dan@codesourcery.com>

	* buildsym.c (end_symtab): Use preallocated symtab if available.
	Fill in SYMBOL_SYMTAB.
	* buildsym.h (struct subfile): Add symtab member.
	* dwarf2read.c (struct dwarf2_cu): Add line_header.
	(struct file_entry): Add symtab.
	(free_cu_line_header): New function.
	(read_file_scope): Use it.  Save line_header in the cu.  Process
	lines before DIEs.
	(add_file_name): Initialize new symtab member.
	(dwarf_decode_lines): Create symtabs for included files.
	(new_symbol): Set SYMBOL_SYMTAB.
	* symtab.c (lookup_symbol): Use SYMBOL_SYMTAB.
	(search_symbols): Likewise.
	* symtab.h (struct symbol): Add symtab member.
	(SYMBOL_SYMTAB): Define.

	* gdb.base/included.c, gdb.base/included.exp,
	gdb.base/included.h: New files.
This commit is contained in:
Daniel Jacobowitz 2007-01-21 16:49:40 +00:00
parent 727da90068
commit cb1df416fb
10 changed files with 237 additions and 19 deletions

View File

@ -1,3 +1,22 @@
2007-01-21 Jan Kratochvil <jan.kratochvil@redhat.com>
Daniel Jacobowitz <dan@codesourcery.com>
* buildsym.c (end_symtab): Use preallocated symtab if available.
Fill in SYMBOL_SYMTAB.
* buildsym.h (struct subfile): Add symtab member.
* dwarf2read.c (struct dwarf2_cu): Add line_header.
(struct file_entry): Add symtab.
(free_cu_line_header): New function.
(read_file_scope): Use it. Save line_header in the cu. Process
lines before DIEs.
(add_file_name): Initialize new symtab member.
(dwarf_decode_lines): Create symtabs for included files.
(new_symbol): Set SYMBOL_SYMTAB.
* symtab.c (lookup_symbol): Use SYMBOL_SYMTAB.
(search_symbols): Likewise.
* symtab.h (struct symbol): Add symtab member.
(SYMBOL_SYMTAB): Define.
2007-01-20 Daniel Jacobowitz <dan@codesourcery.com> 2007-01-20 Daniel Jacobowitz <dan@codesourcery.com>
* symfile.c (allocate_symtab): Remove INIT_EXTRA_SYMTAB_INFO. * symfile.c (allocate_symtab): Remove INIT_EXTRA_SYMTAB_INFO.

View File

@ -959,7 +959,10 @@ end_symtab (CORE_ADDR end_addr, struct objfile *objfile, int section)
} }
/* Now, allocate a symbol table. */ /* Now, allocate a symbol table. */
symtab = allocate_symtab (subfile->name, objfile); if (subfile->symtab == NULL)
symtab = allocate_symtab (subfile->name, objfile);
else
symtab = subfile->symtab;
/* Fill in its components. */ /* Fill in its components. */
symtab->blockvector = blockvector; symtab->blockvector = blockvector;
@ -1048,6 +1051,26 @@ end_symtab (CORE_ADDR end_addr, struct objfile *objfile, int section)
symtab->primary = 1; symtab->primary = 1;
} }
/* Default any symbols without a specified symtab to the primary
symtab. */
if (blockvector)
{
int block_i;
for (block_i = 0; block_i < BLOCKVECTOR_NBLOCKS (blockvector); block_i++)
{
struct block *block = BLOCKVECTOR_BLOCK (blockvector, block_i);
struct symbol *sym;
struct dict_iterator iter;
for (sym = dict_iterator_first (BLOCK_DICT (block), &iter);
sym != NULL;
sym = dict_iterator_next (&iter))
if (SYMBOL_SYMTAB (sym) == NULL)
SYMBOL_SYMTAB (sym) = symtab;
}
}
last_source_file = NULL; last_source_file = NULL;
current_subfile = NULL; current_subfile = NULL;
pending_macros = NULL; pending_macros = NULL;

View File

@ -70,6 +70,7 @@ struct subfile
enum language language; enum language language;
char *producer; char *producer;
char *debugformat; char *debugformat;
struct symtab *symtab;
}; };
EXTERN struct subfile *subfiles; EXTERN struct subfile *subfiles;

View File

@ -341,6 +341,9 @@ struct dwarf2_cu
partial symbol tables do not have dependencies. */ partial symbol tables do not have dependencies. */
htab_t dependencies; htab_t dependencies;
/* Header data from the line table, during full symbol processing. */
struct line_header *line_header;
/* Mark used when releasing cached dies. */ /* Mark used when releasing cached dies. */
unsigned int mark : 1; unsigned int mark : 1;
@ -432,6 +435,7 @@ struct line_header
unsigned int mod_time; unsigned int mod_time;
unsigned int length; unsigned int length;
int included_p; /* Non-zero if referenced by the Line Number Program. */ int included_p; /* Non-zero if referenced by the Line Number Program. */
struct symtab *symtab; /* The associated symbol table, if any. */
} *file_names; } *file_names;
/* The start and end of the statement program following this /* The start and end of the statement program following this
@ -2753,6 +2757,15 @@ initialize_cu_func_list (struct dwarf2_cu *cu)
cu->first_fn = cu->last_fn = cu->cached_fn = NULL; cu->first_fn = cu->last_fn = cu->cached_fn = NULL;
} }
static void
free_cu_line_header (void *arg)
{
struct dwarf2_cu *cu = arg;
free_line_header (cu->line_header);
cu->line_header = NULL;
}
static void static void
read_file_scope (struct die_info *die, struct dwarf2_cu *cu) read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
{ {
@ -2823,6 +2836,22 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
initialize_cu_func_list (cu); initialize_cu_func_list (cu);
/* Decode line number information if present. We do this before
processing child DIEs, so that the line header table is available
for DW_AT_decl_file. */
attr = dwarf2_attr (die, DW_AT_stmt_list, cu);
if (attr)
{
unsigned int line_offset = DW_UNSND (attr);
line_header = dwarf_decode_line_header (line_offset, abfd, cu);
if (line_header)
{
cu->line_header = line_header;
make_cleanup (free_cu_line_header, cu);
dwarf_decode_lines (line_header, comp_dir, abfd, cu, NULL);
}
}
/* Process all dies in compilation unit. */ /* Process all dies in compilation unit. */
if (die->child != NULL) if (die->child != NULL)
{ {
@ -2834,20 +2863,6 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
} }
} }
/* Decode line number information if present. */
attr = dwarf2_attr (die, DW_AT_stmt_list, cu);
if (attr)
{
unsigned int line_offset = DW_UNSND (attr);
line_header = dwarf_decode_line_header (line_offset, abfd, cu);
if (line_header)
{
make_cleanup ((make_cleanup_ftype *) free_line_header,
(void *) line_header);
dwarf_decode_lines (line_header, comp_dir, abfd, cu, NULL);
}
}
/* Decode macro information, if present. Dwarf 2 macro information /* Decode macro information, if present. Dwarf 2 macro information
refers to information in the line number info statement program refers to information in the line number info statement program
header, so we can only read it if we've read the header header, so we can only read it if we've read the header
@ -6457,6 +6472,7 @@ add_file_name (struct line_header *lh,
fe->mod_time = mod_time; fe->mod_time = mod_time;
fe->length = length; fe->length = length;
fe->included_p = 0; fe->included_p = 0;
fe->symtab = NULL;
} }
@ -6644,7 +6660,7 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
CORE_ADDR baseaddr; CORE_ADDR baseaddr;
struct objfile *objfile = cu->objfile; struct objfile *objfile = cu->objfile;
const int decode_for_pst_p = (pst != NULL); const int decode_for_pst_p = (pst != NULL);
struct subfile *last_subfile = NULL; struct subfile *last_subfile = NULL, *first_subfile = current_subfile;
baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
@ -6869,6 +6885,35 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
dwarf2_create_include_psymtab (include_name, pst, objfile); dwarf2_create_include_psymtab (include_name, pst, objfile);
} }
} }
else
{
/* Make sure a symtab is created for every file, even files
which contain only variables (i.e. no code with associated
line numbers). */
int i;
struct file_entry *fe;
for (i = 0; i < lh->num_file_names; i++)
{
char *dir = NULL;
fe = &lh->file_names[i];
if (fe->dir_index)
dir = lh->include_dirs[fe->dir_index - 1];
dwarf2_start_subfile (fe->name, dir, comp_dir);
/* Skip the main file; we don't need it, and it must be
allocated last, so that it will show up before the
non-primary symtabs in the objfile's symtab list. */
if (current_subfile == first_subfile)
continue;
if (current_subfile->symtab == NULL)
current_subfile->symtab = allocate_symtab (current_subfile->name,
cu->objfile);
fe->symtab = current_subfile->symtab;
}
}
} }
/* Start a subfile for DWARF. FILENAME is the name of the file and /* Start a subfile for DWARF. FILENAME is the name of the file and
@ -7024,6 +7069,23 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
{ {
SYMBOL_LINE (sym) = DW_UNSND (attr); SYMBOL_LINE (sym) = DW_UNSND (attr);
} }
attr = dwarf2_attr (die, DW_AT_decl_file, cu);
if (attr)
{
int file_index = DW_UNSND (attr);
if (cu->line_header == NULL
|| file_index > cu->line_header->num_file_names)
complaint (&symfile_complaints,
_("file index out of range"));
else
{
struct file_entry *fe;
fe = &cu->line_header->file_names[file_index - 1];
SYMBOL_SYMTAB (sym) = fe->symtab;
}
}
switch (die->tag) switch (die->tag)
{ {
case DW_TAG_label: case DW_TAG_label:

View File

@ -1133,6 +1133,10 @@ lookup_symbol (const char *name, const struct block *block,
if (needtofreename) if (needtofreename)
xfree (demangled_name); xfree (demangled_name);
/* Override the returned symtab with the symbol's specific one. */
if (returnval != NULL && symtab != NULL)
*symtab = SYMBOL_SYMTAB (returnval);
return returnval; return returnval;
} }
@ -3008,7 +3012,11 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
QUIT; QUIT;
/* If it would match (logic taken from loop below) /* If it would match (logic taken from loop below)
load the file and go on to the next one */ load the file and go on to the next one. We check the
filename here, but that's a bit bogus: we don't know
what file it really comes from until we have full
symtabs. The symbol might be in a header file included by
this psymtab. This only affects Insight. */
if (file_matches (ps->filename, files, nfiles) if (file_matches (ps->filename, files, nfiles)
&& ((regexp == NULL && ((regexp == NULL
|| re_exec (SYMBOL_NATURAL_NAME (*psym)) != 0) || re_exec (SYMBOL_NATURAL_NAME (*psym)) != 0)
@ -3087,8 +3095,10 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
b = BLOCKVECTOR_BLOCK (bv, i); b = BLOCKVECTOR_BLOCK (bv, i);
ALL_BLOCK_SYMBOLS (b, iter, sym) ALL_BLOCK_SYMBOLS (b, iter, sym)
{ {
struct symtab *real_symtab = SYMBOL_SYMTAB (sym);
QUIT; QUIT;
if (file_matches (s->filename, files, nfiles)
if (file_matches (real_symtab->filename, files, nfiles)
&& ((regexp == NULL && ((regexp == NULL
|| re_exec (SYMBOL_NATURAL_NAME (sym)) != 0) || re_exec (SYMBOL_NATURAL_NAME (sym)) != 0)
&& ((kind == VARIABLES_DOMAIN && SYMBOL_CLASS (sym) != LOC_TYPEDEF && ((kind == VARIABLES_DOMAIN && SYMBOL_CLASS (sym) != LOC_TYPEDEF
@ -3101,7 +3111,7 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
/* match */ /* match */
psr = (struct symbol_search *) xmalloc (sizeof (struct symbol_search)); psr = (struct symbol_search *) xmalloc (sizeof (struct symbol_search));
psr->block = i; psr->block = i;
psr->symtab = s; psr->symtab = real_symtab;
psr->symbol = sym; psr->symbol = sym;
psr->msymbol = NULL; psr->msymbol = NULL;
psr->next = NULL; psr->next = NULL;

View File

@ -609,6 +609,10 @@ struct symbol
struct type *type; struct type *type;
/* The symbol table containing this symbol. This is the file
associated with LINE. */
struct symtab *symtab;
/* Domain code. */ /* Domain code. */
ENUM_BITFIELD(domain_enum_tag) domain : 6; ENUM_BITFIELD(domain_enum_tag) domain : 6;
@ -664,6 +668,7 @@ struct symbol
#define SYMBOL_CLASS(symbol) (symbol)->aclass #define SYMBOL_CLASS(symbol) (symbol)->aclass
#define SYMBOL_TYPE(symbol) (symbol)->type #define SYMBOL_TYPE(symbol) (symbol)->type
#define SYMBOL_LINE(symbol) (symbol)->line #define SYMBOL_LINE(symbol) (symbol)->line
#define SYMBOL_SYMTAB(symbol) (symbol)->symtab
#define SYMBOL_BASEREG(symbol) (symbol)->aux_value.basereg #define SYMBOL_BASEREG(symbol) (symbol)->aux_value.basereg
#define SYMBOL_OBJFILE(symbol) (symbol)->aux_value.objfile #define SYMBOL_OBJFILE(symbol) (symbol)->aux_value.objfile
#define SYMBOL_OPS(symbol) (symbol)->ops #define SYMBOL_OPS(symbol) (symbol)->ops

View File

@ -1,3 +1,9 @@
2007-01-21 Jan Kratochvil <jan.kratochvil@redhat.com>
Daniel Jacobowitz <dan@codesourcery.com>
* gdb.base/included.c, gdb.base/included.exp,
gdb.base/included.h: New files.
2007-01-20 Daniel Jacobowitz <dan@codesourcery.com> 2007-01-20 Daniel Jacobowitz <dan@codesourcery.com>
* gdb.base/bigcore.c (RLIMIT_CAP): Define. * gdb.base/bigcore.c (RLIMIT_CAP): Define.

View File

@ -0,0 +1,26 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA. */
#include "included.h"
int
main()
{
return 0;
}

View File

@ -0,0 +1,46 @@
# Copyright 2007 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
set testfile "included"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
untested included.exp
return -1
}
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
gdb_test "set listsize 1" ""
gdb_test "list main" ".*"
get_debug_format
set non_dwarf [expr ! [test_debug_format "DWARF 2"]]
# We should be able to find the source file containing the definition,
# even though it was an included header.
if { $non_dwarf } { setup_xfail *-*-* }
gdb_test "list integer" "int integer;"
gdb_test "ptype integer" "type = int"
# We should report that integer comes from the header file.
if { $non_dwarf } { setup_xfail *-*-* }
gdb_test "info variables integer" "\r\nFile \[^\r\n\]*/${subdir}/${testfile}.h:\r\nint integer;"

View File

@ -0,0 +1,20 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA. */
int integer;