Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===-- MachineCFGPrinter.h -------------------------------------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
//===----------------------------------------------------------------------===//
10
 
11
#include "llvm/Analysis/CFGPrinter.h"
12
#include "llvm/CodeGen/MachineBasicBlock.h"
13
#include "llvm/CodeGen/MachineFunction.h"
14
#include "llvm/CodeGen/MachineInstr.h"
15
#include "llvm/Support/DOTGraphTraits.h"
16
 
17
namespace llvm {
18
 
19
template <class GraphType> struct GraphTraits;
20
class DOTMachineFuncInfo {
21
private:
22
  const MachineFunction *F;
23
 
24
public:
25
  DOTMachineFuncInfo(const MachineFunction *F) : F(F) {}
26
 
27
  const MachineFunction *getFunction() const { return this->F; }
28
};
29
 
30
template <>
31
struct GraphTraits<DOTMachineFuncInfo *>
32
    : public GraphTraits<const MachineBasicBlock *> {
33
  static NodeRef getEntryNode(DOTMachineFuncInfo *CFGInfo) {
34
    return &(CFGInfo->getFunction()->front());
35
  }
36
 
37
  // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
38
  using nodes_iterator = pointer_iterator<MachineFunction::const_iterator>;
39
 
40
  static nodes_iterator nodes_begin(DOTMachineFuncInfo *CFGInfo) {
41
    return nodes_iterator(CFGInfo->getFunction()->begin());
42
  }
43
 
44
  static nodes_iterator nodes_end(DOTMachineFuncInfo *CFGInfo) {
45
    return nodes_iterator(CFGInfo->getFunction()->end());
46
  }
47
 
48
  static size_t size(DOTMachineFuncInfo *CFGInfo) {
49
    return CFGInfo->getFunction()->size();
50
  }
51
};
52
 
53
template <>
54
struct DOTGraphTraits<DOTMachineFuncInfo *> : public DefaultDOTGraphTraits {
55
 
56
  DOTGraphTraits(bool isSimple = false) : DefaultDOTGraphTraits(isSimple) {}
57
 
58
  static void eraseComment(std::string &OutStr, unsigned &I, unsigned Idx) {
59
    OutStr.erase(OutStr.begin() + I, OutStr.begin() + Idx);
60
    --I;
61
  }
62
 
63
  static std::string getSimpleNodeLabel(const MachineBasicBlock *Node,
64
                                        DOTMachineFuncInfo *) {
65
    return SimpleNodeLabelString(Node);
66
  }
67
 
68
  static std::string getCompleteNodeLabel(
69
      const MachineBasicBlock *Node, DOTMachineFuncInfo *,
70
      function_ref<void(raw_string_ostream &, const MachineBasicBlock &)>
71
          HandleBasicBlock =
72
              [](raw_string_ostream &OS,
73
                 const MachineBasicBlock &Node) -> void { OS << Node; },
74
      function_ref<void(std::string &, unsigned &, unsigned)>
75
          HandleComment = eraseComment) {
76
    return CompleteNodeLabelString(Node, HandleBasicBlock, HandleComment);
77
  }
78
 
79
  std::string getNodeLabel(const MachineBasicBlock *Node,
80
                           DOTMachineFuncInfo *CFGInfo) {
81
    if (isSimple())
82
      return getSimpleNodeLabel(Node, CFGInfo);
83
 
84
    return getCompleteNodeLabel(Node, CFGInfo);
85
  }
86
 
87
  static std::string getGraphName(DOTMachineFuncInfo *CFGInfo) {
88
    return "Machine CFG for '" + CFGInfo->getFunction()->getName().str() +
89
           "' function";
90
  }
91
};
92
} // namespace llvm