llvm-objdump: Ignore unreachable blocks when printing the CFG.
authorBenjamin Kramer <benny.kra@googlemail.com>
Mon, 25 Jul 2011 23:04:36 +0000 (23:04 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Mon, 25 Jul 2011 23:04:36 +0000 (23:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136000 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvm-objdump/MCFunction.cpp
tools/llvm-objdump/llvm-objdump.cpp

index 4a4f9d5e50a0cc882a288ec29c54a6428fd14bf8..66c6c4cba496b56a32247a496b43b42da450d385 100644 (file)
@@ -54,6 +54,8 @@ MCFunction::createFunctionFromMC(StringRef Name, const MCDisassembler *DisAsm,
           }
         }
         Splits.insert(Index+Size);
+      } else if (Desc.isReturn()) {
+        Splits.insert(Index+Size);
       }
 
       Instructions.push_back(MCDecodedInst(Index, Size, Inst));
index f4c1ccdf7c1987118e56844d094a3171bda54830..99549266c24179027315487187f92eb8a82e6ffc 100644 (file)
@@ -27,6 +27,7 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/Format.h"
+#include "llvm/Support/GraphWriter.h"
 #include "llvm/Support/Host.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/MemoryBuffer.h"
@@ -280,12 +281,28 @@ static void DisassembleInput(const StringRef &Filename) {
         Out << "digraph " << f.getName() << " {\n";
         Out << "graph [ rankdir = \"LR\" ];\n";
         for (MCFunction::iterator i = f.begin(), e = f.end(); i != e; ++i) {
+          bool hasPreds = false;
+          // Only print blocks that have predecessors.
+          // FIXME: Slow.
+          for (MCFunction::iterator pi = f.begin(), pe = f.end(); pi != pe;
+               ++pi)
+            for (pi->second->contains(&i->second)) {
+              hasPreds = true;
+              break;
+            }
+
+          if (!hasPreds && i != f.begin())
+            continue;
+
           Out << '"' << (uintptr_t)&i->second << "\" [ label=\"<a>";
           // Print instructions.
           for (unsigned ii = 0, ie = i->second.getInsts().size(); ii != ie;
                ++ii) {
-            IP->printInst(&i->second.getInsts()[ii].Inst, Out);
-            Out << '|';
+            // Escape special chars and print the instruction in mnemonic form.
+            std::string Str;
+            raw_string_ostream OS(Str);
+            IP->printInst(&i->second.getInsts()[ii].Inst, OS);
+            Out << DOT::EscapeString(OS.str()) << '|';
           }
           Out << "<o>\" shape=\"record\" ];\n";