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;
49 :
SymbolData(SymbolRegionValueKind, sym), R(r) {
55 LLVM_ATTRIBUTE_RETURNS_NONNULL
59 profile.AddInteger((
unsigned) SymbolRegionValueKind);
60 profile.AddPointer(R);
63 void Profile(llvm::FoldingSetNodeID& profile)
override {
76 return SE->
getKind() == SymbolRegionValueKind;
87 const void *SymbolTag;
91 QualType t,
unsigned count,
const void *symbolTag)
92 :
SymbolData(SymbolConjuredKind, sym), S(
s),
T(t), Count(count),
93 LCtx(lctx), SymbolTag(symbolTag) {
108 const void *
getTag()
const {
return SymbolTag; }
116 static void Profile(llvm::FoldingSetNodeID &profile,
const Stmt *S,
118 const void *SymbolTag) {
119 profile.AddInteger((
unsigned)SymbolConjuredKind);
120 profile.AddPointer(S);
121 profile.AddPointer(LCtx);
123 profile.AddInteger(Count);
124 profile.AddPointer(SymbolTag);
127 void Profile(llvm::FoldingSetNodeID& profile)
override {
128 Profile(profile, S, LCtx,
T, Count, SymbolTag);
133 return SE->
getKind() == SymbolConjuredKind;
145 :
SymbolData(SymbolDerivedKind, sym), parentSymbol(parent), R(r) {
152 LLVM_ATTRIBUTE_RETURNS_NONNULL
154 LLVM_ATTRIBUTE_RETURNS_NONNULL
166 profile.AddInteger((
unsigned) SymbolDerivedKind);
167 profile.AddPointer(r);
168 profile.AddPointer(parent);
171 void Profile(llvm::FoldingSetNodeID& profile)
override {
172 Profile(profile, parentSymbol, R);
177 return SE->
getKind() == SymbolDerivedKind;
194 LLVM_ATTRIBUTE_RETURNS_NONNULL
204 profile.AddInteger((
unsigned) SymbolExtentKind);
205 profile.AddPointer(R);
208 void Profile(llvm::FoldingSetNodeID& profile)
override {
214 return SE->
getKind() == SymbolExtentKind;
235 :
SymbolData(SymbolMetadataKind, sym), R(r), S(
s),
T(t), LCtx(LCtx),
236 Count(count), Tag(tag) {
245 LLVM_ATTRIBUTE_RETURNS_NONNULL
248 LLVM_ATTRIBUTE_RETURNS_NONNULL
251 LLVM_ATTRIBUTE_RETURNS_NONNULL
256 LLVM_ATTRIBUTE_RETURNS_NONNULL
257 const void *
getTag()
const {
return Tag; }
267 unsigned Count,
const void *Tag) {
268 profile.AddInteger((
unsigned)SymbolMetadataKind);
269 profile.AddPointer(R);
270 profile.AddPointer(S);
272 profile.AddPointer(LCtx);
273 profile.AddInteger(Count);
274 profile.AddPointer(Tag);
277 void Profile(llvm::FoldingSetNodeID& profile)
override {
278 Profile(profile, R, S,
T, LCtx, Count, Tag);
283 return SE->
getKind() == SymbolMetadataKind;
299 :
SymExpr(SymbolCastKind, Sym), Operand(In), FromTy(From), ToTy(To) {
309 Complexity = 1 + Operand->computeComplexity();
315 LLVM_ATTRIBUTE_RETURNS_NONNULL
322 ID.AddInteger((
unsigned) SymbolCastKind);
334 return SE->
getKind() == SymbolCastKind;
347 :
SymExpr(UnarySymExprKind, Sym), Operand(In), Op(Op),
T(
T) {
350 assert((Op == UO_Minus || Op == UO_Not) &&
"non-supported unary expression");
361 Complexity = 1 + Operand->computeComplexity();
373 ID.AddInteger((
unsigned)UnarySymExprKind);
385 return SE->
getKind() == UnarySymExprKind;
414 return k >= BEGIN_BINARYSYMEXPRS && k <= END_BINARYSYMEXPRS;
419 return Value->computeComplexity();
434template <
class LHSTYPE,
class RHSTYPE, SymExpr::Kind ClassKind>
464 static void Profile(llvm::FoldingSetNodeID &
ID, LHSTYPE lhs,
466 ID.AddInteger((
unsigned)ClassKind);
483 SymExpr::Kind::SymIntExprKind>;
487 SymExpr::Kind::IntSymExprKind>;
491 SymExpr::Kind::SymSymExprKind>;
495 llvm::BumpPtrAllocator &Alloc;
500 template <
class SymT,
typename... ArgsT> SymT *
make(ArgsT &&...Args) {
501 return new (Alloc) SymT(nextID(), std::forward<ArgsT>(Args)...);
505 SymbolID nextID() {
return NextSymbolID++; }
509 using DataSetTy = llvm::FoldingSet<SymExpr>;
510 using SymbolDependTy =
511 llvm::DenseMap<SymbolRef, std::unique_ptr<SymbolRefSmallVectorTy>>;
517 SymbolDependTy SymbolDependencies;
525 llvm::BumpPtrAllocator &bpalloc)
526 : SymbolDependencies(16), Alloc(bpalloc), BV(bv), Ctx(ctx) {}
533 template <
typename SymExprT,
typename... Args>
539 const void *SymbolTag =
nullptr) {
540 return acquire<SymbolConjured>(
E, LCtx,
T,
VisitCount, SymbolTag);
546 const void *SymbolTag =
nullptr) {
572 using SymbolSetTy = llvm::DenseSet<SymbolRef>;
573 using SymbolMapTy = llvm::DenseMap<SymbolRef, SymbolStatus>;
574 using RegionSetTy = llvm::DenseSet<const MemRegion *>;
576 SymbolMapTy TheLiving;
577 SymbolSetTy MetadataInUse;
579 RegionSetTy LiveRegionRoots;
584 RegionSetTy LazilyCopiedRegionRoots;
590 llvm::DenseMap<const MemRegion *, unsigned> includedRegionCache;
602 : LCtx(Ctx),
Loc(
s), SymMgr(symmgr), reapedStore(nullptr, storeMgr) {}
610 bool isLive(
const VarRegion *VR,
bool includeStoreBindings =
false)
const;
628 llvm::iterator_range<RegionSetTy::const_iterator>
regions()
const {
629 return LiveRegionRoots;
649 bool isLazilyCopiedRegion(
const MemRegion *region)
const;
653 bool isReadableRegion(
const MemRegion *region);
681template <
typename T,
typename... Args>
683 llvm::FoldingSetNodeID profile;
684 T::Profile(profile, args...);
686 SymExpr *SD = DataSet.FindNodeOrInsertPos(profile, InsertPos);
688 SD = Alloc.
make<
T>(std::forward<Args>(args)...);
689 DataSet.InsertNode(SD, InsertPos);
704struct 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 void Profile(llvm::FoldingSetNodeID &ID, LHSTYPE lhs, BinaryOperator::Opcode op, RHSTYPE rhs, QualType t)
void Profile(llvm::FoldingSetNodeID &ID) override
void dumpToStream(raw_ostream &os) const override
unsigned computeComplexity() const override
static bool classof(const SymExpr *SE)
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 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
LLVM_ATTRIBUTE_RETURNS_NONNULL const SymExpr * getOperand() const
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
static bool classof(const SymExpr *SE)
StringRef getKindStr() const override
Get a string representation of the kind of the region.
static void Profile(llvm::FoldingSetNodeID &profile, const Stmt *S, const LocationContext *LCtx, QualType T, unsigned Count, const void *SymbolTag)
const void * getTag() const
It might return null.
void dumpToStream(raw_ostream &os) const override
QualType getType() const override
const Stmt * getStmt() const
It might return null.
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 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 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
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
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.
const SymbolConjured * conjureSymbol(const Stmt *E, const LocationContext *LCtx, QualType T, unsigned VisitCount, const void *SymbolTag=nullptr)
void addSymbolDependency(const SymbolRef Primary, const SymbolRef Dependent)
Add artificial symbol dependency.
BasicValueFactory & getBasicVals()
QualType getType(const SymExpr *SE) const
const SymbolConjured * conjureSymbol(const Expr *E, const LocationContext *LCtx, 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)
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
QualType getType() const override
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.
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)