Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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) : 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.