Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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
  93.