Viewing file: MachineCFGPrinter.h (3.02 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===-- MachineCFGPrinter.h -------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // //===----------------------------------------------------------------------===//
#include "llvm/Analysis/CFGPrinter.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/Support/DOTGraphTraits.h"
namespace llvm {
template <class GraphType> struct GraphTraits; class DOTMachineFuncInfo { private: const MachineFunction *F;
public: DOTMachineFuncInfo(const MachineFunction *F) : F(F) {}
const MachineFunction *getFunction() const { return this->F; } };
template <> struct GraphTraits<DOTMachineFuncInfo *> : public GraphTraits<const MachineBasicBlock *> { static NodeRef getEntryNode(DOTMachineFuncInfo *CFGInfo) { return &(CFGInfo->getFunction()->front()); }
// nodes_iterator/begin/end - Allow iteration over all nodes in the graph using nodes_iterator = pointer_iterator<MachineFunction::const_iterator>;
static nodes_iterator nodes_begin(DOTMachineFuncInfo *CFGInfo) { return nodes_iterator(CFGInfo->getFunction()->begin()); }
static nodes_iterator nodes_end(DOTMachineFuncInfo *CFGInfo) { return nodes_iterator(CFGInfo->getFunction()->end()); }
static size_t size(DOTMachineFuncInfo *CFGInfo) { return CFGInfo->getFunction()->size(); } };
template <> struct DOTGraphTraits<DOTMachineFuncInfo *> : public DefaultDOTGraphTraits {
DOTGraphTraits(bool isSimple = false) : DefaultDOTGraphTraits(isSimple) {}
static void eraseComment(std::string &OutStr, unsigned &I, unsigned Idx) { OutStr.erase(OutStr.begin() + I, OutStr.begin() + Idx); --I; }
static std::string getSimpleNodeLabel(const MachineBasicBlock *Node, DOTMachineFuncInfo *) { return SimpleNodeLabelString(Node); }
static std::string getCompleteNodeLabel( const MachineBasicBlock *Node, DOTMachineFuncInfo *, function_ref<void(raw_string_ostream &, const MachineBasicBlock &)> HandleBasicBlock = [](raw_string_ostream &OS, const MachineBasicBlock &Node) -> void { OS << Node; }, function_ref<void(std::string &, unsigned &, unsigned)> HandleComment = eraseComment) { return CompleteNodeLabelString(Node, HandleBasicBlock, HandleComment); }
std::string getNodeLabel(const MachineBasicBlock *Node, DOTMachineFuncInfo *CFGInfo) { if (isSimple()) return getSimpleNodeLabel(Node, CFGInfo);
return getCompleteNodeLabel(Node, CFGInfo); }
static std::string getGraphName(DOTMachineFuncInfo *CFGInfo) { return "Machine CFG for '" + CFGInfo->getFunction()->getName().str() + "' function"; } }; } // namespace llvm
|