aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-01-30 23:02:42 +0000
committerTed Kremenek <kremenek@apple.com>2008-01-30 23:02:42 +0000
commita292585207adbf6dcf6347db3526a7ec861d8eac (patch)
treeb7b7d2e00e09c4a2813e430760debaa795917e38
parent890d93eec45f2ba720dce98e34a1a904697ae842 (diff)
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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46580 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--AST/CFG.cpp26
-rw-r--r--include/clang/AST/CFG.h1
2 files changed, 15 insertions, 12 deletions
diff --git a/AST/CFG.cpp b/AST/CFG.cpp
index 8e2d95017c..51b8cb5240 100644
--- a/AST/CFG.cpp
+++ b/AST/CFG.cpp
@@ -523,7 +523,7 @@ CFGBlock* CFGBuilder::VisitIfStmt(IfStmt* I) {
// 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 @@ public:
void VisitIfStmt(IfStmt* I) {
OS << "if ";
I->getCond()->printPretty(OS,Helper);
- OS << "\n";
}
// Default case.
@@ -1155,42 +1154,38 @@ public:
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 @@ public:
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 @@ public:
void VisitExpr(Expr* E) {
E->printPretty(OS,Helper);
- OS << '\n';
}
};
@@ -1321,6 +1315,7 @@ void print_block(std::ostream& OS, const CFG* cfg, const CFGBlock& B,
CFGBlockTerminatorPrint TPrinter(OS,Helper);
TPrinter.Visit(const_cast<Stmt*>(B.getTerminator()));
+ OS << '\n';
}
if (print_edges) {
@@ -1392,6 +1387,13 @@ void CFGBlock::print(std::ostream& OS, const CFG* cfg) const {
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
//===----------------------------------------------------------------------===//
diff --git a/include/clang/AST/CFG.h b/include/clang/AST/CFG.h
index 95f9cfdb8c..146af84be8 100644
--- a/include/clang/AST/CFG.h
+++ b/include/clang/AST/CFG.h
@@ -166,6 +166,7 @@ public:
void dump(const CFG* cfg) const;
void print(std::ostream& OS, const CFG* cfg) const;
+ void printTerminator(std::ostream& OS) const;
};