| //===- GraphPrinter.h - Create a DOT output describing the Scop. ----------===// |
| // |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Create a DOT output describing the Scop. |
| // |
| // For each function a dot file is created that shows the control flow graph of |
| // the function and highlights the detected Scops. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef POLLY_SCOP_GRAPH_PRINTER_H |
| #define POLLY_SCOP_GRAPH_PRINTER_H |
| |
| #include "polly/ScopDetection.h" |
| #include "polly/Support/ScopLocation.h" |
| #include "llvm/Analysis/DOTGraphTraitsPass.h" |
| #include "llvm/Analysis/RegionInfo.h" |
| #include "llvm/Analysis/RegionIterator.h" |
| #include "llvm/Analysis/RegionPrinter.h" |
| #include "llvm/IR/PassManager.h" |
| |
| namespace llvm { |
| |
| template <> |
| struct GraphTraits<polly::ScopDetection *> : GraphTraits<RegionInfo *> { |
| static NodeRef getEntryNode(polly::ScopDetection *SD) { |
| return GraphTraits<RegionInfo *>::getEntryNode(SD->getRI()); |
| } |
| static nodes_iterator nodes_begin(polly::ScopDetection *SD) { |
| return nodes_iterator::begin(getEntryNode(SD)); |
| } |
| static nodes_iterator nodes_end(polly::ScopDetection *SD) { |
| return nodes_iterator::end(getEntryNode(SD)); |
| } |
| }; |
| |
| template <> |
| struct DOTGraphTraits<polly::ScopDetection *> : DOTGraphTraits<RegionNode *> { |
| DOTGraphTraits(bool isSimple = false) |
| : DOTGraphTraits<RegionNode *>(isSimple) {} |
| static std::string getGraphName(polly::ScopDetection *SD) { |
| return "Scop Graph"; |
| } |
| |
| std::string getEdgeAttributes(RegionNode *srcNode, |
| GraphTraits<RegionInfo *>::ChildIteratorType CI, |
| polly::ScopDetection *SD); |
| |
| std::string getNodeLabel(RegionNode *Node, polly::ScopDetection *SD) { |
| return DOTGraphTraits<RegionNode *>::getNodeLabel( |
| Node, reinterpret_cast<RegionNode *>(SD->getRI()->getTopLevelRegion())); |
| } |
| |
| static std::string escapeString(llvm::StringRef String); |
| |
| /// Print the cluster of the subregions. This groups the single basic blocks |
| /// and adds a different background color for each group. |
| static void printRegionCluster(polly::ScopDetection *SD, const Region *R, |
| raw_ostream &O, unsigned depth = 0); |
| |
| static void addCustomGraphFeatures(polly::ScopDetection *SD, |
| GraphWriter<polly::ScopDetection *> &GW); |
| }; |
| } // end namespace llvm |
| |
| namespace polly { |
| |
| struct ScopViewer final : llvm::DOTGraphTraitsViewer<ScopAnalysis, false> { |
| ScopViewer() : llvm::DOTGraphTraitsViewer<ScopAnalysis, false>("scops") {} |
| |
| bool processFunction(Function &F, const ScopDetection &SD) override; |
| }; |
| |
| struct ScopOnlyViewer final : llvm::DOTGraphTraitsViewer<ScopAnalysis, false> { |
| ScopOnlyViewer() |
| : llvm::DOTGraphTraitsViewer<ScopAnalysis, false>("scops-only") {} |
| }; |
| |
| struct ScopPrinter final : llvm::DOTGraphTraitsPrinter<ScopAnalysis, false> { |
| ScopPrinter() : llvm::DOTGraphTraitsPrinter<ScopAnalysis, false>("scops") {} |
| }; |
| |
| struct ScopOnlyPrinter final : llvm::DOTGraphTraitsPrinter<ScopAnalysis, true> { |
| ScopOnlyPrinter() |
| : llvm::DOTGraphTraitsPrinter<ScopAnalysis, true>("scopsonly") {} |
| }; |
| |
| } // end namespace polly |
| |
| #endif /* POLLY_SCOP_GRAPH_PRINTER_H */ |