[Bug debug/78363] [7 Regression] ICE in in force_type_die, at dwarf2out.c:24864

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Nov 15 15:22:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78363

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |openmp, wrong-debug
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
So we emit late debug for <function_decl 0x7ffff6a06400 operator()> we didn't
emit early debug for.  But we pruned its (type) context already.

So the bug is that we fail to emit early debug for the above decl.

(gdb) p decl
$8 = <function_decl 0x7ffff6a06400 operator()>
(gdb) p decl_function_context(decl)
$7 = (tree_node *) 0x7ffff6a06300
(gdb) p debug_tree ($7)
 <function_decl 0x7ffff6a06300 main
...

I believe the issue is that the contexts are bogus when the OMP blocks are
outlined.  We have

Breakpoint 5, dwarf2out_early_global_decl (decl=
    <function_decl 0x7ffff6a06c00 main._omp_fn.0>)
    at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:25227
25227     set_early_dwarf s;
Missing separate debuginfos, use: zypper install
libgmp10-debuginfo-6.0.0-71.1.x86_64 libisl15-debuginfo-0.16.1-0.x86_64
libmpc3-debuginfo-1.0.2-38.2.x86_64 libmpfr4-debuginfo-3.1.2-3.1.2.x86_64
(gdb) p debug_tree (decl->decl_common.initial)
 <block 0x7ffff6a0fc60 used
...
            align 32 context <function_decl 0x7ffff6a06c00 main._omp_fn.0>
chain <type_decl 0x7ffff6a02e40 __lambda0>> supercontext <block 0x7ffff6a0fc60>
        subblocks <block 0x7ffff6a0fcc0 used vars <var_decl 0x7ffff6a23870
retval.2> supercontext <block 0x7ffff6a0fb40>>>>
$1 = void
(gdb) p debug_tree (0x7ffff6a02e40)
 <type_decl 0x7ffff6a02e40 __lambda0
    type <record_type 0x7ffff6a03738 __lambda0 type_5 QI
...
    decl_2 decl_5 VOID file t.ii line 5 col 23
    align 8 context <function_decl 0x7ffff6a06300 main>>

so whenever dwarf2out looks at contexts of __lambda0 it ends up at main
rather tha at main._omp_fn.0.  This is an artifact of move_sese_region_to_fn
not copying anything but just "rewiring" stuff.  It already replaces
BLOCK_VARS by "duplicates" but fails to handle non-vars.


More information about the Gcc-bugs mailing list