[cfe-commits] r46580 - in /cfe/trunk: AST/CFG.cpp include/clang/AST/CFG.h

Ted Kremenek kremenek at apple.com
Wed Jan 30 15:02:42 PST 2008


Author: kremenek
Date: Wed Jan 30 17:02:42 2008
New Revision: 46580

URL: http://llvm.org/viewvc/llvm-project?rev=46580&view=rev
Log:
Added method "printTerminator" to CFGBlock so that external clients can
pretty-print a block's terminator.

When building CFGs, for IfStmts ('if'), we no longer add the ParenExpr
that is the subexpression of the IfStmt to the CFG; instead we add its
first descendant subexpression that is not a ParenExpr.

Modified:
    cfe/trunk/AST/CFG.cpp
    cfe/trunk/include/clang/AST/CFG.h

Modified: cfe/trunk/AST/CFG.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/AST/CFG.cpp?rev=46580&r1=46579&r2=46580&view=diff

==============================================================================
--- cfe/trunk/AST/CFG.cpp (original)
+++ cfe/trunk/AST/CFG.cpp Wed Jan 30 17:02:42 2008
@@ -523,7 +523,7 @@
   // Add the condition as the last statement in the new block.  This
   // may create new blocks as the condition may contain control-flow.  Any
   // newly created blocks will be pointed to be "Block".
-  return addStmt(I->getCond());
+  return addStmt(I->getCond()->IgnoreParens());
 }
   
     
@@ -1142,7 +1142,6 @@
   void VisitIfStmt(IfStmt* I) {
     OS << "if ";
     I->getCond()->printPretty(OS,Helper);
-    OS << "\n";
   }
   
   // Default case.
@@ -1155,42 +1154,38 @@
     if (Stmt* C = F->getCond()) C->printPretty(OS,Helper);
     OS << "; ";
     if (F->getInc()) OS << "...";
-    OS << ")\n";                                                       
+    OS << ")";
   }
   
   void VisitWhileStmt(WhileStmt* W) {
     OS << "while " ;
     if (Stmt* C = W->getCond()) C->printPretty(OS,Helper);
-    OS << "\n";
   }
   
   void VisitDoStmt(DoStmt* D) {
     OS << "do ... while ";
     if (Stmt* C = D->getCond()) C->printPretty(OS,Helper);
-    OS << '\n';
   }
   
   void VisitSwitchStmt(SwitchStmt* S) {
     OS << "switch ";
     S->getCond()->printPretty(OS,Helper);
-    OS << '\n';
   }
   
   void VisitConditionalOperator(ConditionalOperator* C) {
     C->getCond()->printPretty(OS,Helper);
-    OS << " ? ... : ...\n";  
+    OS << " ? ... : ...";  
   }
   
   void VisitChooseExpr(ChooseExpr* C) {
     OS << "__builtin_choose_expr( ";
     C->getCond()->printPretty(OS,Helper);
-    OS << " )\n";
+    OS << " )";
   }
   
   void VisitIndirectGotoStmt(IndirectGotoStmt* I) {
     OS << "goto *";
     I->getTarget()->printPretty(OS,Helper);
-    OS << '\n';
   }
   
   void VisitBinaryOperator(BinaryOperator* B) {
@@ -1203,10 +1198,10 @@
     
     switch (B->getOpcode()) {
       case BinaryOperator::LOr:
-        OS << " || ...\n";
+        OS << " || ...";
         return;
       case BinaryOperator::LAnd:
-        OS << " && ...\n";
+        OS << " && ...";
         return;
       default:
         assert(false && "Invalid logical operator.");
@@ -1215,7 +1210,6 @@
   
   void VisitExpr(Expr* E) {
     E->printPretty(OS,Helper);
-    OS << '\n';
   }                                                       
 };
   
@@ -1321,6 +1315,7 @@
     
     CFGBlockTerminatorPrint TPrinter(OS,Helper);
     TPrinter.Visit(const_cast<Stmt*>(B.getTerminator()));
+    OS << '\n';
   }
  
   if (print_edges) {
@@ -1392,6 +1387,13 @@
   print_block(OS, cfg, *this, &Helper, true);
 }
 
+/// printTerminator - A simple pretty printer of the terminator of a CFGBlock.
+void CFGBlock::printTerminator(std::ostream& OS) const {  
+  CFGBlockTerminatorPrint TPrinter(OS,NULL);
+  TPrinter.Visit(const_cast<Stmt*>(getTerminator()));
+}
+
+
 //===----------------------------------------------------------------------===//
 // CFG Graphviz Visualization
 //===----------------------------------------------------------------------===//

Modified: cfe/trunk/include/clang/AST/CFG.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/CFG.h?rev=46580&r1=46579&r2=46580&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/CFG.h (original)
+++ cfe/trunk/include/clang/AST/CFG.h Wed Jan 30 17:02:42 2008
@@ -166,6 +166,7 @@
   
   void dump(const CFG* cfg) const;
   void print(std::ostream& OS, const CFG* cfg) const;
+  void printTerminator(std::ostream& OS) const;
 };
   
 





More information about the cfe-commits mailing list