| //===- BlockIndexer.cpp - FDR Block Indexing VIsitor ----------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // 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 &) { |
| if (CurrentState == State::ThreadIDFound) { |
| Index::iterator It; |
| std::tie(It, std::ignore) = |
| Indices.insert({{CurrentBlock.ProcessID, CurrentBlock.ThreadID}, {}}); |
| It->second.push_back({CurrentBlock.ProcessID, CurrentBlock.ThreadID, |
| std::move(CurrentBlock.Records)}); |
| CurrentBlock.ProcessID = 0; |
| CurrentBlock.ThreadID = 0; |
| CurrentBlock.Records = {}; |
| } |
| CurrentState = State::ExtentsFound; |
| return Error::success(); |
| } |
| |
| Error BlockIndexer::visit(WallclockRecord &R) { |
| CurrentBlock.Records.push_back(&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(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) { |
| CurrentState = State::ThreadIDFound; |
| CurrentBlock.ThreadID = R.tid(); |
| CurrentBlock.Records.push_back(&R); |
| return Error::success(); |
| } |
| |
| Error BlockIndexer::visit(EndBufferRecord &R) { |
| CurrentState = State::SeekExtents; |
| CurrentBlock.Records.push_back(&R); |
| return Error::success(); |
| } |
| |
| Error BlockIndexer::visit(FunctionRecord &R) { |
| CurrentBlock.Records.push_back(&R); |
| return Error::success(); |
| } |
| |
| Error BlockIndexer::flush() { |
| CurrentState = State::SeekExtents; |
| Index::iterator It; |
| std::tie(It, std::ignore) = |
| Indices.insert({{CurrentBlock.ProcessID, CurrentBlock.ThreadID}, {}}); |
| It->second.push_back({CurrentBlock.ProcessID, CurrentBlock.ThreadID, |
| std::move(CurrentBlock.Records)}); |
| CurrentBlock.ProcessID = 0; |
| CurrentBlock.ThreadID = 0; |
| CurrentBlock.Records = {}; |
| return Error::success(); |
| } |
| |
| } // namespace xray |
| } // namespace llvm |