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/iterator_range.h"
29#include "llvm/Support/Allocator.h"
39class BasicValueFactory;
48 :
SymbolData(SymbolRegionValueKind, sym), R(r) {
53 LLVM_ATTRIBUTE_RETURNS_NONNULL
57 profile.AddInteger((
unsigned) SymbolRegionValueKind);
58 profile.AddPointer(R);
61 void Profile(llvm::FoldingSetNodeID& profile)
override {
74 return SE->
getKind() == SymbolRegionValueKind;
85 const void *SymbolTag;
89 QualType t,
unsigned count,
const void *symbolTag)
90 :
SymbolData(SymbolConjuredKind, sym), S(
s),
T(t), Count(count),
91 LCtx(lctx), SymbolTag(symbolTag) {
105 const void *
getTag()
const {
return SymbolTag; }
113 static void Profile(llvm::FoldingSetNodeID& profile,
const Stmt *S,
115 const void *SymbolTag) {
116 profile.AddInteger((
unsigned) SymbolConjuredKind);
117 profile.AddPointer(S);
118 profile.AddPointer(LCtx);
120 profile.AddInteger(Count);
121 profile.AddPointer(SymbolTag);
124 void Profile(llvm::FoldingSetNodeID& profile)
override {
125 Profile(profile, S,
T, Count, LCtx, SymbolTag);
130 return SE->
getKind() == SymbolConjuredKind;
142 :
SymbolData(SymbolDerivedKind, sym), parentSymbol(parent), R(r) {
148 LLVM_ATTRIBUTE_RETURNS_NONNULL
150 LLVM_ATTRIBUTE_RETURNS_NONNULL
162 profile.AddInteger((
unsigned) SymbolDerivedKind);
163 profile.AddPointer(r);
164 profile.AddPointer(parent);
167 void Profile(llvm::FoldingSetNodeID& profile)
override {
168 Profile(profile, parentSymbol, R);
173 return SE->
getKind() == SymbolDerivedKind;
189 LLVM_ATTRIBUTE_RETURNS_NONNULL
199 profile.AddInteger((
unsigned) SymbolExtentKind);
200 profile.AddPointer(R);
203 void Profile(llvm::FoldingSetNodeID& profile)
override {
209 return SE->
getKind() == SymbolExtentKind;
228 :
SymbolData(SymbolMetadataKind, sym), R(r), S(
s),
T(t), LCtx(LCtx),
229 Count(count), Tag(tag) {
237 LLVM_ATTRIBUTE_RETURNS_NONNULL
240 LLVM_ATTRIBUTE_RETURNS_NONNULL
243 LLVM_ATTRIBUTE_RETURNS_NONNULL
248 LLVM_ATTRIBUTE_RETURNS_NONNULL
249 const void *
getTag()
const {
return Tag; }
259 unsigned Count,
const void *Tag) {
260 profile.AddInteger((
unsigned)SymbolMetadataKind);
261 profile.AddPointer(R);
262 profile.AddPointer(S);
264 profile.AddPointer(LCtx);
265 profile.AddInteger(Count);
266 profile.AddPointer(Tag);
269 void Profile(llvm::FoldingSetNodeID& profile)
override {
270 Profile(profile, R, S,
T, LCtx, Count, Tag);
275 return SE->
getKind() == SymbolMetadataKind;
291 :
SymExpr(SymbolCastKind), Operand(In), FromTy(From), ToTy(To) {
300 Complexity = 1 + Operand->computeComplexity();
306 LLVM_ATTRIBUTE_RETURNS_NONNULL
313 ID.AddInteger((
unsigned) SymbolCastKind);
325 return SE->
getKind() == SymbolCastKind;
337 :
SymExpr(UnarySymExprKind), Operand(In), Op(Op),
T(
T) {
340 assert((Op == UO_Minus || Op == UO_Not) &&
"non-supported unary expression");
350 Complexity = 1 + Operand->computeComplexity();
362 ID.AddInteger((
unsigned)UnarySymExprKind);
374 return SE->
getKind() == UnarySymExprKind;
403 return k >= BEGIN_BINARYSYMEXPRS && k <= END_BINARYSYMEXPRS;
408 return Value->computeComplexity();
423template <
class LHSTYPE,
class RHSTYPE, SymExpr::Kind ClassKind>
452 static void Profile(llvm::FoldingSetNodeID &
ID, LHSTYPE lhs,
454 ID.AddInteger((
unsigned)ClassKind);
471 SymExpr::Kind::SymIntExprKind>;
475 SymExpr::Kind::IntSymExprKind>;
479 SymExpr::Kind::SymSymExprKind>;
482 using DataSetTy = llvm::FoldingSet<SymExpr>;
483 using SymbolDependTy =
484 llvm::DenseMap<SymbolRef, std::unique_ptr<SymbolRefSmallVectorTy>>;
490 SymbolDependTy SymbolDependencies;
492 unsigned SymbolCounter = 0;
493 llvm::BumpPtrAllocator& BPAlloc;
499 llvm::BumpPtrAllocator& bpalloc)
500 : SymbolDependencies(16), BPAlloc(bpalloc), BV(bv), Ctx(ctx) {}
511 const void *SymbolTag =
nullptr);
516 const void *SymbolTag =
nullptr) {
533 const void *SymbolTag =
nullptr);
577 using SymbolSetTy = llvm::DenseSet<SymbolRef>;
578 using SymbolMapTy = llvm::DenseMap<SymbolRef, SymbolStatus>;
579 using RegionSetTy = llvm::DenseSet<const MemRegion *>;
581 SymbolMapTy TheLiving;
582 SymbolSetTy MetadataInUse;
584 RegionSetTy LiveRegionRoots;
589 RegionSetTy LazilyCopiedRegionRoots;
595 llvm::DenseMap<const MemRegion *, unsigned> includedRegionCache;
607 : LCtx(Ctx),
Loc(
s), SymMgr(symmgr), reapedStore(nullptr, storeMgr) {}
615 bool isLive(
const VarRegion *VR,
bool includeStoreBindings =
false)
const;
633 llvm::iterator_range<RegionSetTy::const_iterator>
regions()
const {
634 return LiveRegionRoots;
654 bool isLazilyCopiedRegion(
const MemRegion *region)
const;
658 bool isReadableRegion(
const MemRegion *region);
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)
BinarySymExprImpl(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.
BinarySymExpr(Kind k, BinaryOperator::Opcode op, QualType t)
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)
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.
static bool isValidTypeForSymbol(QualType T)
virtual QualType getType() const =0
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
SymbolCast(const SymExpr *In, QualType From, QualType To)
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, QualType T, unsigned Count, const LocationContext *LCtx, 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.
SymbolConjured(SymbolID sym, const Stmt *s, const LocationContext *lctx, QualType t, unsigned count, const void *symbolTag)
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)
SymbolDerived(SymbolID sym, SymbolRef parent, const TypedValueRegion *r)
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
SymbolExtent(SymbolID sym, const SubRegion *r)
const SymbolExtent * getExtentSymbol(const SubRegion *R)
SymbolManager(ASTContext &ctx, BasicValueFactory &bv, llvm::BumpPtrAllocator &bpalloc)
const SymbolDerived * getDerivedSymbol(SymbolRef parentSymbol, const TypedValueRegion *R)
const SymIntExpr * getSymIntExpr(const SymExpr &lhs, BinaryOperator::Opcode op, APSIntPtr rhs, QualType t)
const SymbolMetadata * getMetadataSymbol(const MemRegion *R, const Stmt *S, QualType T, const LocationContext *LCtx, unsigned VisitCount, const void *SymbolTag=nullptr)
Creates a metadata symbol associated with a specific region.
const SymbolRegionValue * getRegionValueSymbol(const TypedValueRegion *R)
Make a unique symbol for MemRegion R according to its kind.
const SymIntExpr * getSymIntExpr(const SymExpr *lhs, BinaryOperator::Opcode op, APSIntPtr rhs, QualType t)
const SymbolConjured * conjureSymbol(const Stmt *E, const LocationContext *LCtx, QualType T, unsigned VisitCount, const void *SymbolTag=nullptr)
const IntSymExpr * getIntSymExpr(APSIntPtr lhs, BinaryOperator::Opcode op, const SymExpr *rhs, QualType t)
void addSymbolDependency(const SymbolRef Primary, const SymbolRef Dependent)
Add artificial symbol dependency.
BasicValueFactory & getBasicVals()
QualType getType(const SymExpr *SE) const
const SymbolCast * getCastSymbol(const SymExpr *Operand, QualType From, QualType To)
const SymbolConjured * conjureSymbol(const Expr *E, const LocationContext *LCtx, unsigned VisitCount, const void *SymbolTag=nullptr)
const UnarySymExpr * getUnarySymExpr(const SymExpr *operand, UnaryOperator::Opcode op, QualType t)
const SymbolRefSmallVectorTy * getDependentSymbols(const SymbolRef Primary)
static bool canSymbolicate(QualType T)
const SymSymExpr * getSymSymExpr(const SymExpr *lhs, BinaryOperator::Opcode op, const SymExpr *rhs, 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
SymbolRegionValue(SymbolID sym, const TypedValueRegion *r)
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
UnarySymExpr(const SymExpr *In, UnaryOperator::Opcode Op, QualType T)
static void Profile(llvm::FoldingSetNodeID &ID, const SymExpr *In, UnaryOperator::Opcode Op, QualType T)
const SymExpr * getOperand() const
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T