Home | History | Annotate | Line # | Download | only in XRay
      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:
     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_XRAY_BLOCKINDEXER_H
     69