From: Ted Kremenek Date: Tue, 11 Mar 2008 18:57:24 +0000 (+0000) Subject: Expanded ValueState pretty-printing to use an optional "CheckerStatePrinter" X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=461f9776f2b3bc307dd4706822ffc7ef43102fd2;p=clang Expanded ValueState pretty-printing to use an optional "CheckerStatePrinter" object to pretty-print the component of a state that is specific to a checker. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48237 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Analysis/ValueState.cpp b/Analysis/ValueState.cpp index 1d428f199b..1fc4df9128 100644 --- a/Analysis/ValueState.cpp +++ b/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/include/clang/Analysis/PathSensitive/GRTransferFuncs.h b/include/clang/Analysis/PathSensitive/GRTransferFuncs.h index 4e020ba71b..256cadd945 100644 --- a/include/clang/Analysis/PathSensitive/GRTransferFuncs.h +++ b/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/include/clang/Analysis/PathSensitive/ValueState.h b/include/clang/Analysis/PathSensitive/ValueState.h index 8cd8f511e8..1a6ad38a9e 100644 --- a/include/clang/Analysis/PathSensitive/ValueState.h +++ b/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 { @@ -154,7 +161,8 @@ template<> struct GRTrait { // add the pointer. profile.AddPointer(St); } -}; +}; + class ValueStateManager { private: