Better debug info for inlined functions.

* dwarf2out.c (add_call_src_coords_attributes): New.
(gen_inlined_subroutine_die): Call it.
(maybe_emit_file, init_file_table): Add comments.
(prune_unused_types_walk_attribs): Pass DW_AT_call_file through
maybe_emit_file.
* tree-inline.c (remap_block): Copy BLOCK_SOURCE_LOCATION.
(expand_call_inline): Set BLOCK_SOURCE_LOCATION.
* tree.h (BLOCK_SOURCE_LOCATION): New.
(struct tree_block): New field locus.

From-SVN: r102379
This commit is contained in:
James E Wilson 2005-07-26 02:56:44 +00:00 committed by Jim Wilson
parent dd4f41c377
commit 3e2844cb07
4 changed files with 45 additions and 2 deletions

View File

@ -1,3 +1,15 @@
2005-07-25 James E Wilson <wilson@specifixinc.com>
* dwarf2out.c (add_call_src_coords_attributes): New.
(gen_inlined_subroutine_die): Call it.
(maybe_emit_file, init_file_table): Add comments.
(prune_unused_types_walk_attribs): Pass DW_AT_call_file through
maybe_emit_file.
* tree-inline.c (remap_block): Copy BLOCK_SOURCE_LOCATION.
(expand_call_inline): Set BLOCK_SOURCE_LOCATION.
* tree.h (BLOCK_SOURCE_LOCATION): New.
(struct tree_block): New field locus.
2005-07-26 Andreas Schwab <schwab@suse.de>
PR rtl-optimization/23043

View File

@ -11757,6 +11757,20 @@ gen_label_die (tree decl, dw_die_ref context_die)
}
}
/* A helper function for gen_inlined_subroutine_die. Add source coordinate
attributes to the DIE for a block STMT, to describe where the inlined
function was called from. This is similar to add_src_coords_attributes. */
static inline void
add_call_src_coords_attributes (tree stmt, dw_die_ref die)
{
expanded_location s = expand_location (BLOCK_SOURCE_LOCATION (stmt));
unsigned file_index = lookup_filename (s.file);
add_AT_unsigned (die, DW_AT_call_file, file_index);
add_AT_unsigned (die, DW_AT_call_line, s.line);
}
/* A helper function for gen_lexical_block_die and gen_inlined_subroutine_die.
Add low_pc and high_pc attributes to the DIE for a block STMT. */
@ -11824,6 +11838,7 @@ gen_inlined_subroutine_die (tree stmt, dw_die_ref context_die, int depth)
add_abstract_origin_attribute (subr_die, decl);
add_high_low_attributes (stmt, subr_die);
add_call_src_coords_attributes (stmt, subr_die);
decls_for_scope (stmt, subr_die, depth);
current_function_has_inlines = 1;
@ -13247,6 +13262,12 @@ lookup_filename (const char *file_name)
return i;
}
/* If the assembler will construct the file table, then translate the compiler
internal file table number into the assembler file table number, and emit
a .file directive if we haven't already emitted one yet. The file table
numbers are different because we prune debug info for unused variables and
types, which may include filenames. */
static int
maybe_emit_file (int fileno)
{
@ -13267,6 +13288,8 @@ maybe_emit_file (int fileno)
return fileno;
}
/* Initialize the compiler internal file table. */
static void
init_file_table (void)
{
@ -13644,7 +13667,7 @@ prune_unused_types_walk_attribs (dw_die_ref die)
Make sure that it will get emitted. */
prune_unused_types_mark (a->dw_attr_val.v.val_die_ref.die, 1);
}
else if (a->dw_attr == DW_AT_decl_file)
else if (a->dw_attr == DW_AT_decl_file || a->dw_attr == DW_AT_call_file)
{
/* A reference to a file. Make sure the file name is emitted. */
a->dw_attr_val.v.val_unsigned =

View File

@ -421,6 +421,7 @@ remap_block (tree *block, inline_data *id)
new_block = make_node (BLOCK);
TREE_USED (new_block) = TREE_USED (old_block);
BLOCK_ABSTRACT_ORIGIN (new_block) = old_block;
BLOCK_SOURCE_LOCATION (new_block) = BLOCK_SOURCE_LOCATION (old_block);
*block = new_block;
/* Remap its variables. */
@ -2025,9 +2026,9 @@ expand_call_inline (basic_block bb, tree stmt, tree *tp, void *data)
statement expression is the return type of the function call. */
id->block = make_node (BLOCK);
BLOCK_ABSTRACT_ORIGIN (id->block) = fn;
BLOCK_SOURCE_LOCATION (id->block) = input_location;
add_lexical_block (TREE_BLOCK (stmt), id->block);
/* Local declarations will be replaced by their equivalents in this
map. */
st = id->decl_map;

View File

@ -1570,6 +1570,12 @@ struct varray_head_tag;
#define BLOCK_FRAGMENT_ORIGIN(NODE) (BLOCK_CHECK (NODE)->block.fragment_origin)
#define BLOCK_FRAGMENT_CHAIN(NODE) (BLOCK_CHECK (NODE)->block.fragment_chain)
/* For an inlined function, this gives the location where it was called
from. This is only set in the top level block, which corresponds to the
inlined function scope. This is used in the debug output routines. */
#define BLOCK_SOURCE_LOCATION(NODE) (BLOCK_CHECK (NODE)->block.locus)
struct tree_block GTY(())
{
struct tree_common common;
@ -1584,6 +1590,7 @@ struct tree_block GTY(())
tree abstract_origin;
tree fragment_origin;
tree fragment_chain;
location_t locus;
};
/* Define fields and accessors for nodes representing data types. */