14#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SYMBOLMANAGER_H
15#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_SYMBOLMANAGER_H
25#include "llvm/ADT/DenseMap.h"
26#include "llvm/ADT/DenseSet.h"
27#include "llvm/ADT/FoldingSet.h"
28#include "llvm/ADT/ImmutableSet.h"
29#include "llvm/ADT/iterator_range.h"
30#include "llvm/Support/Allocator.h"
40class BasicValueFactory;
55 LLVM_ATTRIBUTE_RETURNS_NONNULL
60 profile.AddPointer(R);
63 void Profile(llvm::FoldingSetNodeID& profile)
override {
87 const void *SymbolTag;
92 const void *symbolTag)
94 SymbolTag(symbolTag) {
107 const void *
getTag()
const {
return SymbolTag; }
117 const void *SymbolTag) {
120 profile.AddPointer(LCtx);
122 profile.AddInteger(Count);
123 profile.AddPointer(SymbolTag);
126 void Profile(llvm::FoldingSetNodeID& profile)
override {
127 Profile(profile, Elem, LCtx,
T, Count, SymbolTag);
151 LLVM_ATTRIBUTE_RETURNS_NONNULL
153 LLVM_ATTRIBUTE_RETURNS_NONNULL
166 profile.AddPointer(r);
167 profile.AddPointer(parent);
170 void Profile(llvm::FoldingSetNodeID& profile)
override {
171 Profile(profile, parentSymbol, R);
193 LLVM_ATTRIBUTE_RETURNS_NONNULL
204 profile.AddPointer(R);
207 void Profile(llvm::FoldingSetNodeID& profile)
override {
244 LLVM_ATTRIBUTE_RETURNS_NONNULL
247 LLVM_ATTRIBUTE_RETURNS_NONNULL
250 LLVM_ATTRIBUTE_RETURNS_NONNULL
255 LLVM_ATTRIBUTE_RETURNS_NONNULL
256 const void *
getTag()
const {
return Tag; }
266 unsigned Count,
const void *Tag) {
268 profile.AddPointer(R);
269 profile.AddPointer(S);
271 profile.AddPointer(LCtx);
272 profile.AddInteger(Count);
273 profile.AddPointer(Tag);
276 void Profile(llvm::FoldingSetNodeID& profile)
override {
277 Profile(profile, R, S,
T, LCtx, Count, Tag);
308 Complexity = 1 + Operand->computeComplexity();
314 LLVM_ATTRIBUTE_RETURNS_NONNULL
349 assert((Op == UO_Minus || Op == UO_Not) &&
"non-supported unary expression");
360 Complexity = 1 + Operand->computeComplexity();
413 return K >= BEGIN_BINARYSYMEXPRS && K <= END_BINARYSYMEXPRS;
418 return Value->computeComplexity();
433template <
class LHSTYPE,
class RHSTYPE, SymExpr::Kind ClassK>
463 static void Profile(llvm::FoldingSetNodeID &
ID, LHSTYPE lhs,
484 SymExpr::Kind::SymIntExprKind>;
488 SymExpr::Kind::IntSymExprKind>;
492 SymExpr::Kind::SymSymExprKind>;
496 llvm::BumpPtrAllocator &Alloc;
501 template <
class SymT,
typename... ArgsT> SymT *
make(ArgsT &&...Args) {
502 return new (Alloc) SymT(nextID(), std::forward<ArgsT>(Args)...);
506 SymbolID nextID() {
return NextSymbolID++; }
510 using DataSetTy = llvm::FoldingSet<SymExpr>;
511 using SymbolDependTy =
512 llvm::DenseMap<SymbolRef, std::unique_ptr<SymbolRefSmallVectorTy>>;
518 SymbolDependTy SymbolDependencies;
526 llvm::BumpPtrAllocator &bpalloc)
527 : SymbolDependencies(16), Alloc(bpalloc), BV(bv), Ctx(ctx) {}
534 template <
typename SymExprT,
typename... Args>
540 const void *SymbolTag =
nullptr) {
542 return acquire<SymbolConjured>(Elem, LCtx,
T,
VisitCount, SymbolTag);
567 using SymbolSetTy = llvm::DenseSet<SymbolRef>;
568 using SymbolMapTy = llvm::DenseMap<SymbolRef, SymbolStatus>;
569 using RegionSetTy = llvm::DenseSet<const MemRegion *>;
571 SymbolMapTy TheLiving;
572 SymbolSetTy MetadataInUse;
574 RegionSetTy LiveRegionRoots;
579 RegionSetTy LazilyCopiedRegionRoots;
585 llvm::DenseMap<const MemRegion *, unsigned> includedRegionCache;
597 : LCtx(Ctx),
Loc(
s), SymMgr(symmgr), reapedStore(nullptr, storeMgr) {}
605 bool isLive(
const VarRegion *VR,
bool includeStoreBindings =
false)
const;
623 llvm::iterator_range<RegionSetTy::const_iterator>
regions()
const {
624 return LiveRegionRoots;
644 bool isLazilyCopiedRegion(
const MemRegion *region)
const;
648 bool isReadableRegion(
const MemRegion *region);
676template <
typename T,
typename... Args>
678 llvm::FoldingSetNodeID profile;
679 T::Profile(profile, args...);
681 SymExpr *SD = DataSet.FindNodeOrInsertPos(profile, InsertPos);
683 SD = Alloc.
make<
T>(std::forward<Args>(args)...);
684 DataSet.InsertNode(SD, InsertPos);
699struct llvm::ImutContainerInfo<
clang::ento::SymbolRef>
This file defines AnalysisDeclContext, a class that manages the analysis context data for context sen...
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
llvm::DenseMap< const CFGBlock *, unsigned > VisitCount
C Language Family Type Representation.
__device__ __2f16 float __ockl_bool s
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
This represents one expression.
It wraps the AnalysisDeclContext to represent both the call stack with the help of StackFrameContext ...
A (possibly-)qualified type.
It represents a stack frame of the call stack (based on CallEvent).
Stmt - This represents one statement.
A safe wrapper around APSInt objects allocated and owned by BasicValueFactory.
Template implementation for all binary symbolic expressions.
static constexpr bool classof(Kind K)
unsigned computeComplexity() const override
static bool classof(const SymExpr *SE)
void Profile(llvm::FoldingSetNodeID &ID) override
static constexpr Kind ClassKind
static void Profile(llvm::FoldingSetNodeID &ID, LHSTYPE lhs, BinaryOperator::Opcode op, RHSTYPE rhs, QualType t)
void dumpToStream(raw_ostream &os) const override
Represents a symbolic expression involving a binary operator.
QualType getType() const override
BinaryOperator::Opcode getOpcode() const
static unsigned computeOperandComplexity(const SymExpr *Value)
static void dumpToStreamImpl(raw_ostream &os, const SymExpr *Value)
static bool classof(const SymExpr *SE)
static unsigned computeOperandComplexity(const llvm::APSInt &Value)
BinarySymExpr(SymbolID Sym, Kind k, BinaryOperator::Opcode op, QualType t)
static constexpr bool classof(Kind K)
static const llvm::APSInt * getPointer(APSIntPtr Value)
static const SymExpr * getPointer(const SymExpr *Value)
static bool isLocType(QualType T)
MemRegion - The root abstract class for all memory regions.
SubRegion - A region that subsets another larger region.
SymT * make(ArgsT &&...Args)
SymExprAllocator(llvm::BumpPtrAllocator &Alloc)
static bool isValidTypeForSymbol(QualType T)
virtual QualType getType() const =0
SymbolID getSymbolID() const
Get a unique identifier for this symbol.
Represents a cast expression.
static bool classof(const SymExpr *SE)
static void Profile(llvm::FoldingSetNodeID &ID, const SymExpr *In, QualType From, QualType To)
QualType getType() const override
void Profile(llvm::FoldingSetNodeID &ID) override
void dumpToStream(raw_ostream &os) const override
static constexpr Kind ClassKind
LLVM_ATTRIBUTE_RETURNS_NONNULL const SymExpr * getOperand() const
static constexpr bool classof(Kind K)
unsigned computeComplexity() const override
A symbol representing the result of an expression in the case when we do not know anything about what...
void Profile(llvm::FoldingSetNodeID &profile) override
unsigned getCount() const
const Stmt * getStmt() const
static bool classof(const SymExpr *SE)
StringRef getKindStr() const override
Get a string representation of the kind of the region.
ConstCFGElementRef getCFGElementRef() const
static constexpr Kind ClassKind
static void Profile(llvm::FoldingSetNodeID &profile, ConstCFGElementRef Elem, const LocationContext *LCtx, QualType T, unsigned Count, const void *SymbolTag)
const void * getTag() const
It might return null.
static constexpr bool classof(Kind K)
void dumpToStream(raw_ostream &os) const override
QualType getType() const override
A symbol representing data which can be stored in a memory location (region).
A symbol representing the value of a MemRegion whose parent region has symbolic value.
LLVM_ATTRIBUTE_RETURNS_NONNULL SymbolRef getParentSymbol() const
StringRef getKindStr() const override
Get a string representation of the kind of the region.
void dumpToStream(raw_ostream &os) const override
const MemRegion * getOriginRegion() const override
Find the region from which this symbol originates.
static constexpr bool classof(Kind K)
static void Profile(llvm::FoldingSetNodeID &profile, SymbolRef parent, const TypedValueRegion *r)
void Profile(llvm::FoldingSetNodeID &profile) override
QualType getType() const override
LLVM_ATTRIBUTE_RETURNS_NONNULL const TypedValueRegion * getRegion() const
static constexpr Kind ClassKind
static bool classof(const SymExpr *SE)
SymbolExtent - Represents the extent (size in bytes) of a bounded region.
static bool classof(const SymExpr *SE)
LLVM_ATTRIBUTE_RETURNS_NONNULL const SubRegion * getRegion() const
static constexpr bool classof(Kind K)
void dumpToStream(raw_ostream &os) const override
QualType getType() const override
static void Profile(llvm::FoldingSetNodeID &profile, const SubRegion *R)
StringRef getKindStr() const override
Get a string representation of the kind of the region.
void Profile(llvm::FoldingSetNodeID &profile) override
static constexpr Kind ClassKind
SymbolManager(ASTContext &ctx, BasicValueFactory &bv, llvm::BumpPtrAllocator &bpalloc)
const SymExprT * acquire(Args &&...args)
Create or retrieve a SymExpr of type SymExprT for the given arguments.
void addSymbolDependency(const SymbolRef Primary, const SymbolRef Dependent)
Add artificial symbol dependency.
BasicValueFactory & getBasicVals()
QualType getType(const SymExpr *SE) const
const SymbolConjured * conjureSymbol(ConstCFGElementRef Elem, const LocationContext *LCtx, QualType T, unsigned VisitCount, const void *SymbolTag=nullptr)
const SymbolRefSmallVectorTy * getDependentSymbols(const SymbolRef Primary)
static bool canSymbolicate(QualType T)
ASTContext & getContext()
A class responsible for cleaning up unused symbols.
void markLive(SymbolRef sym)
Unconditionally marks a symbol as live.
void markElementIndicesLive(const MemRegion *region)
SymbolReaper(const StackFrameContext *Ctx, const Stmt *s, SymbolManager &symmgr, StoreManager &storeMgr)
Construct a reaper object, which removes everything which is not live before we execute statement s i...
bool isDead(SymbolRef sym)
Returns whether or not a symbol has been confirmed dead.
void markInUse(SymbolRef sym)
Marks a symbol as important to a checker.
bool isLiveRegion(const MemRegion *region)
void markLazilyCopied(const MemRegion *region)
const LocationContext * getLocationContext() const
It might return null.
void setReapedStore(StoreRef st)
Set to the value of the symbolic store after StoreManager::removeDeadBindings has been called.
bool isLive(SymbolRef sym)
llvm::iterator_range< RegionSetTy::const_iterator > regions() const
A symbol representing the value stored at a MemRegion.
void dumpToStream(raw_ostream &os) const override
const MemRegion * getOriginRegion() const override
Find the region from which this symbol originates.
void Profile(llvm::FoldingSetNodeID &profile) override
LLVM_ATTRIBUTE_RETURNS_NONNULL const TypedValueRegion * getRegion() const
static void Profile(llvm::FoldingSetNodeID &profile, const TypedValueRegion *R)
QualType getType() const override
StringRef getKindStr() const override
Get a string representation of the kind of the region.
static bool classof(const SymExpr *SE)
static constexpr Kind ClassKind
static constexpr bool classof(Kind K)
virtual bool VisitMemRegion(const MemRegion *)
SymbolVisitor(const SymbolVisitor &)=default
SymbolVisitor(SymbolVisitor &&)
SymbolVisitor & operator=(SymbolVisitor &&)=delete
SymbolVisitor & operator=(const SymbolVisitor &)=delete
virtual bool VisitSymbol(SymbolRef sym)=0
A visitor method invoked by ProgramStateManager::scanReachableSymbols.
TypedValueRegion - An abstract class representing regions having a typed value.
virtual QualType getValueType() const =0
Represents a symbolic expression involving a unary operator.
void dumpToStream(raw_ostream &os) const override
void Profile(llvm::FoldingSetNodeID &ID) override
static constexpr bool classof(Kind K)
QualType getType() const override
static constexpr Kind ClassKind
static bool classof(const SymExpr *SE)
UnaryOperator::Opcode getOpcode() const
unsigned computeComplexity() const override
static void Profile(llvm::FoldingSetNodeID &ID, const SymExpr *In, UnaryOperator::Opcode Op, QualType T)
const SymExpr * getOperand() const
const SymExpr * SymbolRef
The JSON file list parser is used to communicate input to InstallAPI.
CFGBlock::ConstCFGElementRef ConstCFGElementRef
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
const FunctionProtoType * T
static key_type_ref KeyOfValue(value_type_ref D)
static data_type_ref DataOfValue(value_type_ref)
static bool isEqual(clang::ento::SymbolRef LHS, clang::ento::SymbolRef RHS)
static bool isLess(clang::ento::SymbolRef LHS, clang::ento::SymbolRef RHS)
static bool isDataEqual(data_type_ref, data_type_ref)