http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57451
--- Comment #5 from Teresa Johnson <tejohnson at google dot com> --- On Fri, Jun 14, 2013 at 4:19 PM, ccoutant at gcc dot gnu.org <gcc-bugzi...@gcc.gnu.org> wrote: > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57451 > > --- Comment #4 from Cary Coutant <ccoutant at gcc dot gnu.org> --- > The problem is a lexical block in main() that appears to be getting split by > -freorder-blocks-and-partition, but when debug info is emitted during > rest_of_handle_final(), this particular lexical block still appears to be a > single block -- BLOCK_FRAGMENT_CHAIN is NULL, so the DWARF output code decides > that it can emit a DW_AT_low_pc/high_pc pair instead of a DW_AT_ranges. The > DW_AT_high_pc is now being output relative to DW_AT_low_pc, so we see an > assembly expression .LBE14 - .LBB14, which are labels attached to the block > start and block end, and should be in the same section. > > Here's the block: > > (gdb) p stmt > $1 = (tree) 0x7ffff5f4c4b0 > (gdb) pt > warning: Expression is not an assignment (and might have no effect) > <block 0x7ffff5f4c4b0 asm_written used > vars <var_decl 0x7ffff608bc78 e > type <reference_type 0x7ffff609b930 type <record_type 0x7ffff608e9d8 > MyException> > sizes-gimplified unsigned DI > size <integer_cst 0x7ffff5f24dc0 constant 64> > unit size <integer_cst 0x7ffff5f24de0 constant 8> > align 64 symtab 0 alias set -1 canonical type 0x7ffff609b930> > readonly tree_1 tree_3 unsigned decl_5 DI file pr49115.C line 21 col > 25 > size <integer_cst 0x7ffff5f24dc0 64> unit size <integer_cst 0x7ffff5f24de0 8> > align 64 context <function_decl 0x7ffff6096f00 main>> > supercontext <block 0x7ffff60c00f0 asm_written used > vars <var_decl 0x7ffff608bb48 data type <record_type 0x7ffff608ec78 > Data> > used tree_1 tree_3 decl_5 SI file pr49115.C line 18 col 8 > size <integer_cst 0x7ffff5f42140 constant 32> > unit size <integer_cst 0x7ffff5f42160 constant 4> > align 128 context <function_decl 0x7ffff6096f00 main> > (reg/v:SI 64 [ data ])> > supercontext <block 0x7ffff5f4c550 asm_written used supercontext > <function_decl 0x7ffff6096f00 main> > subblocks <block 0x7ffff5f4c500 asm_written used vars <var_decl > 0x7ffff608bb48 data> supercontext <block 0x7ffff5f4c550> subblocks <block > 0x7ffff5f4c4b0> chain <block 0x7ffff60c00f0>>>>> > > (gdb) p stmt->block > $2 = {base = {code = BLOCK, side_effects_flag = 0, constant_flag = 0, > addressable_flag = 0, > volatile_flag = 0, readonly_flag = 0, asm_written_flag = 1, nowarning_flag > = 0, visited = 0, > used_flag = 1, nothrow_flag = 0, static_flag = 0, public_flag = 0, > private_flag = 0, > protected_flag = 0, deprecated_flag = 0, default_def_flag = 0, u = {bits = > {lang_flag_0 = 0, > lang_flag_1 = 0, lang_flag_2 = 0, lang_flag_3 = 0, lang_flag_4 = 0, > lang_flag_5 = 0, > lang_flag_6 = 0, saturating_flag = 0, unsigned_flag = 0, packed_flag = > 0, user_align = 0, > nameless_flag = 1, spare0 = 0, spare1 = 0, address_space = 0}, length > = > 2048, > version = 2048}}, chain = 0x0, abstract_flag = 0, block_num = 14, locus > = > 0, > vars = 0x7ffff608bc78, nonlocalized_vars = 0x0, subblocks = 0x0, > supercontext > = 0x7ffff60c00f0, > abstract_origin = 0x0, fragment_origin = 0x0, fragment_chain = 0x0} > > Here's the fragment of assembly code between .LBB14 and .LBE14: > > .LBB14: > # pr49115.C:21 > .loc 1 21 0 > call __cxa_begin_catch > .LVL7: > call __cxa_end_catch > .LVL8: > .p2align 4,,5 > # SUCC: 3 [100.0%] count:1 > jmp .L15 > .cfi_endproc > .section .text.unlikely > .cfi_startproc > .cfi_personality 0x3,__gxx_personality_v0 > .cfi_lsda 0x3,.LLSDAC4 > # BLOCK 6 freq:5000 seq:4 > # PRED: 4 [50.0%] (CROSSING,CAN_FALLTHRU) > .L14: > .cfi_def_cfa_offset 16 > .p2align 4,,8 > .LEHB1: > # SUCC: > call _Unwind_Resume > .LEHE1: > .LVL9: > .LBE14: > .LBE15: > .cfi_endproc > > You can see that the block from .LBB14 to .LBE14 has been split across two > sections. In order for dwarf2out to generate the proper debug info, > BLOCK_FRAGMENT_CHAIN(stmt) needs to be non-NULL. I'm not sure why that's not > happening when the block is split. It looks like this is all done during the final pass when assembly is being emitted. In final_start_function the NOTE_INSN_BLOCK_{BEG/END} notes are inserted based on lexical scopes (in reemit_insn_block_notes). At the end of reemit_insn_block_notes, reorder_blocks is called to identify blocks references by more than one NOTE_INSN_BLOCK_{BEG/END}. Any such blocks are duplicated and the BLOCK_FRAGMENT_CHAIN is setup. I'm not familiar with this code, but perhaps when a switch section note is seen by reemit_insn_block_notes, it should invoke change_scope to emit the necessary NOTE_INSN_BLOCK_* notes? Thanks, Teresa > > -- > You are receiving this mail because: > You are on the CC list for the bug. > You reported the bug. -- Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413