xref: /freebsd-src/contrib/llvm-project/llvm/tools/llvm-xray/xray-graph-diff.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
1*0b57cec5SDimitry Andric //===-- xray-graph-diff.h - XRay Graph Diff Renderer ------------*- C++ -*-===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric //
9*0b57cec5SDimitry Andric // Generate a DOT file to represent the difference between the function call
10*0b57cec5SDimitry Andric // graph of two differnent traces.
11*0b57cec5SDimitry Andric //
12*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
13*0b57cec5SDimitry Andric 
14*0b57cec5SDimitry Andric #ifndef XRAY_GRAPH_DIFF_H
15*0b57cec5SDimitry Andric #define XRAY_GRAPH_DIFF_H
16*0b57cec5SDimitry Andric 
17*0b57cec5SDimitry Andric #include "xray-graph.h"
18*0b57cec5SDimitry Andric #include "llvm/XRay/Graph.h"
19*0b57cec5SDimitry Andric 
20*0b57cec5SDimitry Andric namespace llvm {
21*0b57cec5SDimitry Andric namespace xray {
22*0b57cec5SDimitry Andric 
23*0b57cec5SDimitry Andric // This class creates a graph representing the difference between two
24*0b57cec5SDimitry Andric // xray-graphs And allows you to print it to a dot file, with optional color
25*0b57cec5SDimitry Andric // coding.
26*0b57cec5SDimitry Andric class GraphDiffRenderer {
27*0b57cec5SDimitry Andric   static const int N = 2;
28*0b57cec5SDimitry Andric 
29*0b57cec5SDimitry Andric public:
30*0b57cec5SDimitry Andric   using StatType = GraphRenderer::StatType;
31*0b57cec5SDimitry Andric   using TimeStat = GraphRenderer::TimeStat;
32*0b57cec5SDimitry Andric 
33*0b57cec5SDimitry Andric   using GREdgeValueType = GraphRenderer::GraphT::EdgeValueType;
34*0b57cec5SDimitry Andric   using GRVertexValueType = GraphRenderer::GraphT::VertexValueType;
35*0b57cec5SDimitry Andric 
36*0b57cec5SDimitry Andric   struct EdgeAttribute {
37*0b57cec5SDimitry Andric     std::array<const GREdgeValueType *, N> CorrEdgePtr = {};
38*0b57cec5SDimitry Andric   };
39*0b57cec5SDimitry Andric 
40*0b57cec5SDimitry Andric   struct VertexAttribute {
41*0b57cec5SDimitry Andric     std::array<const GRVertexValueType *, N> CorrVertexPtr = {};
42*0b57cec5SDimitry Andric   };
43*0b57cec5SDimitry Andric 
44*0b57cec5SDimitry Andric   using GraphT = Graph<VertexAttribute, EdgeAttribute, StringRef>;
45*0b57cec5SDimitry Andric 
46*0b57cec5SDimitry Andric   class Factory {
47*0b57cec5SDimitry Andric     std::array<std::reference_wrapper<const GraphRenderer::GraphT>, N> G;
48*0b57cec5SDimitry Andric 
49*0b57cec5SDimitry Andric   public:
Factory(Ts &...Args)50*0b57cec5SDimitry Andric     template <typename... Ts> Factory(Ts &... Args) : G{{Args...}} {}
51*0b57cec5SDimitry Andric 
52*0b57cec5SDimitry Andric     Expected<GraphDiffRenderer> getGraphDiffRenderer();
53*0b57cec5SDimitry Andric   };
54*0b57cec5SDimitry Andric 
55*0b57cec5SDimitry Andric private:
56*0b57cec5SDimitry Andric   GraphT G;
57*0b57cec5SDimitry Andric 
58*0b57cec5SDimitry Andric   GraphDiffRenderer() = default;
59*0b57cec5SDimitry Andric 
60*0b57cec5SDimitry Andric public:
61*0b57cec5SDimitry Andric   void exportGraphAsDOT(raw_ostream &OS, StatType EdgeLabel = StatType::NONE,
62*0b57cec5SDimitry Andric                         StatType EdgeColor = StatType::NONE,
63*0b57cec5SDimitry Andric                         StatType VertexLabel = StatType::NONE,
64*0b57cec5SDimitry Andric                         StatType VertexColor = StatType::NONE,
65*0b57cec5SDimitry Andric                         int TruncLen = 40);
66*0b57cec5SDimitry Andric 
getGraph()67*0b57cec5SDimitry Andric   const GraphT &getGraph() { return G; }
68*0b57cec5SDimitry Andric };
69*0b57cec5SDimitry Andric } // namespace xray
70*0b57cec5SDimitry Andric } // namespace llvm
71*0b57cec5SDimitry Andric 
72*0b57cec5SDimitry Andric #endif
73