diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Analysis/CFRefCount.cpp | 24 | ||||
-rw-r--r-- | clang/lib/Analysis/GRExprEngine.cpp | 25 | ||||
-rw-r--r-- | clang/lib/Analysis/GRState.cpp | 21 |
3 files changed, 44 insertions, 26 deletions
diff --git a/clang/lib/Analysis/CFRefCount.cpp b/clang/lib/Analysis/CFRefCount.cpp index 2d69d9bb3d8..256072ab3a9 100644 --- a/clang/lib/Analysis/CFRefCount.cpp +++ b/clang/lib/Analysis/CFRefCount.cpp @@ -1211,10 +1211,10 @@ public: typedef llvm::DenseMap<GRExprEngine::NodeTy*, std::vector<SymbolID>*> LeaksTy; - class BindingsPrinter : public GRState::CheckerStatePrinter { + class BindingsPrinter : public GRState::Printer { public: - virtual void PrintCheckerState(std::ostream& Out, void* State, - const char* nl, const char* sep); + virtual void Print(std::ostream& Out, const GRState* state, + const char* nl, const char* sep); }; private: @@ -1231,6 +1231,10 @@ public: static RefBindings GetRefBindings(const GRState& StImpl) { return RefBindings((const RefBindings::TreeTy*) StImpl.CheckerState); } + + static RefBindings GetRefBindings(const GRState* state) { + return RefBindings((const RefBindings::TreeTy*) state->CheckerState); + } private: @@ -1272,8 +1276,8 @@ public: virtual void RegisterChecks(GRExprEngine& Eng); - virtual GRState::CheckerStatePrinter* getCheckerStatePrinter() { - return &Printer; + virtual void getStatePrinters(std::vector<GRState::Printer*>& Printers) { + Printers.push_back(&Printer); } bool isGCEnabled() const { return Summaries.isGCEnabled(); } @@ -1363,12 +1367,12 @@ public: -void CFRefCount::BindingsPrinter::PrintCheckerState(std::ostream& Out, - void* State, const char* nl, - const char* sep) { - RefBindings B((RefBindings::TreeTy*) State); +void CFRefCount::BindingsPrinter::Print(std::ostream& Out, const GRState* state, + const char* nl, const char* sep) { + + RefBindings B = GetRefBindings(state); - if (State) + if (!B.isEmpty()) Out << sep << nl; for (RefBindings::iterator I=B.begin(), E=B.end(); I!=E; ++I) { diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp index 43f5ef2185e..cb423e18af2 100644 --- a/clang/lib/Analysis/GRExprEngine.cpp +++ b/clang/lib/Analysis/GRExprEngine.cpp @@ -2257,7 +2257,7 @@ void GRExprEngine::EvalBinOp(GRStateSet& OStates, const GRState* St, #ifndef NDEBUG static GRExprEngine* GraphPrintCheckerState; static SourceManager* GraphPrintSourceManager; -static GRState::CheckerStatePrinter* GraphCheckerStatePrinter; +static GRState::Printer **GraphStatePrinterBeg, **GraphStatePrinterEnd; namespace llvm { template<> @@ -2500,7 +2500,7 @@ struct VISIBILITY_HIDDEN DOTGraphTraits<GRExprEngine::NodeTy*> : Out << "\\|StateID: " << (void*) N->getState() << "\\|"; - N->getState()->printDOT(Out, GraphCheckerStatePrinter); + N->getState()->printDOT(Out, GraphStatePrinterBeg, GraphStatePrinterEnd); Out << "\\l"; return Out.str(); @@ -2565,13 +2565,20 @@ void GRExprEngine::ViewGraph(bool trim) { else { GraphPrintCheckerState = this; GraphPrintSourceManager = &getContext().getSourceManager(); - GraphCheckerStatePrinter = getTF().getCheckerStatePrinter(); + + // Get the state printers. + std::vector<GRState::Printer*> Printers; + getTF().getStatePrinters(Printers); + GraphStatePrinterBeg = Printers.empty() ? 0 : &Printers[0]; + GraphStatePrinterEnd = Printers.empty() ? 0 : &Printers[0]+Printers.size(); + llvm::ViewGraph(*G.roots_begin(), "GRExprEngine"); GraphPrintCheckerState = NULL; GraphPrintSourceManager = NULL; - GraphCheckerStatePrinter = NULL; + GraphStatePrinterBeg = NULL; + GraphStatePrinterEnd = NULL; } #endif } @@ -2580,7 +2587,12 @@ void GRExprEngine::ViewGraph(NodeTy** Beg, NodeTy** End) { #ifndef NDEBUG GraphPrintCheckerState = this; GraphPrintSourceManager = &getContext().getSourceManager(); - GraphCheckerStatePrinter = getTF().getCheckerStatePrinter(); + + // Get the state printers. + std::vector<GRState::Printer*> Printers; + getTF().getStatePrinters(Printers); + GraphStatePrinterBeg = Printers.empty() ? 0 : &Printers[0]; + GraphStatePrinterEnd = Printers.empty() ? 0 : &Printers[0]+Printers.size(); GRExprEngine::GraphTy* TrimmedG = G.Trim(Beg, End); @@ -2593,6 +2605,7 @@ void GRExprEngine::ViewGraph(NodeTy** Beg, NodeTy** End) { GraphPrintCheckerState = NULL; GraphPrintSourceManager = NULL; - GraphCheckerStatePrinter = NULL; + GraphStatePrinterBeg = NULL; + GraphStatePrinterEnd = NULL; #endif } diff --git a/clang/lib/Analysis/GRState.cpp b/clang/lib/Analysis/GRState.cpp index 2704bf2f371..1c7df79c029 100644 --- a/clang/lib/Analysis/GRState.cpp +++ b/clang/lib/Analysis/GRState.cpp @@ -202,16 +202,17 @@ const GRState* GRStateManager::getPersistentState(GRState& State) { return I; } -void GRState::printDOT(std::ostream& Out, CheckerStatePrinter* P) const { - print(Out, P, "\\l", "\\|"); +void GRState::printDOT(std::ostream& Out, + Printer** Beg, Printer** End) const { + print(Out, Beg, End, "\\l", "\\|"); } -void GRState::printStdErr(CheckerStatePrinter* P) const { - print(*llvm::cerr, P); +void GRState::printStdErr(Printer** Beg, Printer** End) const { + print(*llvm::cerr, Beg, End); } -void GRState::print(std::ostream& Out, CheckerStatePrinter* P, - const char* nl, const char* sep) const { +void GRState::print(std::ostream& Out, Printer** Beg, Printer** End, + const char* nl, const char* sep) const { // Print Variable Bindings Out << "Variables:" << nl; @@ -264,6 +265,7 @@ void GRState::print(std::ostream& Out, CheckerStatePrinter* P, } // Print equality constraints. + // FIXME: Make just another printer do this. if (!ConstEq.isEmpty()) { @@ -278,6 +280,7 @@ void GRState::print(std::ostream& Out, CheckerStatePrinter* P, } // Print != constraints. + // FIXME: Make just another printer do this. if (!ConstNotEq.isEmpty()) { @@ -300,10 +303,8 @@ void GRState::print(std::ostream& Out, CheckerStatePrinter* P, } } - // Print checker-specific data. - - if (P && CheckerState) - P->PrintCheckerState(Out, CheckerState, nl, sep); + // Print checker-specific data. + for ( ; Beg != End ; ++Beg) (*Beg)->Print(Out, this, nl, sep); } |