diff options
| author | Mitch Phillips <mitchphillips@outlook.com> | 2017-11-14 22:43:13 +0000 | 
|---|---|---|
| committer | Mitch Phillips <mitchphillips@outlook.com> | 2017-11-14 22:43:13 +0000 | 
| commit | 02993892d81f256d1a4a61bb4886db3376a75644 (patch) | |
| tree | 34ba89032d0ee2746aeba55cac62a0e50ba5c905 /llvm/tools/llvm-cfi-verify/lib | |
| parent | e6201c8724dbce94969bc0b7f81e950cdbb6f742 (diff) | |
| download | bcm5719-llvm-02993892d81f256d1a4a61bb4886db3376a75644.tar.gz bcm5719-llvm-02993892d81f256d1a4a61bb4886db3376a75644.zip | |
[cfi-verify] Add DOT graph printing for GraphResult objects.
Allows users to view GraphResult objects in a DOT directed-graph format. This feature can be turned on through the --print-graphs flag.
Also enabled pretty-printing of instructions in output. Together these features make analysis of unprotected CF instructions much easier by providing a visual control flow graph.
Reviewers: pcc
Subscribers: llvm-commits, kcc, vlad.tsyrklevich
Differential Revision: https://reviews.llvm.org/D39819
llvm-svn: 318211
Diffstat (limited to 'llvm/tools/llvm-cfi-verify/lib')
| -rw-r--r-- | llvm/tools/llvm-cfi-verify/lib/FileAnalysis.cpp | 5 | ||||
| -rw-r--r-- | llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h | 4 | ||||
| -rw-r--r-- | llvm/tools/llvm-cfi-verify/lib/GraphBuilder.cpp | 24 | ||||
| -rw-r--r-- | llvm/tools/llvm-cfi-verify/lib/GraphBuilder.h | 3 | 
4 files changed, 36 insertions, 0 deletions
| diff --git a/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.cpp b/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.cpp index 42de8cb4f7d..8f3a6837cfa 100644 --- a/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.cpp +++ b/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.cpp @@ -273,6 +273,11 @@ FileAnalysis::validateCFIProtection(const GraphResult &Graph) const {    return CFIProtectionStatus::PROTECTED;  } +void FileAnalysis::printInstruction(const Instr &InstrMeta, +                                    raw_ostream &OS) const { +  Printer->printInst(&InstrMeta.Instruction, OS, "", *SubtargetInfo.get()); +} +  Error FileAnalysis::initialiseDisassemblyMembers() {    std::string TripleName = ObjectTriple.getTriple();    ArchName = ""; diff --git a/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h b/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h index dfeff13863b..820c3683540 100644 --- a/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h +++ b/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h @@ -145,6 +145,10 @@ public:    // flow instruction in this file.    CFIProtectionStatus validateCFIProtection(const GraphResult &Graph) const; +  // Prints an instruction to the provided stream using this object's pretty- +  // printers. +  void printInstruction(const Instr &InstrMeta, raw_ostream &OS) const; +  protected:    // Construct a blank object with the provided triple and features. Used in    // testing, where a sub class will dependency inject protected methods to diff --git a/llvm/tools/llvm-cfi-verify/lib/GraphBuilder.cpp b/llvm/tools/llvm-cfi-verify/lib/GraphBuilder.cpp index 7366ff0cf30..ff921713302 100644 --- a/llvm/tools/llvm-cfi-verify/lib/GraphBuilder.cpp +++ b/llvm/tools/llvm-cfi-verify/lib/GraphBuilder.cpp @@ -71,6 +71,30 @@ std::vector<uint64_t> GraphResult::flattenAddress(uint64_t Address) const {    return Addresses;  } +void printPairToDOT(const FileAnalysis &Analysis, raw_ostream &OS, +                          uint64_t From, uint64_t To) { +  OS << "  \"" << format_hex(From, 2) << ": "; +  Analysis.printInstruction(Analysis.getInstructionOrDie(From), OS); +  OS << "\" -> \"" << format_hex(To, 2) << ": "; +  Analysis.printInstruction(Analysis.getInstructionOrDie(To), OS); +  OS << "\"\n"; +} + +void GraphResult::printToDOT(const FileAnalysis &Analysis, +                             raw_ostream &OS) const { +  std::map<uint64_t, uint64_t> SortedIntermediateNodes( +      IntermediateNodes.begin(), IntermediateNodes.end()); +  OS << "digraph graph_" << format_hex(BaseAddress, 2) << " {\n"; +  for (const auto &KV : SortedIntermediateNodes) +    printPairToDOT(Analysis, OS, KV.first, KV.second); + +  for (auto &BranchNode : ConditionalBranchNodes) { +    for (auto &V : {BranchNode.Target, BranchNode.Fallthrough}) +      printPairToDOT(Analysis, OS, BranchNode.Address, V); +  } +  OS << "}\n"; +} +  GraphResult GraphBuilder::buildFlowGraph(const FileAnalysis &Analysis,                                           uint64_t Address) {    GraphResult Result; diff --git a/llvm/tools/llvm-cfi-verify/lib/GraphBuilder.h b/llvm/tools/llvm-cfi-verify/lib/GraphBuilder.h index 12d9c95e3cf..d1ce5096ed9 100644 --- a/llvm/tools/llvm-cfi-verify/lib/GraphBuilder.h +++ b/llvm/tools/llvm-cfi-verify/lib/GraphBuilder.h @@ -89,6 +89,9 @@ struct GraphResult {    // base. The provided address must be part of this graph, and must not be a    // conditional branch.    std::vector<uint64_t> flattenAddress(uint64_t Address) const; + +  // Print the DOT representation of this result. +  void printToDOT(const FileAnalysis &Analysis, raw_ostream &OS) const;  };  class GraphBuilder { | 

