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
17namespace llvm {
18
19template <class GraphType> struct GraphTraits;
20class DOTMachineFuncInfo {
21private:
22 const MachineFunction *F;
23
24public:
25 DOTMachineFuncInfo(const MachineFunction *F) : F(F) {}
26
27 const MachineFunction *getFunction() const { return this->F; }
28};
29
30template <>
31struct 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
53template <>
54struct 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(first: OutStr.begin() + I, last: 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
93

source code of llvm/include/llvm/CodeGen/MachineCFGPrinter.h