]> granicus.if.org Git - clang/commitdiff
Add an exceptional edge from the try terminated block to the outer EH
authorMike Stump <mrs@apple.com>
Wed, 20 Jan 2010 01:15:34 +0000 (01:15 +0000)
committerMike Stump <mrs@apple.com>
Wed, 20 Jan 2010 01:15:34 +0000 (01:15 +0000)
context (try or the Exit block) when there isn't a catch (...).

Improve CFG printing for catch (...).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93962 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CFG.cpp

index 6508c351f0e77969a063ff0f6567841f66260ca5..33c3f551dd93746001911b3a27fb94bf08758e41 100644 (file)
@@ -1599,6 +1599,7 @@ CFGBlock *CFGBuilder::VisitCXXTryStmt(CXXTryStmt *Terminator) {
   } else TrySuccessor = Succ;
 
   // Save the current "try" context.
+  CFGBlock *PrevTryTerminatedBlock = TryTerminatedBlock;
   SaveAndRestore<CFGBlock*> save_try(TryTerminatedBlock);
 
   // Create a new block that will contain the try statement.
@@ -1606,10 +1607,14 @@ CFGBlock *CFGBuilder::VisitCXXTryStmt(CXXTryStmt *Terminator) {
   // Add the terminator in the try block.
   TryTerminatedBlock->setTerminator(Terminator);
 
+  bool HasCatchAll = false;
   for (unsigned h = 0; h <Terminator->getNumHandlers(); ++h) {
     // The code after the try is the implicit successor.
     Succ = TrySuccessor;
     CXXCatchStmt *CS = Terminator->getHandler(h);
+    if (CS->getExceptionDecl() == 0) {
+      HasCatchAll = true;
+    }
     Block = NULL;
     CFGBlock *CatchBlock = VisitCXXCatchStmt(CS);
     if (CatchBlock == 0)
@@ -1618,6 +1623,12 @@ CFGBlock *CFGBuilder::VisitCXXTryStmt(CXXTryStmt *Terminator) {
     // statement.
     AddSuccessor(TryTerminatedBlock, CatchBlock);
   }
+  if (!HasCatchAll) {
+    if (PrevTryTerminatedBlock)
+      AddSuccessor(TryTerminatedBlock, PrevTryTerminatedBlock);
+    else
+      AddSuccessor(TryTerminatedBlock, &cfg->getExit());
+  }
 
   // The code after the try is the implicit successor.
   Succ = TrySuccessor;
@@ -2037,8 +2048,11 @@ static void print_block(llvm::raw_ostream& OS, const CFG* cfg,
       OS << "default";
     else if (CXXCatchStmt *CS = dyn_cast<CXXCatchStmt>(Label)) {
       OS << "catch (";
-      CS->getExceptionDecl()->print(OS, PrintingPolicy(Helper->getLangOpts()),
-        0);
+      if (CS->getExceptionDecl())
+        CS->getExceptionDecl()->print(OS, PrintingPolicy(Helper->getLangOpts()),
+                                      0);
+      else
+        OS << "...";
       OS << ")";
 
     } else