#include "clang/Analysis/FlowSensitive/DataflowAnalysisContext.h"
#include "clang/AST/ExprCXX.h"
#include "clang/Analysis/FlowSensitive/ASTOps.h"
#include "clang/Analysis/FlowSensitive/DebugSupport.h"
#include "clang/Analysis/FlowSensitive/Formula.h"
#include "clang/Analysis/FlowSensitive/Logger.h"
#include "clang/Analysis/FlowSensitive/SimplifyConstraints.h"
#include "clang/Analysis/FlowSensitive/Value.h"
#include "llvm/ADT/SetOperations.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
#include <cassert>
#include <memory>
#include <string>
#include <utility>
#include <vector>
static llvm::cl::opt<std::string> DataflowLog(
"dataflow-log", llvm::cl::Hidden, llvm::cl::ValueOptional,
llvm::cl::desc("Emit log of dataflow analysis. With no arg, writes textual "
"log to stderr. With an arg, writes HTML logs under the "
"specified directory (one per analyzed function)."));
namespace clang {
namespace dataflow {
FieldSet DataflowAnalysisContext::getModeledFields(QualType Type) { … }
void DataflowAnalysisContext::addModeledFields(const FieldSet &Fields) { … }
StorageLocation &DataflowAnalysisContext::createStorageLocation(QualType Type) { … }
template <typename T>
static llvm::DenseSet<llvm::StringRef> getKeys(const llvm::StringMap<T> &Map) { … }
RecordStorageLocation &DataflowAnalysisContext::createRecordStorageLocation(
QualType Type, RecordStorageLocation::FieldToLoc FieldLocs,
RecordStorageLocation::SyntheticFieldMap SyntheticFields) { … }
StorageLocation &
DataflowAnalysisContext::getStableStorageLocation(const ValueDecl &D) { … }
StorageLocation &
DataflowAnalysisContext::getStableStorageLocation(const Expr &E) { … }
PointerValue &
DataflowAnalysisContext::getOrCreateNullPointerValue(QualType PointeeType) { … }
void DataflowAnalysisContext::addInvariant(const Formula &Constraint) { … }
void DataflowAnalysisContext::addFlowConditionConstraint(
Atom Token, const Formula &Constraint) { … }
Atom DataflowAnalysisContext::forkFlowCondition(Atom Token) { … }
Atom
DataflowAnalysisContext::joinFlowConditions(Atom FirstToken,
Atom SecondToken) { … }
Solver::Result DataflowAnalysisContext::querySolver(
llvm::SetVector<const Formula *> Constraints) { … }
bool DataflowAnalysisContext::flowConditionImplies(Atom Token,
const Formula &F) { … }
bool DataflowAnalysisContext::flowConditionAllows(Atom Token,
const Formula &F) { … }
bool DataflowAnalysisContext::equivalentFormulas(const Formula &Val1,
const Formula &Val2) { … }
void DataflowAnalysisContext::addTransitiveFlowConditionConstraints(
Atom Token, llvm::SetVector<const Formula *> &Constraints) { … }
static void printAtomList(const llvm::SmallVector<Atom> &Atoms,
llvm::raw_ostream &OS) { … }
void DataflowAnalysisContext::dumpFlowCondition(Atom Token,
llvm::raw_ostream &OS) { … }
const AdornedCFG *
DataflowAnalysisContext::getAdornedCFG(const FunctionDecl *F) { … }
static std::unique_ptr<Logger> makeLoggerFromCommandLine() { … }
DataflowAnalysisContext::DataflowAnalysisContext(
Solver &S, std::unique_ptr<Solver> &&OwnedSolver, Options Opts)
: … { … }
DataflowAnalysisContext::~DataflowAnalysisContext() = default;
}
}