From patchwork Mon Jun 25 11:43:24 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Add a lexical block only when the callsite has source location info From: Dehao Chen X-Patchwork-Id: 167040 Message-Id: To: gcc-patches@gcc.gnu.org Cc: Cary Coutant Date: Mon, 25 Jun 2012 19:43:24 +0800 During function inlining, a lexical block is added for each cloned callee, and source info is attached to this block for addr2line to derive the inline stack. However, some callsites do not have source information attached to it. Adding a lexical block would be misleading in this case. E.g. If a function is split, when the split callsite is inlined back, the cloned callee should stay in the same lexical block with its caller. This patch ensures that lexical blocks are only added when the callsite has source location info in it. Bootstrapped and passed gcc regression tests. Is it ok for trunk? Thanks, Dehao gcc/ChangeLog: 2012-06-25 Dehao Chen * tree-profile.c: (expand_call_inline): Make a new lexical block only when the call stmt has source location. Index: gcc/tree-inline.c =================================================================== --- gcc/tree-inline.c (revision 188926) +++ gcc/tree-inline.c (working copy) @@ -3950,10 +3950,17 @@ actual inline expansion of the body, and a label for the return statements within the function to jump to. The type of the 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; - prepend_lexical_block (gimple_block (stmt), id->block); + if (gimple_has_location (stmt)) + { + id->block = make_node (BLOCK); + BLOCK_ABSTRACT_ORIGIN (id->block) = fn; + BLOCK_SOURCE_LOCATION (id->block) = input_location; + prepend_lexical_block (gimple_block (stmt), id->block); + } + else + { + id->block = gimple_block (stmt); + } /* Local declarations will be replaced by their equivalents in this map. */