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;
}
}
}
+
+ // Print checker-specific data.
+
+ if (P && CheckerState)
+ P->PrintCheckerState(Out, CheckerState, nl, sep);
}
// 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.
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*> {
// add the pointer.
profile.AddPointer(St);
}
-};
+};
+
class ValueStateManager {
private: