diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2011-07-25 23:04:36 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2011-07-25 23:04:36 +0000 |
commit | 853b0fd623491ef7dafeed20ee15897e3b95d82c (patch) | |
tree | de14442a2e9a2939967097b4b26cc70754c79558 /tools/llvm-objdump/llvm-objdump.cpp | |
parent | f0080016c64b784ca6eb402d43e323642505b395 (diff) |
llvm-objdump: Ignore unreachable blocks when printing the CFG.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136000 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r-- | tools/llvm-objdump/llvm-objdump.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index f4c1ccdf7c..99549266c2 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -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"; |