* dwarf2read.c (add_partial_subprogram): New procedure.
(scan_partial_symbols): Use it. (load_partial_dies): Read in children of subprogram and lexical blocks for Ada compilation units.
This commit is contained in:
parent
d0b76dc6df
commit
bc30ff585c
|
@ -1,3 +1,10 @@
|
||||||
|
2008-09-13 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
* dwarf2read.c (add_partial_subprogram): New procedure.
|
||||||
|
(scan_partial_symbols): Use it.
|
||||||
|
(load_partial_dies): Read in children of subprogram and lexical
|
||||||
|
blocks for Ada compilation units.
|
||||||
|
|
||||||
2008-09-13 Tom Tromey <tromey@redhat.com>
|
2008-09-13 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
* symfile.c (build_id_verify): Free 'found'.
|
* symfile.c (build_id_verify): Free 'found'.
|
||||||
|
|
|
@ -757,6 +757,10 @@ static void add_partial_namespace (struct partial_die_info *pdi,
|
||||||
static void add_partial_enumeration (struct partial_die_info *enum_pdi,
|
static void add_partial_enumeration (struct partial_die_info *enum_pdi,
|
||||||
struct dwarf2_cu *cu);
|
struct dwarf2_cu *cu);
|
||||||
|
|
||||||
|
static void add_partial_subprogram (struct partial_die_info *pdi,
|
||||||
|
CORE_ADDR *lowpc, CORE_ADDR *highpc,
|
||||||
|
struct dwarf2_cu *cu);
|
||||||
|
|
||||||
static gdb_byte *locate_pdi_sibling (struct partial_die_info *orig_pdi,
|
static gdb_byte *locate_pdi_sibling (struct partial_die_info *orig_pdi,
|
||||||
gdb_byte *info_ptr,
|
gdb_byte *info_ptr,
|
||||||
bfd *abfd,
|
bfd *abfd,
|
||||||
|
@ -1771,21 +1775,7 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc,
|
||||||
switch (pdi->tag)
|
switch (pdi->tag)
|
||||||
{
|
{
|
||||||
case DW_TAG_subprogram:
|
case DW_TAG_subprogram:
|
||||||
if (pdi->has_pc_info)
|
add_partial_subprogram (pdi, lowpc, highpc, cu);
|
||||||
{
|
|
||||||
if (pdi->lowpc < *lowpc)
|
|
||||||
{
|
|
||||||
*lowpc = pdi->lowpc;
|
|
||||||
}
|
|
||||||
if (pdi->highpc > *highpc)
|
|
||||||
{
|
|
||||||
*highpc = pdi->highpc;
|
|
||||||
}
|
|
||||||
if (!pdi->is_declaration)
|
|
||||||
{
|
|
||||||
add_partial_symbol (pdi, cu);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case DW_TAG_variable:
|
case DW_TAG_variable:
|
||||||
case DW_TAG_typedef:
|
case DW_TAG_typedef:
|
||||||
|
@ -2135,6 +2125,51 @@ add_partial_namespace (struct partial_die_info *pdi,
|
||||||
scan_partial_symbols (pdi->die_child, lowpc, highpc, cu);
|
scan_partial_symbols (pdi->die_child, lowpc, highpc, cu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Read a partial die corresponding to a subprogram and create a partial
|
||||||
|
symbol for that subprogram. When the CU language allows it, this
|
||||||
|
routine also defines a partial symbol for each nested subprogram
|
||||||
|
that this subprogram contains.
|
||||||
|
|
||||||
|
DIE my also be a lexical block, in which case we simply search
|
||||||
|
recursively for suprograms defined inside that lexical block.
|
||||||
|
Again, this is only performed when the CU language allows this
|
||||||
|
type of definitions. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_partial_subprogram (struct partial_die_info *pdi,
|
||||||
|
CORE_ADDR *lowpc, CORE_ADDR *highpc,
|
||||||
|
struct dwarf2_cu *cu)
|
||||||
|
{
|
||||||
|
if (pdi->tag == DW_TAG_subprogram)
|
||||||
|
{
|
||||||
|
if (pdi->has_pc_info)
|
||||||
|
{
|
||||||
|
if (pdi->lowpc < *lowpc)
|
||||||
|
*lowpc = pdi->lowpc;
|
||||||
|
if (pdi->highpc > *highpc)
|
||||||
|
*highpc = pdi->highpc;
|
||||||
|
if (!pdi->is_declaration)
|
||||||
|
add_partial_symbol (pdi, cu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! pdi->has_children)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (cu->language == language_ada)
|
||||||
|
{
|
||||||
|
pdi = pdi->die_child;
|
||||||
|
while (pdi != NULL)
|
||||||
|
{
|
||||||
|
fixup_partial_die (pdi, cu);
|
||||||
|
if (pdi->tag == DW_TAG_subprogram
|
||||||
|
|| pdi->tag == DW_TAG_lexical_block)
|
||||||
|
add_partial_subprogram (pdi, lowpc, highpc, cu);
|
||||||
|
pdi = pdi->die_sibling;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* See if we can figure out if the class lives in a namespace. We do
|
/* See if we can figure out if the class lives in a namespace. We do
|
||||||
this by looking for a member function; its demangled name will
|
this by looking for a member function; its demangled name will
|
||||||
contain namespace info, if there is any. */
|
contain namespace info, if there is any. */
|
||||||
|
@ -5555,6 +5590,7 @@ load_partial_dies (bfd *abfd, gdb_byte *info_ptr, int building_psymtab,
|
||||||
&& !is_type_tag_for_partial (abbrev->tag)
|
&& !is_type_tag_for_partial (abbrev->tag)
|
||||||
&& abbrev->tag != DW_TAG_enumerator
|
&& abbrev->tag != DW_TAG_enumerator
|
||||||
&& abbrev->tag != DW_TAG_subprogram
|
&& abbrev->tag != DW_TAG_subprogram
|
||||||
|
&& abbrev->tag != DW_TAG_lexical_block
|
||||||
&& abbrev->tag != DW_TAG_variable
|
&& abbrev->tag != DW_TAG_variable
|
||||||
&& abbrev->tag != DW_TAG_namespace
|
&& abbrev->tag != DW_TAG_namespace
|
||||||
&& abbrev->tag != DW_TAG_member)
|
&& abbrev->tag != DW_TAG_member)
|
||||||
|
@ -5677,9 +5713,14 @@ load_partial_dies (bfd *abfd, gdb_byte *info_ptr, int building_psymtab,
|
||||||
sizeof (struct partial_die_info));
|
sizeof (struct partial_die_info));
|
||||||
|
|
||||||
/* For some DIEs we want to follow their children (if any). For C
|
/* For some DIEs we want to follow their children (if any). For C
|
||||||
we have no reason to follow the children of structures; for other
|
we have no reason to follow the children of structures; for other
|
||||||
languages we have to, both so that we can get at method physnames
|
languages we have to, both so that we can get at method physnames
|
||||||
to infer fully qualified class names, and for DW_AT_specification. */
|
to infer fully qualified class names, and for DW_AT_specification.
|
||||||
|
|
||||||
|
For Ada, we need to scan the children of subprograms and lexical
|
||||||
|
blocks as well because Ada allows the definition of nested
|
||||||
|
entities that could be interesting for the debugger, such as
|
||||||
|
nested subprograms for instance. */
|
||||||
if (last_die->has_children
|
if (last_die->has_children
|
||||||
&& (load_all
|
&& (load_all
|
||||||
|| last_die->tag == DW_TAG_namespace
|
|| last_die->tag == DW_TAG_namespace
|
||||||
|
@ -5688,7 +5729,10 @@ load_partial_dies (bfd *abfd, gdb_byte *info_ptr, int building_psymtab,
|
||||||
&& (last_die->tag == DW_TAG_class_type
|
&& (last_die->tag == DW_TAG_class_type
|
||||||
|| last_die->tag == DW_TAG_interface_type
|
|| last_die->tag == DW_TAG_interface_type
|
||||||
|| last_die->tag == DW_TAG_structure_type
|
|| last_die->tag == DW_TAG_structure_type
|
||||||
|| last_die->tag == DW_TAG_union_type))))
|
|| last_die->tag == DW_TAG_union_type))
|
||||||
|
|| (cu->language == language_ada
|
||||||
|
&& (last_die->tag == DW_TAG_subprogram
|
||||||
|
|| last_die->tag == DW_TAG_lexical_block))))
|
||||||
{
|
{
|
||||||
nesting_level++;
|
nesting_level++;
|
||||||
parent_die = last_die;
|
parent_die = last_die;
|
||||||
|
|
Loading…
Reference in New Issue