blob: aca4554bde6916eb7f963f173aebae8f99b0e358 [file] [log] [blame]
/* Symbolic offsets and ranges.
Copyright (C) 2023-2024 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_RANGES_H
#define GCC_ANALYZER_RANGES_H
namespace ana {
/* Wrapper around an svalue for a value measured in bytes. */
class symbolic_byte_offset
{
public:
explicit symbolic_byte_offset (int i, region_model_manager &mgr);
symbolic_byte_offset (const svalue *num_bytes_sval);
explicit symbolic_byte_offset (region_offset offset,
region_model_manager &mgr);
const svalue *get_svalue () const { return m_num_bytes_sval; }
tree maybe_get_constant () const;
void dump_to_pp (pretty_printer *pp, bool) const;
void dump (bool) const;
json::value *to_json () const;
bool operator== (const symbolic_byte_offset &other) const
{
return m_num_bytes_sval == other.m_num_bytes_sval;
}
private:
const svalue *m_num_bytes_sval;
};
/* A range of byte offsets, where both the start and size of the
range can be symbolic. */
class symbolic_byte_range
{
public:
symbolic_byte_range (symbolic_byte_offset start,
symbolic_byte_offset size)
: m_start (start),
m_size (size)
{
}
symbolic_byte_range (region_offset start,
const svalue *num_bytes,
region_model_manager &mgr);
void dump_to_pp (pretty_printer *pp,
bool simple,
region_model_manager &mgr) const;
void dump (bool, region_model_manager &mgr) const;
json::value *to_json () const;
bool empty_p () const;
symbolic_byte_offset get_start_byte_offset () const
{
return m_start;
}
symbolic_byte_offset get_last_byte_offset (region_model_manager &mgr) const;
symbolic_byte_offset get_size_in_bytes () const
{
return m_size;
}
symbolic_byte_offset get_next_byte_offset (region_model_manager &mgr) const;
tristate intersection (const symbolic_byte_range &other,
const region_model &model) const;
private:
symbolic_byte_offset m_start;
symbolic_byte_offset m_size;
};
} // namespace ana
#endif /* GCC_ANALYZER_RANGES_H */