diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/XRay/BlockVerifier.cpp | 182 | ||||
-rw-r--r-- | llvm/lib/XRay/CMakeLists.txt | 1 |
2 files changed, 0 insertions, 183 deletions
diff --git a/llvm/lib/XRay/BlockVerifier.cpp b/llvm/lib/XRay/BlockVerifier.cpp deleted file mode 100644 index ea4ba9c6d86..00000000000 --- a/llvm/lib/XRay/BlockVerifier.cpp +++ /dev/null @@ -1,182 +0,0 @@ -//===- BlockVerifier.cpp - FDR Block Verifier -----------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -#include "llvm/XRay/BlockVerifier.h" -#include "llvm/Support/Error.h" - -namespace llvm { -namespace xray { -namespace { - -constexpr unsigned long long mask(BlockVerifier::State S) { - return 1uLL << static_cast<std::size_t>(S); -} - -constexpr std::size_t number(BlockVerifier::State S) { - return static_cast<std::size_t>(S); -} - -StringRef recordToString(BlockVerifier::State R) { - switch (R) { - case BlockVerifier::State::BufferExtents: - return "BufferExtents"; - case BlockVerifier::State::NewBuffer: - return "NewBuffer"; - case BlockVerifier::State::WallClockTime: - return "WallClockTime"; - case BlockVerifier::State::PIDEntry: - return "PIDEntry"; - case BlockVerifier::State::NewCPUId: - return "NewCPUId"; - case BlockVerifier::State::TSCWrap: - return "TSCWrap"; - case BlockVerifier::State::CustomEvent: - return "CustomEvent"; - case BlockVerifier::State::Function: - return "Function"; - case BlockVerifier::State::CallArg: - return "CallArg"; - case BlockVerifier::State::EndOfBuffer: - return "EndOfBuffer"; - case BlockVerifier::State::StateMax: - case BlockVerifier::State::Unknown: - return "Unknown"; - } -} - -} // namespace - -Error BlockVerifier::transition(State To) { - using ToSet = std::bitset<number(State::StateMax)>; - static constexpr std::array<const std::tuple<State, ToSet>, - number(State::StateMax)> - TransitionTable{{{State::Unknown, - {mask(State::BufferExtents) | mask(State::NewBuffer)}}, - - {State::BufferExtents, {mask(State::NewBuffer)}}, - - {State::NewBuffer, {mask(State::WallClockTime)}}, - - {State::WallClockTime, - {mask(State::PIDEntry) | mask(State::NewCPUId)}}, - - {State::PIDEntry, {mask(State::NewCPUId)}}, - - {State::NewCPUId, - {mask(State::NewCPUId) | mask(State::TSCWrap) | - mask(State::CustomEvent) | mask(State::Function) | - mask(State::EndOfBuffer)}}, - - {State::TSCWrap, - {mask(State::TSCWrap) | mask(State::NewCPUId) | - mask(State::CustomEvent) | mask(State::Function) | - mask(State::EndOfBuffer)}}, - - {State::CustomEvent, - {mask(State::CustomEvent) | mask(State::TSCWrap) | - mask(State::NewCPUId) | mask(State::Function) | - mask(State::EndOfBuffer)}}, - - {State::Function, - {mask(State::Function) | mask(State::TSCWrap) | - mask(State::NewCPUId) | mask(State::CustomEvent) | - mask(State::CallArg) | mask(State::EndOfBuffer)}}, - - {State::CallArg, - {mask(State::CallArg) | mask(State::Function) | - mask(State::TSCWrap) | mask(State::NewCPUId) | - mask(State::CustomEvent) | mask(State::EndOfBuffer)}}, - - {State::EndOfBuffer, {}}}}; - - if (CurrentRecord >= State::StateMax) - return createStringError( - std::make_error_code(std::errc::executable_format_error), - "BUG (BlockVerifier): Cannot find transition table entry for %s, " - "transitioning to %s.", - recordToString(CurrentRecord).data(), recordToString(To).data()); - - // If we're at an EndOfBuffer record, we ignore anything that follows that - // isn't a NewBuffer record. - if (CurrentRecord == State::EndOfBuffer && To != State::NewBuffer) - return Error::success(); - - auto &Mapping = TransitionTable[number(CurrentRecord)]; - auto &From = std::get<0>(Mapping); - auto &Destinations = std::get<1>(Mapping); - assert(From == CurrentRecord && "BUG: Wrong index for record mapping."); - if ((Destinations & ToSet(mask(To))) == 0) - return createStringError( - std::make_error_code(std::errc::executable_format_error), - "BlockVerifier: Invalid transition from %s to %s.", - recordToString(CurrentRecord).data(), recordToString(To).data()); - - CurrentRecord = To; - return Error::success(); -} // namespace xray - -Error BlockVerifier::visit(BufferExtents &) { - return transition(State::BufferExtents); -} - -Error BlockVerifier::visit(WallclockRecord &) { - return transition(State::WallClockTime); -} - -Error BlockVerifier::visit(NewCPUIDRecord &) { - return transition(State::NewCPUId); -} - -Error BlockVerifier::visit(TSCWrapRecord &) { - return transition(State::TSCWrap); -} - -Error BlockVerifier::visit(CustomEventRecord &) { - return transition(State::CustomEvent); -} - -Error BlockVerifier::visit(CallArgRecord &) { - return transition(State::CallArg); -} - -Error BlockVerifier::visit(PIDRecord &) { return transition(State::PIDEntry); } - -Error BlockVerifier::visit(NewBufferRecord &) { - return transition(State::NewBuffer); -} - -Error BlockVerifier::visit(EndBufferRecord &) { - return transition(State::EndOfBuffer); -} - -Error BlockVerifier::visit(FunctionRecord &) { - return transition(State::Function); -} - -Error BlockVerifier::verify() { - // The known terminal conditions are the following: - switch (CurrentRecord) { - case State::EndOfBuffer: - case State::NewCPUId: - case State::CustomEvent: - case State::Function: - case State::CallArg: - case State::TSCWrap: - return Error::success(); - default: - return createStringError( - std::make_error_code(std::errc::executable_format_error), - "BlockVerifier: Invalid terminal condition %s, malformed block.", - recordToString(CurrentRecord).data()); - } -} - -void BlockVerifier::reset() { CurrentRecord = State::Unknown; } - -} // namespace xray -} // namespace llvm diff --git a/llvm/lib/XRay/CMakeLists.txt b/llvm/lib/XRay/CMakeLists.txt index a37f2c12fbb..ab6e0373c9e 100644 --- a/llvm/lib/XRay/CMakeLists.txt +++ b/llvm/lib/XRay/CMakeLists.txt @@ -1,6 +1,5 @@ add_llvm_library(LLVMXRay BlockIndexer.cpp - BlockVerifier.cpp FDRRecordProducer.cpp FDRRecords.cpp FDRTraceWriter.cpp |