summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/Analysis/ValueState.cpp18
-rw-r--r--clang/include/clang/Analysis/PathSensitive/GRTransferFuncs.h22
-rw-r--r--clang/include/clang/Analysis/PathSensitive/ValueState.h20
3 files changed, 40 insertions, 20 deletions
diff --git a/clang/Analysis/ValueState.cpp b/clang/Analysis/ValueState.cpp
index 1d428f199b2..1fc4df9128e 100644
--- a/clang/Analysis/ValueState.cpp
+++ b/clang/Analysis/ValueState.cpp
@@ -476,13 +476,16 @@ ValueState* ValueStateManager::getPersistentState(ValueState& State) {
return I;
}
-void ValueState::printDOT(std::ostream& Out) const {
- print(Out, "\\l", "\\|");
+void ValueState::printDOT(std::ostream& Out, CheckerStatePrinter* P) const {
+ print(Out, P, "\\l", "\\|");
}
-void ValueState::print(std::ostream& Out,
- const char* nl,
- const char* sep) const {
+void ValueState::printStdErr(CheckerStatePrinter* P) const {
+ print(*llvm::cerr, P);
+}
+
+void ValueState::print(std::ostream& Out, CheckerStatePrinter* P,
+ const char* nl, const char* sep) const {
// Print Variable Bindings
Out << "Variables:" << nl;
@@ -570,4 +573,9 @@ void ValueState::print(std::ostream& Out,
}
}
}
+
+ // Print checker-specific data.
+
+ if (P && CheckerState)
+ P->PrintCheckerState(Out, CheckerState, nl, sep);
}
diff --git a/clang/include/clang/Analysis/PathSensitive/GRTransferFuncs.h b/clang/include/clang/Analysis/PathSensitive/GRTransferFuncs.h
index 4e020ba71bb..256cadd945c 100644
--- a/clang/include/clang/Analysis/PathSensitive/GRTransferFuncs.h
+++ b/clang/include/clang/Analysis/PathSensitive/GRTransferFuncs.h
@@ -30,27 +30,31 @@ public:
// Casts.
- virtual RVal EvalCast(BasicValueFactory& BasicVals, NonLVal V, QualType CastT) =0;
- virtual RVal EvalCast(BasicValueFactory& BasicVals, LVal V, QualType CastT) = 0;
+ virtual RVal EvalCast(BasicValueFactory& BasicVals, NonLVal V,
+ QualType CastT) =0;
+
+ virtual RVal EvalCast(BasicValueFactory& BasicVals, LVal V,
+ QualType CastT) = 0;
// Unary Operators.
- virtual RVal EvalMinus(BasicValueFactory& BasicVals, UnaryOperator* U, NonLVal X) = 0;
+ virtual RVal EvalMinus(BasicValueFactory& BasicVals, UnaryOperator* U,
+ NonLVal X) = 0;
virtual RVal EvalComplement(BasicValueFactory& BasicVals, NonLVal X) = 0;
// Binary Operators.
- virtual RVal EvalBinOp(BasicValueFactory& BasicVals, BinaryOperator::Opcode Op,
- NonLVal L, NonLVal R) = 0;
+ virtual RVal EvalBinOp(BasicValueFactory& BasicVals,
+ BinaryOperator::Opcode Op, NonLVal L, NonLVal R) = 0;
- virtual RVal EvalBinOp(BasicValueFactory& BasicVals, BinaryOperator::Opcode Op,
- LVal L, LVal R) = 0;
+ virtual RVal EvalBinOp(BasicValueFactory& BasicVals,
+ BinaryOperator::Opcode Op, LVal L, LVal R) = 0;
// Pointer arithmetic.
- virtual RVal EvalBinOp(BasicValueFactory& BasicVals, BinaryOperator::Opcode Op,
- LVal L, NonLVal R) = 0;
+ virtual RVal EvalBinOp(BasicValueFactory& BasicVals,
+ BinaryOperator::Opcode Op, LVal L, NonLVal R) = 0;
// Calls.
diff --git a/clang/include/clang/Analysis/PathSensitive/ValueState.h b/clang/include/clang/Analysis/PathSensitive/ValueState.h
index 8cd8f511e82..1a6ad38a9e1 100644
--- a/clang/include/clang/Analysis/PathSensitive/ValueState.h
+++ b/clang/include/clang/Analysis/PathSensitive/ValueState.h
@@ -137,13 +137,20 @@ public:
typedef ConstEqTy::iterator ce_iterator;
ce_iterator ce_begin() const { return ConstEq.begin(); }
ce_iterator ce_end() const { return ConstEq.end(); }
+
+ class CheckerStatePrinter {
+ public:
+ virtual ~CheckerStatePrinter() {}
+ virtual void PrintCheckerState(std::ostream& Out, void* State,
+ const char* nl, const char* sep) = 0;
+ };
- void print(std::ostream& Out,
- const char* nl = "\n",
- const char* sep = "") const;
+ void print(std::ostream& Out, CheckerStatePrinter* P = NULL,
+ const char* nl = "\n", const char* sep = "") const;
+
+ void printStdErr(CheckerStatePrinter* P = NULL) const;
- void printStdErr() const { print(*llvm::cerr); }
- void printDOT(std::ostream& Out) const;
+ void printDOT(std::ostream& Out, CheckerStatePrinter*P = NULL) const;
};
template<> struct GRTrait<ValueState*> {
@@ -154,7 +161,8 @@ template<> struct GRTrait<ValueState*> {
// add the pointer.
profile.AddPointer(St);
}
-};
+};
+
class ValueStateManager {
private:
OpenPOWER on IntegriCloud