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

--- Comment #2 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by David Malcolm <dmalc...@gcc.gnu.org>:

https://gcc.gnu.org/g:fd9982bb0051d1a678191b684bb907d1ac177991

commit r10-6153-gfd9982bb0051d1a678191b684bb907d1ac177991
Author: David Malcolm <dmalc...@redhat.com>
Date:   Wed Jan 22 11:45:58 2020 -0500

    analyzer: fix setjmp handling with -g (PR 93378)

    PR analyzer/93378 reports an ICE at -O1 -g when analyzing a rewind via
    longjmp to a setjmp call with.

    The root cause is that the rewind_info_t::get_setjmp_call attempts to
    locate the setjmp GIMPLE_CALL via within the exploded_node containing
    it, but the exploded_node has two stmts: a GIMPLE_DEBUG, then the
    GIMPLE_CALL, and so erroneously picks the GIMPLE_DEBUG, leading to
    a failed as_a <const gcall *>.

    This patch reworks how the analyzer stores information about a setjmp
    so that instead of storing an exploded_node *, it instead introduces
    a "setjmp_record" struct, for use by both setjmp_svalue and
    rewind_info_t.  Hence we store the information directly, rather than
    attempting to reconstruct it, fixing the bug.

    gcc/analyzer/ChangeLog:
        PR analyzer/93378
        * engine.cc (setjmp_svalue::compare_fields): Update for
        replacement of m_enode with m_setjmp_record.
        (setjmp_svalue::add_to_hash): Likewise.
        (setjmp_svalue::get_index): Rename...
        (setjmp_svalue::get_enode_index): ...to this.
        (setjmp_svalue::print_details): Update for replacement of m_enode
        with m_setjmp_record.
        (exploded_node::on_longjmp): Likewise.
        * exploded-graph.h (rewind_info_t::m_enode_origin): Replace...
        (rewind_info_t::m_setjmp_record): ...with this.
        (rewind_info_t::rewind_info_t): Update for replacement of m_enode
        with m_setjmp_record.
        (rewind_info_t::get_setjmp_point): Likewise.
        (rewind_info_t::get_setjmp_call): Likewise.
        * region-model.cc (region_model::dump_summary_of_map): Likewise.
        (region_model::on_setjmp): Likewise.
        * region-model.h (struct setjmp_record): New struct.
        (setjmp_svalue::m_enode): Replace...
        (setjmp_svalue::m_setjmp_record): ...with this.
        (setjmp_svalue::setjmp_svalue): Update for replacement of m_enode
        with m_setjmp_record.
        (setjmp_svalue::clone): Likewise.
        (setjmp_svalue::get_index): Rename...
        (setjmp_svalue::get_enode_index): ...to this.
        (setjmp_svalue::get_exploded_node): Replace...
        (setjmp_svalue::get_setjmp_record): ...with this.

    gcc/testsuite/ChangeLog:
        PR analyzer/93378
        * gcc.dg/analyzer/setjmp-pr93378.c: New test.

Reply via email to