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_XRAY_BLOCKINDEXER_H 14 #define LLVM_XRAY_BLOCKINDEXER_H 15 16 #include "llvm/ADT/DenseMap.h" 17 #include "llvm/XRay/FDRRecords.h" 18 #include <cstdint> 19 #include <vector> 20 21 namespace llvm { 22 namespace xray { 23 24 // The BlockIndexer will gather all related records associated with a 25 // process+thread and group them by 'Block'. 26 class BlockIndexer : public RecordVisitor { 27 public: 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 38 private: 39 Index &Indices; 40 41 Block CurrentBlock{0, 0, nullptr, {}}; 42 43 public: BlockIndexer(Index & I)44 explicit BlockIndexer(Index &I) : 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_XRAY_BLOCKINDEXER_H 69