1//===- BlockIndexer.h - FDR Block Indexing Visitor ------------------------===// 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// An implementation of the RecordVisitor which generates a mapping between a 10// thread and a range of records representing a block. 11// 12//===----------------------------------------------------------------------===// 13#ifndef LLVM_LIB_XRAY_BLOCKINDEXER_H_ 14#define LLVM_LIB_XRAY_BLOCKINDEXER_H_ 15 16#include "llvm/ADT/DenseMap.h" 17#include "llvm/XRay/FDRRecords.h" 18#include <cstdint> 19#include <vector> 20 21namespace llvm { 22namespace xray { 23 24// The BlockIndexer will gather all related records associated with a 25// process+thread and group them by 'Block'. 26class BlockIndexer : public RecordVisitor { 27public: 28 struct Block { 29 uint64_t ProcessID; 30 int32_t ThreadID; 31 WallclockRecord *WallclockTime; 32 std::vector<Record *> Records; 33 }; 34 35 // This maps the process + thread combination to a sequence of blocks. 36 using Index = DenseMap<std::pair<uint64_t, int32_t>, std::vector<Block>>; 37 38private: 39 Index &Indices; 40 41 Block CurrentBlock{0, 0, nullptr, {}}; 42 43public: 44 explicit BlockIndexer(Index &I) : RecordVisitor(), Indices(I) {} 45 46 Error visit(BufferExtents &) override; 47 Error visit(WallclockRecord &) override; 48 Error visit(NewCPUIDRecord &) override; 49 Error visit(TSCWrapRecord &) override; 50 Error visit(CustomEventRecord &) override; 51 Error visit(CallArgRecord &) override; 52 Error visit(PIDRecord &) override; 53 Error visit(NewBufferRecord &) override; 54 Error visit(EndBufferRecord &) override; 55 Error visit(FunctionRecord &) override; 56 Error visit(CustomEventRecordV5 &) override; 57 Error visit(TypedEventRecord &) override; 58 59 /// The flush() function will clear out the current state of the visitor, to 60 /// allow for explicitly flushing a block's records to the currently 61 /// recognized thread and process combination. 62 Error flush(); 63}; 64 65} // namespace xray 66} // namespace llvm 67 68#endif // LLVM_LIB_XRAY_BLOCKINDEXER_H_ 69