summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2011-07-25 23:04:36 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2011-07-25 23:04:36 +0000
commit853b0fd623491ef7dafeed20ee15897e3b95d82c (patch)
treede14442a2e9a2939967097b4b26cc70754c79558 /tools
parentf0080016c64b784ca6eb402d43e323642505b395 (diff)
downloadllvm-853b0fd623491ef7dafeed20ee15897e3b95d82c.tar.gz
llvm-853b0fd623491ef7dafeed20ee15897e3b95d82c.tar.bz2
llvm-853b0fd623491ef7dafeed20ee15897e3b95d82c.tar.xz
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')
-rw-r--r--tools/llvm-objdump/MCFunction.cpp2
-rw-r--r--tools/llvm-objdump/llvm-objdump.cpp21
2 files changed, 21 insertions, 2 deletions
diff --git a/tools/llvm-objdump/MCFunction.cpp b/tools/llvm-objdump/MCFunction.cpp
index 4a4f9d5e50..66c6c4cba4 100644
--- a/tools/llvm-objdump/MCFunction.cpp
+++ b/tools/llvm-objdump/MCFunction.cpp
@@ -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));
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";