clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
125 lines
3.8 KiB
C++
125 lines
3.8 KiB
C++
//===- 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
|