15 #ifndef LLVM_CLANG_ANALYSIS_ANALYSISCONTEXT_H
16 #define LLVM_CLANG_ANALYSIS_ANALYSISCONTEXT_H
21 #include "llvm/ADT/DenseMap.h"
22 #include "llvm/ADT/FoldingSet.h"
23 #include "llvm/Support/Allocator.h"
29 class CFGReverseBlockReachabilityAnalysis;
32 class ManagedAnalysis;
34 class PseudoConstantAnalysis;
35 class LocationContextManager;
36 class StackFrameContext;
37 class BlockInvocationContext;
38 class AnalysisDeclContextManager;
39 class LocationContext;
41 namespace idx {
class TranslationUnit; }
73 std::unique_ptr<CFG> cfg, completeCFG;
74 std::unique_ptr<CFGStmtMap> cfgStmtMap;
79 bool builtCFG, builtCompleteCFG;
80 std::unique_ptr<ParentMap> PM;
81 std::unique_ptr<PseudoConstantAnalysis> PCA;
82 std::unique_ptr<CFGReverseBlockReachabilityAnalysis> CFA;
84 llvm::BumpPtrAllocator A;
86 llvm::DenseMap<const BlockDecl*,void*> *ReferencedBlockVars;
88 void *ManagedAnalyses;
111 return cfgBuildOptions;
115 return cfgBuildOptions;
176 llvm::iterator_range<referenced_decls_iterator>
191 const void *ContextData);
195 template <
typename T>
197 const void *tag = T::getTag();
202 return static_cast<T*
>(data);
226 :
Kind(k), Ctx(ctx), Parent(parent) {}
243 template <
typename T>
261 virtual void Profile(llvm::FoldingSetNodeID &
ID) = 0;
276 const Stmt *CallSite;
289 Block(blk), Index(idx) {}
303 void Profile(llvm::FoldingSetNodeID &
ID)
override;
307 const CFGBlock *blk,
unsigned idx) {
329 void Profile(llvm::FoldingSetNodeID &
ID)
override;
345 const void *ContextData;
351 const BlockDecl *bd,
const void *contextData)
361 void Profile(llvm::FoldingSetNodeID &
ID)
override;
365 const void *contextData) {
367 ID.AddPointer(contextData);
376 llvm::FoldingSet<LocationContext> Contexts;
393 const void *ContextData);
398 template <
typename LOC,
typename DATA>
405 typedef llvm::DenseMap<const Decl*, AnalysisDeclContext*> ContextMap;
413 std::unique_ptr<CodeInjector> Injector;
417 bool SynthesizeBodies;
421 bool addImplicitDtors =
false,
422 bool addInitializers =
false,
423 bool addTemporaryDtors =
false,
425 bool addStaticInitBranches =
false,
426 bool addCXXNewAllocator =
true,
438 return cfgBuildOptions;
const BlockDecl * getBlockDecl() const
static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ctx, const LocationContext *parent, const Stmt *s)
ASTContext & getASTContext() const
void Profile(llvm::FoldingSetNodeID &ID) override
static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ctx, const LocationContext *parent, const Stmt *s, const CFGBlock *blk, unsigned idx)
CFGStmtMap * getCFGStmtMap()
const internal::VariadicAllOfMatcher< Stmt > stmt
Matches statements.
virtual bool inTopFrame() const
Return true if the current LocationContext has no caller context.
AnalysisDeclContextManager * getManager() const
virtual void Profile(llvm::FoldingSetNodeID &ID)=0
const ImplicitParamDecl * getSelfDecl() const
const void * getContextData() const
bool isBodyAutosynthesized() const
Checks if the body of the Decl is generated by the BodyFarm.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Defines the clang::CodeInjector interface which is responsible for injecting AST of function definiti...
AnalysisDeclContext * getAnalysisDeclContext() const
bool getAddEHEdges() const
static bool classof(const LocationContext *Ctx)
bool getUseUnoptimizedCFG() const
bool synthesizeBodies() const
~AnalysisDeclContextManager()
unsigned getIndex() const
CFGReverseBlockReachabilityAnalysis * getCFGReachablityAnalysis()
const CFGBlock * getCallSiteBlock() const
const Stmt * getCallSite() const
bool isParentOf(const LocationContext *LC) const
const Decl * getDecl() const
void clear()
Discard all previously created LocationContext objects.
const StackFrameContext * getStackFrame(AnalysisDeclContext *Ctx, LocationContext const *Parent, const Stmt *S, const CFGBlock *Blk, unsigned Idx)
bool getUseUnoptimizedCFG() const
Stmt * getBody() const
Get the body of the Declaration.
ID
Defines the set of possible language-specific address spaces.
AnalysisDeclContext * getContext(const Decl *D)
static bool classof(const LocationContext *Ctx)
void Profile(llvm::FoldingSetNodeID &ID) override
ParentMap & getParentMap() const
StackFrameContext const * getStackFrame(const Decl *D, LocationContext const *Parent, const Stmt *S, const CFGBlock *Blk, unsigned Idx)
bool inTopFrame() const override
Return true if the current LocationContext has no caller context.
const CFGBlock * getBlockForRegisteredExpression(const Stmt *stmt)
AnalysisDeclContextManager(bool useUnoptimizedCFG=false, bool addImplicitDtors=false, bool addInitializers=false, bool addTemporaryDtors=false, bool synthesizeBodies=false, bool addStaticInitBranches=false, bool addCXXNewAllocator=true, CodeInjector *injector=nullptr)
const ScopeContext * getScope(AnalysisDeclContext *ctx, const LocationContext *parent, const Stmt *s)
const StackFrameContext * getStackFrame(LocationContext const *Parent, const Stmt *S, const CFGBlock *Blk, unsigned Idx)
CFG::BuildOptions & getCFGBuildOptions()
const StackFrameContext * getStackFrame(AnalysisDeclContext *ctx, const LocationContext *parent, const Stmt *s, const CFGBlock *blk, unsigned idx)
CFG * getUnoptimizedCFG()
Return a version of the CFG without any edges pruned.
~LocationContextManager()
const StackFrameContext * getCurrentStackFrame() const
ASTContext & getASTContext() const LLVM_READONLY
bool PruneTriviallyFalseEdges
static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ctx, const LocationContext *parent, const BlockDecl *bd, const void *contextData)
bool isCFGBuilt() const
Returns true if we have built a CFG for this analysis context. Note that this doesn't correspond to w...
const Decl * getDecl() const
virtual ~ManagedAnalysis()
bool getAddImplicitDtors() const
~StackFrameContext() override
const LocationContext * getParent() const
CFG::BuildOptions & getCFGBuildOptions()
Return the build options used to construct the CFG.
CodeInjector is an interface which is responsible for injecting AST of function definitions that may ...
llvm::iterator_range< referenced_decls_iterator > getReferencedBlockVars(const BlockDecl *BD)
void Profile(llvm::FoldingSetNodeID &ID) override
virtual ~LocationContext()
std::unique_ptr< DiagnosticConsumer > create(StringRef OutputFile, DiagnosticOptions *Diags, bool MergeChildRecords=false)
Returns a DiagnosticConsumer that serializes diagnostics to a bitcode file.
static bool classof(const LocationContext *Ctx)
const StackFrameContext * getStackFrame(const Decl *D)
bool isBodyAutosynthesizedFromModelFile() const
Checks if the body of the Decl is generated by the BodyFarm from a model file.
llvm::DenseMap< const Stmt *, const CFGBlock * > ForcedBlkExprs
ContextKind getKind() const
PseudoConstantAnalysis * getPseudoConstantAnalysis()
const CFG::BuildOptions & getCFGBuildOptions() const
const ImplicitParamDecl * getSelfDecl() const
const BlockInvocationContext * getBlockInvocationContext(AnalysisDeclContext *ctx, const LocationContext *parent, const BlockDecl *BD, const void *ContextData)
const VarDecl *const * referenced_decls_iterator
void dumpCFG(bool ShowColors)
LocationContext(ContextKind k, AnalysisDeclContext *ctx, const LocationContext *parent)
void registerForcedBlockExpression(const Stmt *stmt)
const BlockInvocationContext * getBlockInvocationContext(const LocationContext *parent, const BlockDecl *BD, const void *ContextData)
ParentMap & getParentMap()
bool getAddInitializers() const
void clear()
Discard all previously created AnalysisDeclContexts.
AnalysisDeclContext(AnalysisDeclContextManager *Mgr, const Decl *D)
~BlockInvocationContext() override
static void ProfileCommon(llvm::FoldingSetNodeID &ID, ContextKind ck, AnalysisDeclContext *ctx, const LocationContext *parent, const void *data)