r343160 - [analyzer] [NFC] Move the code for dumping the program point to ProgramPoint

George Karpenkov via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 26 18:46:19 PDT 2018


Author: george.karpenkov
Date: Wed Sep 26 18:46:18 2018
New Revision: 343160

URL: http://llvm.org/viewvc/llvm-project?rev=343160&view=rev
Log:
[analyzer] [NFC] Move the code for dumping the program point to ProgramPoint

So we can dump them outside of viewing the exploded grpah.

Differential Revision: https://reviews.llvm.org/D52583

Modified:
    cfe/trunk/include/clang/Analysis/ProgramPoint.h
    cfe/trunk/lib/Analysis/ProgramPoint.cpp
    cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp

Modified: cfe/trunk/include/clang/Analysis/ProgramPoint.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/ProgramPoint.h?rev=343160&r1=343159&r2=343160&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/ProgramPoint.h (original)
+++ cfe/trunk/include/clang/Analysis/ProgramPoint.h Wed Sep 26 18:46:18 2018
@@ -215,6 +215,12 @@ public:
     ID.AddPointer(getTag());
   }
 
+  void print(StringRef CR, llvm::raw_ostream &Out) const;
+
+  LLVM_DUMP_METHOD void dump() const {
+    return print(/*CR=*/"\n", llvm::errs());
+  }
+
   static ProgramPoint getProgramPoint(const Stmt *S, ProgramPoint::Kind K,
                                       const LocationContext *LC,
                                       const ProgramPointTag *tag);

Modified: cfe/trunk/lib/Analysis/ProgramPoint.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ProgramPoint.cpp?rev=343160&r1=343159&r2=343160&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/ProgramPoint.cpp (original)
+++ cfe/trunk/lib/Analysis/ProgramPoint.cpp Wed Sep 26 18:46:18 2018
@@ -43,6 +43,177 @@ ProgramPoint ProgramPoint::getProgramPoi
   }
 }
 
+static void printLocation(raw_ostream &Out, SourceLocation SLoc,
+                          const SourceManager &SM,
+                          StringRef CR,
+                          StringRef Postfix) {
+  if (SLoc.isFileID()) {
+    Out << CR << "line=" << SM.getExpansionLineNumber(SLoc)
+        << " col=" << SM.getExpansionColumnNumber(SLoc) << Postfix;
+  }
+}
+
+void ProgramPoint::print(StringRef CR, llvm::raw_ostream &Out) const {
+  const ASTContext &Context =
+      getLocationContext()->getAnalysisDeclContext()->getASTContext();
+  const SourceManager &SM = Context.getSourceManager();
+  switch (getKind()) {
+  case ProgramPoint::BlockEntranceKind:
+    Out << "Block Entrance: B"
+        << castAs<BlockEntrance>().getBlock()->getBlockID();
+    break;
+
+  case ProgramPoint::FunctionExitKind: {
+    auto FEP = getAs<FunctionExitPoint>();
+    Out << "Function Exit: B" << FEP->getBlock()->getBlockID();
+    if (const ReturnStmt *RS = FEP->getStmt()) {
+      Out << CR << " Return: S" << RS->getID(Context) << CR;
+      RS->printPretty(Out, /*helper=*/nullptr, Context.getPrintingPolicy(),
+                      /*Indentation=*/2, /*NewlineSymbol=*/CR);
+    }
+    break;
+  }
+  case ProgramPoint::BlockExitKind:
+    assert(false);
+    break;
+
+  case ProgramPoint::CallEnterKind:
+    Out << "CallEnter";
+    break;
+
+  case ProgramPoint::CallExitBeginKind:
+    Out << "CallExitBegin";
+    break;
+
+  case ProgramPoint::CallExitEndKind:
+    Out << "CallExitEnd";
+    break;
+
+  case ProgramPoint::PostStmtPurgeDeadSymbolsKind:
+    Out << "PostStmtPurgeDeadSymbols";
+    break;
+
+  case ProgramPoint::PreStmtPurgeDeadSymbolsKind:
+    Out << "PreStmtPurgeDeadSymbols";
+    break;
+
+  case ProgramPoint::EpsilonKind:
+    Out << "Epsilon Point";
+    break;
+
+  case ProgramPoint::LoopExitKind: {
+    LoopExit LE = castAs<LoopExit>();
+    Out << "LoopExit: " << LE.getLoopStmt()->getStmtClassName();
+    break;
+  }
+
+  case ProgramPoint::PreImplicitCallKind: {
+    ImplicitCallPoint PC = castAs<ImplicitCallPoint>();
+    Out << "PreCall: ";
+    PC.getDecl()->print(Out, Context.getLangOpts());
+    printLocation(Out, PC.getLocation(), SM, CR, /*Postfix=*/CR);
+    break;
+  }
+
+  case ProgramPoint::PostImplicitCallKind: {
+    ImplicitCallPoint PC = castAs<ImplicitCallPoint>();
+    Out << "PostCall: ";
+    PC.getDecl()->print(Out, Context.getLangOpts());
+    printLocation(Out, PC.getLocation(), SM, CR, /*Postfix=*/CR);
+    break;
+  }
+
+  case ProgramPoint::PostInitializerKind: {
+    Out << "PostInitializer: ";
+    const CXXCtorInitializer *Init = castAs<PostInitializer>().getInitializer();
+    if (const FieldDecl *FD = Init->getAnyMember())
+      Out << *FD;
+    else {
+      QualType Ty = Init->getTypeSourceInfo()->getType();
+      Ty = Ty.getLocalUnqualifiedType();
+      Ty.print(Out, Context.getLangOpts());
+    }
+    break;
+  }
+
+  case ProgramPoint::BlockEdgeKind: {
+    const BlockEdge &E = castAs<BlockEdge>();
+    Out << "Edge: (B" << E.getSrc()->getBlockID() << ", B"
+        << E.getDst()->getBlockID() << ')';
+
+    if (const Stmt *T = E.getSrc()->getTerminator()) {
+      SourceLocation SLoc = T->getBeginLoc();
+
+      Out << "\\|Terminator: ";
+      E.getSrc()->printTerminator(Out, Context.getLangOpts());
+      printLocation(Out, SLoc, SM, CR, /*Postfix=*/"");
+
+      if (isa<SwitchStmt>(T)) {
+        const Stmt *Label = E.getDst()->getLabel();
+
+        if (Label) {
+          if (const auto *C = dyn_cast<CaseStmt>(Label)) {
+            Out << CR << "case ";
+            if (C->getLHS())
+              C->getLHS()->printPretty(
+                  Out, nullptr, Context.getPrintingPolicy(),
+                  /*Indentation=*/0, /*NewlineSymbol=*/CR);
+
+            if (const Stmt *RHS = C->getRHS()) {
+              Out << " .. ";
+              RHS->printPretty(Out, nullptr, Context.getPrintingPolicy(),
+                               /*Indetation=*/0, /*NewlineSymbol=*/CR);
+            }
+
+            Out << ":";
+          } else {
+            assert(isa<DefaultStmt>(Label));
+            Out << CR << "default:";
+          }
+        } else
+          Out << CR << "(implicit) default:";
+      } else if (isa<IndirectGotoStmt>(T)) {
+        // FIXME
+      } else {
+        Out << CR << "Condition: ";
+        if (*E.getSrc()->succ_begin() == E.getDst())
+          Out << "true";
+        else
+          Out << "false";
+      }
+
+      Out << CR;
+    }
+
+    break;
+  }
+
+  default: {
+    const Stmt *S = castAs<StmtPoint>().getStmt();
+    assert(S != nullptr && "Expecting non-null Stmt");
+
+    Out << S->getStmtClassName() << " S" << S->getID(Context) << " <"
+        << (const void *)S << "> ";
+    S->printPretty(Out, /*helper=*/nullptr, Context.getPrintingPolicy(),
+                   /*Indentation=*/2, /*NewlineSymbol=*/CR);
+    printLocation(Out, S->getBeginLoc(), SM, CR, /*Postfix=*/"");
+
+    if (getAs<PreStmt>())
+      Out << CR << "PreStmt" << CR;
+    else if (getAs<PostLoad>())
+      Out << CR << "PostLoad" << CR;
+    else if (getAs<PostStore>())
+      Out << CR << "PostStore" << CR;
+    else if (getAs<PostLValue>())
+      Out << CR << "PostLValue" << CR;
+    else if (getAs<PostAllocatorCall>())
+      Out << CR << "PostAllocatorCall" << CR;
+
+    break;
+  }
+  }
+}
+
 SimpleProgramPointTag::SimpleProgramPointTag(StringRef MsgProvider,
                                              StringRef Msg)
   : Desc((MsgProvider + " : " + Msg).str()) {}

Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=343160&r1=343159&r2=343160&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Wed Sep 26 18:46:18 2018
@@ -2962,183 +2962,6 @@ struct DOTGraphTraits<ExplodedGraph*> :
     return {};
   }
 
-  // De-duplicate some source location pretty-printing.
-  static void printLocation(raw_ostream &Out,
-                            SourceLocation SLoc,
-                            const SourceManager &SM,
-                            StringRef Postfix="\\l") {
-    if (SLoc.isFileID()) {
-      Out << "\\lline="
-        << SM.getExpansionLineNumber(SLoc)
-        << " col="
-        << SM.getExpansionColumnNumber(SLoc)
-        << Postfix;
-    }
-  }
-
-  static void dumpProgramPoint(ProgramPoint Loc,
-                               const ASTContext &Context,
-                               llvm::raw_string_ostream &Out) {
-    const SourceManager &SM = Context.getSourceManager();
-    switch (Loc.getKind()) {
-    case ProgramPoint::BlockEntranceKind:
-      Out << "Block Entrance: B"
-          << Loc.castAs<BlockEntrance>().getBlock()->getBlockID();
-      break;
-
-    case ProgramPoint::FunctionExitKind: {
-      auto FEP = Loc.getAs<FunctionExitPoint>();
-      Out << "Function Exit: B"
-          << FEP->getBlock()->getBlockID();
-      if (const ReturnStmt *RS = FEP->getStmt()) {
-        Out << "\\l Return: S" << RS->getID(Context) << "\\l";
-        RS->printPretty(Out, /*helper=*/nullptr, Context.getPrintingPolicy(),
-                       /*Indentation=*/2, /*NewlineSymbol=*/"\\l");
-      }
-      break;
-    }
-    case ProgramPoint::BlockExitKind:
-      assert(false);
-      break;
-
-    case ProgramPoint::CallEnterKind:
-      Out << "CallEnter";
-      break;
-
-    case ProgramPoint::CallExitBeginKind:
-      Out << "CallExitBegin";
-      break;
-
-    case ProgramPoint::CallExitEndKind:
-      Out << "CallExitEnd";
-      break;
-
-    case ProgramPoint::PostStmtPurgeDeadSymbolsKind:
-      Out << "PostStmtPurgeDeadSymbols";
-      break;
-
-    case ProgramPoint::PreStmtPurgeDeadSymbolsKind:
-      Out << "PreStmtPurgeDeadSymbols";
-      break;
-
-    case ProgramPoint::EpsilonKind:
-      Out << "Epsilon Point";
-      break;
-
-    case ProgramPoint::LoopExitKind: {
-      LoopExit LE = Loc.castAs<LoopExit>();
-      Out << "LoopExit: " << LE.getLoopStmt()->getStmtClassName();
-      break;
-    }
-
-    case ProgramPoint::PreImplicitCallKind: {
-      ImplicitCallPoint PC = Loc.castAs<ImplicitCallPoint>();
-      Out << "PreCall: ";
-      PC.getDecl()->print(Out, Context.getLangOpts());
-      printLocation(Out, PC.getLocation(), SM);
-      break;
-    }
-
-    case ProgramPoint::PostImplicitCallKind: {
-      ImplicitCallPoint PC = Loc.castAs<ImplicitCallPoint>();
-      Out << "PostCall: ";
-      PC.getDecl()->print(Out, Context.getLangOpts());
-      printLocation(Out, PC.getLocation(), SM);
-      break;
-    }
-
-    case ProgramPoint::PostInitializerKind: {
-      Out << "PostInitializer: ";
-      const CXXCtorInitializer *Init =
-          Loc.castAs<PostInitializer>().getInitializer();
-      if (const FieldDecl *FD = Init->getAnyMember())
-        Out << *FD;
-      else {
-        QualType Ty = Init->getTypeSourceInfo()->getType();
-        Ty = Ty.getLocalUnqualifiedType();
-        Ty.print(Out, Context.getLangOpts());
-      }
-      break;
-    }
-
-    case ProgramPoint::BlockEdgeKind: {
-      const BlockEdge &E = Loc.castAs<BlockEdge>();
-      Out << "Edge: (B" << E.getSrc()->getBlockID() << ", B"
-          << E.getDst()->getBlockID() << ')';
-
-      if (const Stmt *T = E.getSrc()->getTerminator()) {
-        SourceLocation SLoc = T->getBeginLoc();
-
-        Out << "\\|Terminator: ";
-        E.getSrc()->printTerminator(Out, Context.getLangOpts());
-        printLocation(Out, SLoc, SM, /*Postfix=*/"");
-
-        if (isa<SwitchStmt>(T)) {
-          const Stmt *Label = E.getDst()->getLabel();
-
-          if (Label) {
-            if (const auto *C = dyn_cast<CaseStmt>(Label)) {
-              Out << "\\lcase ";
-              if (C->getLHS())
-                C->getLHS()->printPretty(
-                    Out, nullptr, Context.getPrintingPolicy(),
-                    /*Indentation=*/0, /*NewlineSymbol=*/"\\l");
-
-              if (const Stmt *RHS = C->getRHS()) {
-                Out << " .. ";
-                RHS->printPretty(Out, nullptr, Context.getPrintingPolicy(),
-                                 /*Indetation=*/0, /*NewlineSymbol=*/"\\l");
-              }
-
-              Out << ":";
-            } else {
-              assert(isa<DefaultStmt>(Label));
-              Out << "\\ldefault:";
-            }
-          } else
-            Out << "\\l(implicit) default:";
-        } else if (isa<IndirectGotoStmt>(T)) {
-          // FIXME
-        } else {
-          Out << "\\lCondition: ";
-          if (*E.getSrc()->succ_begin() == E.getDst())
-            Out << "true";
-          else
-            Out << "false";
-        }
-
-        Out << "\\l";
-      }
-
-      break;
-    }
-
-    default: {
-      const Stmt *S = Loc.castAs<StmtPoint>().getStmt();
-      assert(S != nullptr && "Expecting non-null Stmt");
-
-      Out << S->getStmtClassName() << " S"
-          << S->getID(Context) << " <" << (const void *)S << "> ";
-      S->printPretty(Out, /*helper=*/nullptr, Context.getPrintingPolicy(),
-                     /*Indentation=*/2, /*NewlineSymbol=*/"\\l");
-      printLocation(Out, S->getBeginLoc(), SM, /*Postfix=*/"");
-
-      if (Loc.getAs<PreStmt>())
-        Out << "\\lPreStmt\\l";
-      else if (Loc.getAs<PostLoad>())
-        Out << "\\lPostLoad\\l";
-      else if (Loc.getAs<PostStore>())
-        Out << "\\lPostStore\\l";
-      else if (Loc.getAs<PostLValue>())
-        Out << "\\lPostLValue\\l";
-      else if (Loc.getAs<PostAllocatorCall>())
-        Out << "\\lPostAllocatorCall\\l";
-
-      break;
-    }
-    }
-  }
-
   static bool isNodeHidden(const ExplodedNode *N) {
     return N->isTrivial();
   }
@@ -3156,12 +2979,11 @@ struct DOTGraphTraits<ExplodedGraph*> :
     }
 
     ProgramStateRef State = N->getState();
-    const ASTContext &Context = State->getStateManager().getContext();
 
     // Dump program point for all the previously skipped nodes.
     const ExplodedNode *OtherNode = FirstHiddenNode;
     while (true) {
-      dumpProgramPoint(OtherNode->getLocation(), Context, Out);
+      OtherNode->getLocation().print(/*CR=*/"\\l", Out);
 
       if (const ProgramPointTag *Tag = OtherNode->getLocation().getTag())
         Out << "\\lTag:" << Tag->getTagDescription();




More information about the cfe-commits mailing list