Commit fdfa76bd by James E Wilson Committed by Jim Wilson

Emit DW_AT_ranges for inlined subroutines that contain disjoint blocks.

PR debug/20268
* dwarf2out.c (add_high_low_attributes): New function, extracted from
gen_lexical_block_die.
(gen_lexical_block_die, gen_inlined_subroutine_die): Call it.

From-SVN: r97289
parent cd9c7bd2
2005-03-30 James E. Wilson <wilson@specifixinc.com>
PR debug/20268
* dwarf2out.c (add_high_low_attributes): New function, extracted from
gen_lexical_block_die.
(gen_lexical_block_die, gen_inlined_subroutine_die): Call it.
2005-03-31 Jan Hubicka <jh@suse.cz> 2005-03-31 Jan Hubicka <jh@suse.cz>
2004-11-02 Jan Hubicka <jh@suse.cz> 2004-11-02 Jan Hubicka <jh@suse.cz>
......
...@@ -11578,41 +11578,49 @@ gen_label_die (tree decl, dw_die_ref context_die) ...@@ -11578,41 +11578,49 @@ gen_label_die (tree decl, dw_die_ref context_die)
} }
} }
/* Generate a DIE for a lexical block. */ /* 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. */
static void static inline void
gen_lexical_block_die (tree stmt, dw_die_ref context_die, int depth) add_high_low_attributes (tree stmt, dw_die_ref die)
{ {
dw_die_ref stmt_die = new_die (DW_TAG_lexical_block, context_die, stmt);
char label[MAX_ARTIFICIAL_LABEL_BYTES]; char label[MAX_ARTIFICIAL_LABEL_BYTES];
if (! BLOCK_ABSTRACT (stmt)) if (BLOCK_FRAGMENT_CHAIN (stmt))
{ {
if (BLOCK_FRAGMENT_CHAIN (stmt)) tree chain;
{
tree chain;
add_AT_range_list (stmt_die, DW_AT_ranges, add_ranges (stmt)); add_AT_range_list (die, DW_AT_ranges, add_ranges (stmt));
chain = BLOCK_FRAGMENT_CHAIN (stmt); chain = BLOCK_FRAGMENT_CHAIN (stmt);
do do
{
add_ranges (chain);
chain = BLOCK_FRAGMENT_CHAIN (chain);
}
while (chain);
add_ranges (NULL);
}
else
{ {
ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL, add_ranges (chain);
BLOCK_NUMBER (stmt)); chain = BLOCK_FRAGMENT_CHAIN (chain);
add_AT_lbl_id (stmt_die, DW_AT_low_pc, label);
ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_END_LABEL,
BLOCK_NUMBER (stmt));
add_AT_lbl_id (stmt_die, DW_AT_high_pc, label);
} }
while (chain);
add_ranges (NULL);
}
else
{
ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL,
BLOCK_NUMBER (stmt));
add_AT_lbl_id (die, DW_AT_low_pc, label);
ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_END_LABEL,
BLOCK_NUMBER (stmt));
add_AT_lbl_id (die, DW_AT_high_pc, label);
} }
}
/* Generate a DIE for a lexical block. */
static void
gen_lexical_block_die (tree stmt, dw_die_ref context_die, int depth)
{
dw_die_ref stmt_die = new_die (DW_TAG_lexical_block, context_die, stmt);
if (! BLOCK_ABSTRACT (stmt))
add_high_low_attributes (stmt, stmt_die);
decls_for_scope (stmt, stmt_die, depth); decls_for_scope (stmt, stmt_die, depth);
} }
...@@ -11634,15 +11642,10 @@ gen_inlined_subroutine_die (tree stmt, dw_die_ref context_die, int depth) ...@@ -11634,15 +11642,10 @@ gen_inlined_subroutine_die (tree stmt, dw_die_ref context_die, int depth)
{ {
dw_die_ref subr_die dw_die_ref subr_die
= new_die (DW_TAG_inlined_subroutine, context_die, stmt); = new_die (DW_TAG_inlined_subroutine, context_die, stmt);
char label[MAX_ARTIFICIAL_LABEL_BYTES];
add_abstract_origin_attribute (subr_die, decl); add_abstract_origin_attribute (subr_die, decl);
ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL, add_high_low_attributes (stmt, subr_die);
BLOCK_NUMBER (stmt));
add_AT_lbl_id (subr_die, DW_AT_low_pc, label);
ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_END_LABEL,
BLOCK_NUMBER (stmt));
add_AT_lbl_id (subr_die, DW_AT_high_pc, label);
decls_for_scope (stmt, subr_die, depth); decls_for_scope (stmt, subr_die, depth);
current_function_has_inlines = 1; current_function_has_inlines = 1;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment