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