1*b5893f02SDimitry Andric //===- BlockPrinter.cpp - FDR Block Pretty Printer Implementation --------===//
2*b5893f02SDimitry Andric //
3*b5893f02SDimitry Andric //                     The LLVM Compiler Infrastructure
4*b5893f02SDimitry Andric //
5*b5893f02SDimitry Andric // This file is distributed under the University of Illinois Open Source
6*b5893f02SDimitry Andric // License. See LICENSE.TXT for details.
7*b5893f02SDimitry Andric //
8*b5893f02SDimitry Andric //===----------------------------------------------------------------------===//
9*b5893f02SDimitry Andric #include "llvm/XRay/BlockPrinter.h"
10*b5893f02SDimitry Andric 
11*b5893f02SDimitry Andric namespace llvm {
12*b5893f02SDimitry Andric namespace xray {
13*b5893f02SDimitry Andric 
visit(BufferExtents & R)14*b5893f02SDimitry Andric Error BlockPrinter::visit(BufferExtents &R) {
15*b5893f02SDimitry Andric   OS << "\n[New Block]\n";
16*b5893f02SDimitry Andric   CurrentState = State::Preamble;
17*b5893f02SDimitry Andric   return RP.visit(R);
18*b5893f02SDimitry Andric }
19*b5893f02SDimitry Andric 
20*b5893f02SDimitry Andric // Preamble printing.
visit(NewBufferRecord & R)21*b5893f02SDimitry Andric Error BlockPrinter::visit(NewBufferRecord &R) {
22*b5893f02SDimitry Andric   if (CurrentState == State::Start)
23*b5893f02SDimitry Andric     OS << "\n[New Block]\n";
24*b5893f02SDimitry Andric 
25*b5893f02SDimitry Andric   OS << "Preamble: \n";
26*b5893f02SDimitry Andric   CurrentState = State::Preamble;
27*b5893f02SDimitry Andric   return RP.visit(R);
28*b5893f02SDimitry Andric }
29*b5893f02SDimitry Andric 
visit(WallclockRecord & R)30*b5893f02SDimitry Andric Error BlockPrinter::visit(WallclockRecord &R) {
31*b5893f02SDimitry Andric   CurrentState = State::Preamble;
32*b5893f02SDimitry Andric   return RP.visit(R);
33*b5893f02SDimitry Andric }
34*b5893f02SDimitry Andric 
visit(PIDRecord & R)35*b5893f02SDimitry Andric Error BlockPrinter::visit(PIDRecord &R) {
36*b5893f02SDimitry Andric   CurrentState = State::Preamble;
37*b5893f02SDimitry Andric   return RP.visit(R);
38*b5893f02SDimitry Andric }
39*b5893f02SDimitry Andric 
40*b5893f02SDimitry Andric // Metadata printing.
visit(NewCPUIDRecord & R)41*b5893f02SDimitry Andric Error BlockPrinter::visit(NewCPUIDRecord &R) {
42*b5893f02SDimitry Andric   if (CurrentState == State::Preamble)
43*b5893f02SDimitry Andric     OS << "\nBody:\n";
44*b5893f02SDimitry Andric   if (CurrentState == State::Function)
45*b5893f02SDimitry Andric     OS << "\nMetadata: ";
46*b5893f02SDimitry Andric   CurrentState = State::Metadata;
47*b5893f02SDimitry Andric   OS << " ";
48*b5893f02SDimitry Andric   auto E = RP.visit(R);
49*b5893f02SDimitry Andric   return E;
50*b5893f02SDimitry Andric }
51*b5893f02SDimitry Andric 
visit(TSCWrapRecord & R)52*b5893f02SDimitry Andric Error BlockPrinter::visit(TSCWrapRecord &R) {
53*b5893f02SDimitry Andric   if (CurrentState == State::Function)
54*b5893f02SDimitry Andric     OS << "\nMetadata:";
55*b5893f02SDimitry Andric   CurrentState = State::Metadata;
56*b5893f02SDimitry Andric   OS << " ";
57*b5893f02SDimitry Andric   auto E = RP.visit(R);
58*b5893f02SDimitry Andric   return E;
59*b5893f02SDimitry Andric }
60*b5893f02SDimitry Andric 
61*b5893f02SDimitry Andric // Custom events will be rendered like "function" events.
visit(CustomEventRecord & R)62*b5893f02SDimitry Andric Error BlockPrinter::visit(CustomEventRecord &R) {
63*b5893f02SDimitry Andric   if (CurrentState == State::Metadata)
64*b5893f02SDimitry Andric     OS << "\n";
65*b5893f02SDimitry Andric   CurrentState = State::CustomEvent;
66*b5893f02SDimitry Andric   OS << "*  ";
67*b5893f02SDimitry Andric   auto E = RP.visit(R);
68*b5893f02SDimitry Andric   return E;
69*b5893f02SDimitry Andric }
70*b5893f02SDimitry Andric 
visit(CustomEventRecordV5 & R)71*b5893f02SDimitry Andric Error BlockPrinter::visit(CustomEventRecordV5 &R) {
72*b5893f02SDimitry Andric   if (CurrentState == State::Metadata)
73*b5893f02SDimitry Andric     OS << "\n";
74*b5893f02SDimitry Andric   CurrentState = State::CustomEvent;
75*b5893f02SDimitry Andric   OS << "*  ";
76*b5893f02SDimitry Andric   auto E = RP.visit(R);
77*b5893f02SDimitry Andric   return E;
78*b5893f02SDimitry Andric }
79*b5893f02SDimitry Andric 
visit(TypedEventRecord & R)80*b5893f02SDimitry Andric Error BlockPrinter::visit(TypedEventRecord &R) {
81*b5893f02SDimitry Andric   if (CurrentState == State::Metadata)
82*b5893f02SDimitry Andric     OS << "\n";
83*b5893f02SDimitry Andric   CurrentState = State::CustomEvent;
84*b5893f02SDimitry Andric   OS << "*  ";
85*b5893f02SDimitry Andric   auto E = RP.visit(R);
86*b5893f02SDimitry Andric   return E;
87*b5893f02SDimitry Andric }
88*b5893f02SDimitry Andric 
89*b5893f02SDimitry Andric // Function call printing.
visit(FunctionRecord & R)90*b5893f02SDimitry Andric Error BlockPrinter::visit(FunctionRecord &R) {
91*b5893f02SDimitry Andric   if (CurrentState == State::Metadata)
92*b5893f02SDimitry Andric     OS << "\n";
93*b5893f02SDimitry Andric   CurrentState = State::Function;
94*b5893f02SDimitry Andric   OS << "-  ";
95*b5893f02SDimitry Andric   auto E = RP.visit(R);
96*b5893f02SDimitry Andric   return E;
97*b5893f02SDimitry Andric }
98*b5893f02SDimitry Andric 
visit(CallArgRecord & R)99*b5893f02SDimitry Andric Error BlockPrinter::visit(CallArgRecord &R) {
100*b5893f02SDimitry Andric   CurrentState = State::Arg;
101*b5893f02SDimitry Andric   OS << " : ";
102*b5893f02SDimitry Andric   auto E = RP.visit(R);
103*b5893f02SDimitry Andric   return E;
104*b5893f02SDimitry Andric }
105*b5893f02SDimitry Andric 
visit(EndBufferRecord & R)106*b5893f02SDimitry Andric Error BlockPrinter::visit(EndBufferRecord &R) {
107*b5893f02SDimitry Andric     CurrentState = State::End;
108*b5893f02SDimitry Andric     OS << " *** ";
109*b5893f02SDimitry Andric     auto E = RP.visit(R);
110*b5893f02SDimitry Andric     return E;
111*b5893f02SDimitry Andric }
112*b5893f02SDimitry Andric 
113*b5893f02SDimitry Andric } // namespace xray
114*b5893f02SDimitry Andric } // namespace llvm
115