14#ifndef LLVM_CLANG_ANALYSIS_ANALYSES_LIFETIMESAFETY_FACTS_H
15#define LLVM_CLANG_ANALYSIS_ANALYSES_LIFETIMESAFETY_FACTS_H
22#include "llvm/ADT/SmallVector.h"
23#include "llvm/Support/Debug.h"
34 enum class Kind : uint8_t {
67 template <
typename T>
const T *
getAs()
const {
69 return static_cast<const T *
>(
this);
129 KillDest(KillDest) {}
141 const Expr *EscapeExpr;
161 bool IsWritten =
false;
167 :
Fact(
Kind::
Use), UseExpr(UseExpr), OID(OM.get(*UseExpr)) {}
181 StringRef Annotation;
198 assert(BlockToFacts.empty() &&
"FactManager already initialized");
207 if (!NewFacts.empty())
208 BlockToFacts[B->
getBlockID()].assign(NewFacts.begin(), NewFacts.end());
211 template <
typename FactType,
typename... Args>
213 void *Mem = FactAllocator.Allocate<FactType>();
214 FactType *Res =
new (Mem) FactType(std::forward<Args>(args)...);
215 Res->setID(NextFactID++);
245 OriginManager OriginMgr;
248 llvm::BumpPtrAllocator FactAllocator;
This file defines AnalysisDeclContext, a class that manages the analysis context data for context sen...
AnalysisDeclContext contains the context data for the function, method or block under analysis.
Represents a single basic block in a source-level CFG.
unsigned getBlockID() const
Represents a source-level, intra-procedural CFG that represents the control-flow of a Stmt.
unsigned getNumBlockIDs() const
Returns the total number of BlockIDs allocated (which start at 0).
This represents one expression.
Encodes a location in the source.
SourceLocation getExpiryLoc() const
static bool classof(const Fact *F)
ExpireFact(LoanID LID, SourceLocation ExpiryLoc)
void dump(llvm::raw_ostream &OS, const LoanManager &LM, const OriginManager &) const override
llvm::ArrayRef< const Fact * > getFacts(const CFGBlock *B) const
FactType * createFact(Args &&...args)
unsigned getNumFacts() const
OriginManager & getOriginMgr()
llvm::StringMap< ProgramPoint > getTestPoints() const
Retrieves program points that were specially marked in the source code for testing.
void dump(const CFG &Cfg, AnalysisDeclContext &AC) const
LoanManager & getLoanMgr()
void addBlockFacts(const CFGBlock *B, llvm::ArrayRef< Fact * > NewFacts)
const OriginManager & getOriginMgr() const
void init(const CFG &Cfg)
const LoanManager & getLoanMgr() const
llvm::ArrayRef< const Fact * > getBlockContaining(ProgramPoint P) const
Retrieves all the facts in the block containing Program Point P.
An abstract base class for a single, atomic lifetime-relevant event.
@ TestPoint
A marker for a specific point in the code, for testing.
@ Expire
A loan expires as its underlying storage is freed (e.g., variable goes out of scope).
@ Issue
A new loan is issued from a borrow expression (e.g., &x).
@ OriginFlow
An origin is propagated from a source to a destination (e.g., p = q).
@ Use
An origin is used (eg. appears as l-value expression like DeclRefExpr).
@ OriginEscapes
An origin that escapes the function scope (e.g., via return).
virtual void dump(llvm::raw_ostream &OS, const LoanManager &, const OriginManager &) const
void dump(llvm::raw_ostream &OS, const LoanManager &LM, const OriginManager &OM) const override
OriginID getOriginID() const
IssueFact(LoanID LID, OriginID OID)
static bool classof(const Fact *F)
Manages the creation, storage and retrieval of loans.
OriginID getEscapedOriginID() const
const Expr * getEscapeExpr() const
static bool classof(const Fact *F)
void dump(llvm::raw_ostream &OS, const LoanManager &, const OriginManager &OM) const override
OriginEscapesFact(OriginID OID, const Expr *EscapeExpr)
static bool classof(const Fact *F)
void dump(llvm::raw_ostream &OS, const LoanManager &, const OriginManager &OM) const override
OriginID getSrcOriginID() const
OriginID getDestOriginID() const
OriginFlowFact(OriginID OIDDest, OriginID OIDSrc, bool KillDest)
Manages the creation, storage, and retrieval of origins for pointer-like variables and expressions.
void dump(llvm::raw_ostream &OS, const LoanManager &, const OriginManager &) const override
static bool classof(const Fact *F)
StringRef getAnnotation() const
TestPointFact(StringRef Annotation)
UseFact(const Expr *UseExpr, OriginManager &OM)
const Expr * getUseExpr() const
void dump(llvm::raw_ostream &OS, const LoanManager &, const OriginManager &OM) const override
static bool classof(const Fact *F)
OriginID getUsedOrigin() const
const Fact * ProgramPoint
A ProgramPoint identifies a location in the CFG by pointing to a specific Fact.
utils::ID< struct LoanTag > LoanID
utils::ID< struct OriginTag > OriginID
utils::ID< struct FactTag > FactID
const FunctionProtoType * T
A generic, type-safe wrapper for an ID, distinguished by its Tag type.