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 | |
parent | f0080016c64b784ca6eb402d43e323642505b395 (diff) | |
download | external_llvm-853b0fd623491ef7dafeed20ee15897e3b95d82c.zip external_llvm-853b0fd623491ef7dafeed20ee15897e3b95d82c.tar.gz external_llvm-853b0fd623491ef7dafeed20ee15897e3b95d82c.tar.bz2 |
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
-rw-r--r-- | tools/llvm-objdump/MCFunction.cpp | 2 | ||||
-rw-r--r-- | tools/llvm-objdump/llvm-objdump.cpp | 21 |
2 files changed, 21 insertions, 2 deletions
diff --git a/tools/llvm-objdump/MCFunction.cpp b/tools/llvm-objdump/MCFunction.cpp index 4a4f9d5..66c6c4c 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 f4c1ccd..9954926 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"; |