1 //===-- xray-graph-diff.h - XRay Graph Diff Renderer ------------*- 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 // Generate a DOT file to represent the difference between the function call 10 // graph of two differnent traces. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef XRAY_GRAPH_DIFF_H 15 #define XRAY_GRAPH_DIFF_H 16 17 #include "xray-graph.h" 18 #include "llvm/XRay/Graph.h" 19 20 namespace llvm { 21 namespace xray { 22 23 // This class creates a graph representing the difference between two 24 // xray-graphs And allows you to print it to a dot file, with optional color 25 // coding. 26 class GraphDiffRenderer { 27 static const int N = 2; 28 29 public: 30 using StatType = GraphRenderer::StatType; 31 using TimeStat = GraphRenderer::TimeStat; 32 33 using GREdgeValueType = GraphRenderer::GraphT::EdgeValueType; 34 using GRVertexValueType = GraphRenderer::GraphT::VertexValueType; 35 36 struct EdgeAttribute { 37 std::array<const GREdgeValueType *, N> CorrEdgePtr = {}; 38 }; 39 40 struct VertexAttribute { 41 std::array<const GRVertexValueType *, N> CorrVertexPtr = {}; 42 }; 43 44 using GraphT = Graph<VertexAttribute, EdgeAttribute, StringRef>; 45 46 class Factory { 47 std::array<std::reference_wrapper<const GraphRenderer::GraphT>, N> G; 48 49 public: 50 template <typename... Ts> Factory(Ts &... Args) : G{{Args...}} {} 51 52 Expected<GraphDiffRenderer> getGraphDiffRenderer(); 53 }; 54 55 private: 56 GraphT G; 57 58 GraphDiffRenderer() = default; 59 60 public: 61 void exportGraphAsDOT(raw_ostream &OS, StatType EdgeLabel = StatType::NONE, 62 StatType EdgeColor = StatType::NONE, 63 StatType VertexLabel = StatType::NONE, 64 StatType VertexColor = StatType::NONE, 65 int TruncLen = 40); 66 67 const GraphT &getGraph() { return G; } 68 }; 69 } // namespace xray 70 } // namespace llvm 71 72 #endif 73