12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- //===- BlockIndexer.cpp - FDR Block Indexing VIsitor ----------------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // An implementation of the RecordVisitor which generates a mapping between a
- // thread and a range of records representing a block.
- //
- //===----------------------------------------------------------------------===//
- #include "llvm/XRay/BlockIndexer.h"
- namespace llvm {
- namespace xray {
- Error BlockIndexer::visit(BufferExtents &) { return Error::success(); }
- Error BlockIndexer::visit(WallclockRecord &R) {
- CurrentBlock.Records.push_back(&R);
- CurrentBlock.WallclockTime = &R;
- return Error::success();
- }
- Error BlockIndexer::visit(NewCPUIDRecord &R) {
- CurrentBlock.Records.push_back(&R);
- return Error::success();
- }
- Error BlockIndexer::visit(TSCWrapRecord &R) {
- CurrentBlock.Records.push_back(&R);
- return Error::success();
- }
- Error BlockIndexer::visit(CustomEventRecord &R) {
- CurrentBlock.Records.push_back(&R);
- return Error::success();
- }
- Error BlockIndexer::visit(CustomEventRecordV5 &R) {
- CurrentBlock.Records.push_back(&R);
- return Error::success();
- }
- Error BlockIndexer::visit(TypedEventRecord &R) {
- CurrentBlock.Records.push_back(&R);
- return Error::success();
- }
- Error BlockIndexer::visit(CallArgRecord &R) {
- CurrentBlock.Records.push_back(&R);
- return Error::success();
- }
- Error BlockIndexer::visit(PIDRecord &R) {
- CurrentBlock.ProcessID = R.pid();
- CurrentBlock.Records.push_back(&R);
- return Error::success();
- }
- Error BlockIndexer::visit(NewBufferRecord &R) {
- if (!CurrentBlock.Records.empty())
- if (auto E = flush())
- return E;
- CurrentBlock.ThreadID = R.tid();
- CurrentBlock.Records.push_back(&R);
- return Error::success();
- }
- Error BlockIndexer::visit(EndBufferRecord &R) {
- CurrentBlock.Records.push_back(&R);
- return Error::success();
- }
- Error BlockIndexer::visit(FunctionRecord &R) {
- CurrentBlock.Records.push_back(&R);
- return Error::success();
- }
- Error BlockIndexer::flush() {
- Index::iterator It;
- std::tie(It, std::ignore) =
- Indices.insert({{CurrentBlock.ProcessID, CurrentBlock.ThreadID}, {}});
- It->second.push_back({CurrentBlock.ProcessID, CurrentBlock.ThreadID,
- CurrentBlock.WallclockTime,
- std::move(CurrentBlock.Records)});
- CurrentBlock.ProcessID = 0;
- CurrentBlock.ThreadID = 0;
- CurrentBlock.Records = {};
- CurrentBlock.WallclockTime = nullptr;
- return Error::success();
- }
- } // namespace xray
- } // namespace llvm
|