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: DOTMachineFuncInfo(const MachineFunction * F)25 DOTMachineFuncInfo(const MachineFunction *F) : F(F) {} 26 getFunction()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 93