blob: 4615be7a83963a649ec5e9edb925b39461f0398d [file]
/* Classes for tracking pertinent events that happen along
an execution path.
Copyright (C) 2026 Free Software Foundation, Inc.
Contributed by David Malcolm <dmalcolm@redhat.com>.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GCC is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
#ifndef GCC_ANALYZER_STATE_TRANSITION_H
#define GCC_ANALYZER_STATE_TRANSITION_H
#include "diagnostics/event-id.h"
#include "analyzer/callsite-expr.h"
namespace ana {
class state_transition
{
public:
enum class kind
{
origin,
at_call,
at_return,
copy,
use
};
state_transition ()
: m_prev_state_transition (nullptr)
{
}
virtual ~state_transition () {}
virtual std::unique_ptr<state_transition>
clone () const = 0;
virtual void
dump_to_pp (pretty_printer *pp) const = 0;
virtual enum kind get_kind () const = 0;
virtual const state_transition_at_call *
dyn_cast_state_transition_at_call () const { return nullptr; }
virtual const state_transition_at_return *
dyn_cast_state_transition_at_return () const { return nullptr; }
void dump () const;
static std::unique_ptr<state_transition>
make (const region *src_reg,
tree src_reg_expr,
const region *dst_reg,
tree dst_reg_expr);
diagnostics::paths::event_id_t
get_src_event_id () const;
state_transition *m_prev_state_transition;
diagnostics::paths::event_id_t m_event_id;
};
class state_transition_origin : public state_transition
{
public:
state_transition_origin (tree dst_reg_expr)
: m_dst_reg_expr (dst_reg_expr)
{
}
std::unique_ptr<state_transition>
clone () const final override;
void
dump_to_pp (pretty_printer *pp) const final override;
enum kind
get_kind () const final override { return kind::origin; }
tree m_dst_reg_expr;
};
class state_transition_at_call : public state_transition
{
public:
state_transition_at_call (callsite_expr expr)
: m_expr (expr)
{
}
std::unique_ptr<state_transition>
clone () const final override;
void
dump_to_pp (pretty_printer *pp) const final override;
enum kind
get_kind () const final override { return kind::at_call; }
const state_transition_at_call *
dyn_cast_state_transition_at_call () const final override { return this; }
callsite_expr
get_callsite_expr () const { return m_expr; }
private:
callsite_expr m_expr;
};
class state_transition_at_return : public state_transition
{
public:
std::unique_ptr<state_transition>
clone () const final override;
void
dump_to_pp (pretty_printer *pp) const final override;
enum kind
get_kind () const final override { return kind::at_return; }
const state_transition_at_return *
dyn_cast_state_transition_at_return () const final override { return this; }
};
class state_transition_copy : public state_transition
{
public:
state_transition_copy (tree src_reg_expr,
tree dst_reg_expr)
: m_src_reg_expr (src_reg_expr),
m_dst_reg_expr (dst_reg_expr)
{
gcc_assert (m_src_reg_expr);
gcc_assert (printable_expr_p (m_src_reg_expr));
gcc_assert (m_dst_reg_expr);
gcc_assert (printable_expr_p (m_dst_reg_expr));
}
std::unique_ptr<state_transition>
clone () const final override;
void
dump_to_pp (pretty_printer *pp) const final override;
enum kind
get_kind () const final override { return kind::copy; }
tree m_src_reg_expr;
tree m_dst_reg_expr;
};
class state_transition_use : public state_transition
{
public:
state_transition_use (tree src_reg_expr)
: m_src_reg_expr (src_reg_expr)
{
}
std::unique_ptr<state_transition>
clone () const final override;
void
dump_to_pp (pretty_printer *pp) const final override;
enum kind
get_kind () const final override { return kind::use; }
tree m_src_reg_expr;
};
} // namespace ana
#endif /* GCC_ANALYZER_STATE_TRANSITION_H */