diff options
author | ed <ed@FreeBSD.org> | 2009-06-02 17:58:47 +0000 |
---|---|---|
committer | ed <ed@FreeBSD.org> | 2009-06-02 17:58:47 +0000 |
commit | f27e5a09a0d815b8a4814152954ff87dadfdefc0 (patch) | |
tree | ce7d964cbb5e39695b71481698f10cb099c23d4a /include/clang/Analysis/Analyses/LiveVariables.h | |
download | FreeBSD-src-f27e5a09a0d815b8a4814152954ff87dadfdefc0.zip FreeBSD-src-f27e5a09a0d815b8a4814152954ff87dadfdefc0.tar.gz |
Import Clang, at r72732.
Diffstat (limited to 'include/clang/Analysis/Analyses/LiveVariables.h')
-rw-r--r-- | include/clang/Analysis/Analyses/LiveVariables.h | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/include/clang/Analysis/Analyses/LiveVariables.h b/include/clang/Analysis/Analyses/LiveVariables.h new file mode 100644 index 0000000..b41cd68 --- /dev/null +++ b/include/clang/Analysis/Analyses/LiveVariables.h @@ -0,0 +1,119 @@ +//===- LiveVariables.h - Live Variable Analysis for Source CFGs -*- C++ --*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements Live Variables analysis for source-level CFGs. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_LIVEVARIABLES_H +#define LLVM_CLANG_LIVEVARIABLES_H + +#include "clang/AST/Decl.h" +#include "clang/Analysis/Support/BlkExprDeclBitVector.h" +#include "clang/Analysis/FlowSensitive/DataflowValues.h" + +namespace clang { + +class Stmt; +class DeclRefExpr; +class SourceManager; + +struct LiveVariables_ValueTypes { + + struct ObserverTy; + + // We keep dataflow state for declarations and block-level expressions; + typedef StmtDeclBitVector_Types::ValTy ValTy; + + // We need to keep track of both declarations and CFGBlock-level expressions, + // (so that we don't explore such expressions twice). We also want + // to compute liveness information for block-level expressions, since these + // act as "temporary" values. + + struct AnalysisDataTy : public StmtDeclBitVector_Types::AnalysisDataTy { + ObserverTy* Observer; + ValTy AlwaysLive; + + AnalysisDataTy() : Observer(NULL) {} + }; + + //===-----------------------------------------------------===// + // ObserverTy - Observer for uninitialized values queries. + //===-----------------------------------------------------===// + + struct ObserverTy { + virtual ~ObserverTy() {} + + /// ObserveStmt - A callback invoked right before invoking the + /// liveness transfer function on the given statement. + virtual void ObserveStmt(Stmt* S, const AnalysisDataTy& AD, + const ValTy& V) {} + + virtual void ObserverKill(DeclRefExpr* DR) {} + }; +}; + +class LiveVariables : public DataflowValues<LiveVariables_ValueTypes, + dataflow::backward_analysis_tag> { + + +public: + typedef LiveVariables_ValueTypes::ObserverTy ObserverTy; + + LiveVariables(ASTContext& Ctx, CFG& cfg); + + /// IsLive - Return true if a variable is live at beginning of a + /// specified block. + bool isLive(const CFGBlock* B, const VarDecl* D) const; + + /// IsLive - Returns true if a variable is live at the beginning of the + /// the statement. This query only works if liveness information + /// has been recorded at the statement level (see runOnAllBlocks), and + /// only returns liveness information for block-level expressions. + bool isLive(const Stmt* S, const VarDecl* D) const; + + /// IsLive - Returns true the block-level expression "value" is live + /// before the given block-level expression (see runOnAllBlocks). + bool isLive(const Stmt* Loc, const Stmt* StmtVal) const; + + /// IsLive - Return true if a variable is live according to the + /// provided livness bitvector. + bool isLive(const ValTy& V, const VarDecl* D) const; + + /// dumpLiveness - Print to stderr the liveness information encoded + /// by a specified bitvector. + void dumpLiveness(const ValTy& V, SourceManager& M) const; + + /// dumpBlockLiveness - Print to stderr the liveness information + /// associated with each basic block. + void dumpBlockLiveness(SourceManager& M) const; + + /// getNumDecls - Return the number of variables (declarations) that + /// whose liveness status is being tracked by the dataflow + /// analysis. + unsigned getNumDecls() const { return getAnalysisData().getNumDecls(); } + + /// IntializeValues - This routine can perform extra initialization, but + /// for LiveVariables this does nothing since all that logic is in + /// the constructor. + void InitializeValues(const CFG& cfg) {} + + void runOnCFG(CFG& cfg); + + /// runOnAllBlocks - Propagate the dataflow values once for each block, + /// starting from the current dataflow values. 'recordStmtValues' indicates + /// whether the method should store dataflow values per each individual + /// block-level expression. + void runOnAllBlocks(const CFG& cfg, ObserverTy* Obs, + bool recordStmtValues=false); +}; + +} // end namespace clang + +#endif |