Viewing file: LiveVariables.h (3.76 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===- LiveVariables.h - Live Variable Analysis for Source CFGs -*- C++ --*-// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements Live Variables analysis for source-level CFGs. // //===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_ANALYSIS_ANALYSES_LIVEVARIABLES_H #define LLVM_CLANG_ANALYSIS_ANALYSES_LIVEVARIABLES_H
#include "clang/AST/Decl.h" #include "clang/Analysis/AnalysisDeclContext.h" #include "llvm/ADT/ImmutableSet.h"
namespace clang {
class CFG; class CFGBlock; class Stmt; class DeclRefExpr; class SourceManager;
class LiveVariables : public ManagedAnalysis { public: class LivenessValues { public:
llvm::ImmutableSet<const Expr *> liveExprs; llvm::ImmutableSet<const VarDecl *> liveDecls; llvm::ImmutableSet<const BindingDecl *> liveBindings;
bool equals(const LivenessValues &V) const;
LivenessValues() : liveExprs(nullptr), liveDecls(nullptr), liveBindings(nullptr) {}
LivenessValues(llvm::ImmutableSet<const Expr *> liveExprs, llvm::ImmutableSet<const VarDecl *> LiveDecls, llvm::ImmutableSet<const BindingDecl *> LiveBindings) : liveExprs(liveExprs), liveDecls(LiveDecls), liveBindings(LiveBindings) {}
bool isLive(const Expr *E) const; bool isLive(const VarDecl *D) const;
friend class LiveVariables; };
class Observer { virtual void anchor(); public: virtual ~Observer() {}
/// A callback invoked right before invoking the /// liveness transfer function on the given statement. virtual void observeStmt(const Stmt *S, const CFGBlock *currentBlock, const LivenessValues& V) {}
/// Called when the live variables analysis registers /// that a variable is killed. virtual void observerKill(const DeclRefExpr *DR) {} };
~LiveVariables() override;
/// Compute the liveness information for a given CFG. static std::unique_ptr<LiveVariables> computeLiveness(AnalysisDeclContext &analysisContext, bool killAtAssign);
/// Return true if a variable is live at the end of a /// specified block. bool isLive(const CFGBlock *B, const VarDecl *D);
/// 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);
/// Returns true the block-level expression value is live /// before the given block-level expression (see runOnAllBlocks). bool isLive(const Stmt *Loc, const Expr *Val);
/// Print to stderr the variable liveness information associated with /// each basic block. void dumpBlockLiveness(const SourceManager &M);
/// Print to stderr the expression liveness information associated with /// each basic block. void dumpExprLiveness(const SourceManager &M);
void runOnAllBlocks(Observer &obs);
static std::unique_ptr<LiveVariables> create(AnalysisDeclContext &analysisContext) { return computeLiveness(analysisContext, true); }
static const void *getTag();
private: LiveVariables(void *impl); void *impl; };
class RelaxedLiveVariables : public LiveVariables { public: static std::unique_ptr<LiveVariables> create(AnalysisDeclContext &analysisContext) { return computeLiveness(analysisContext, false); }
static const void *getTag(); };
} // end namespace clang
#endif
|