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