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