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"
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
319 static void Profile(llvm::FoldingSetNodeID& ID,
327 void Profile(llvm::FoldingSetNodeID& ID)
override {
328 Profile(ID, Operand, FromTy, ToTy);
349 assert((Op == UO_Minus || Op == UO_Not) &&
"non-supported unary expression");
360 Complexity = 1 + Operand->computeComplexity();
378 void Profile(llvm::FoldingSetNodeID &ID)
override {
395 :
SymExpr(k, Sym), Op(op), T(t) {
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,
472 void Profile(llvm::FoldingSetNodeID &ID)
override {
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) {
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 : SF(SF), 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.
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 ...
BinaryOperatorKind Opcode
This represents one expression.
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
friend class SymExprAllocator
static void Profile(llvm::FoldingSetNodeID &ID, LHSTYPE lhs, BinaryOperator::Opcode op, RHSTYPE rhs, QualType t)
void dumpToStream(raw_ostream &os) const override
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)
SymExpr(Kind k, SymbolID Sym)
virtual QualType getType() const =0
SymbolID getSymbolID() const
Get a unique identifier for this symbol.
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
friend class SymExprAllocator
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
friend class SymExprAllocator
SymbolData(Kind k, SymbolID sym)
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)
friend class SymExprAllocator
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
friend class SymExprAllocator
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()
void markLive(SymbolRef sym)
Unconditionally marks a symbol as live.
void markElementIndicesLive(const MemRegion *region)
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.
SymbolReaper(const StackFrame *SF, const Stmt *s, SymbolManager &symmgr, StoreManager &storeMgr)
Construct a reaper object, which removes everything which is not live before we execute statement s i...
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
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)
friend class SymExprAllocator
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
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)
friend class SymExprAllocator
const SymExpr * getOperand() const
SmallVector< SymbolRef, 2 > SymbolRefSmallVectorTy
BinarySymExprImpl< APSIntPtr, const SymExpr *, SymExpr::Kind::IntSymExprKind > IntSymExpr
Represents a symbolic expression like 3 - 'x'.
const SymExpr * SymbolRef
BinarySymExprImpl< const SymExpr *, const SymExpr *, SymExpr::Kind::SymSymExprKind > SymSymExpr
Represents a symbolic expression like 'x' + 'y'.
BinarySymExprImpl< const SymExpr *, APSIntPtr, SymExpr::Kind::SymIntExprKind > SymIntExpr
Represents a symbolic expression like 'x' + 3.
The JSON file list parser is used to communicate input to InstallAPI.
CFGBlock::ConstCFGElementRef ConstCFGElementRef
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
U cast(CodeGen::Address addr)
value_type_ref key_type_ref
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)
clang::ento::SymbolRef value_type
clang::ento::SymbolRef value_type_ref