94 lines · c
1//===-- TraceCursorIntelPT.h ------------------------------------*- C++ -*-===//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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_TRACECURSORINTELPT_H10#define LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_TRACECURSORINTELPT_H11 12#include "ThreadDecoder.h"13#include <optional>14 15namespace lldb_private {16namespace trace_intel_pt {17 18class TraceCursorIntelPT : public TraceCursor {19public:20 TraceCursorIntelPT(21 lldb::ThreadSP thread_sp, DecodedThreadSP decoded_thread_sp,22 const std::optional<LinuxPerfZeroTscConversion> &tsc_conversion,23 std::optional<uint64_t> beginning_of_time_nanos);24 25 bool Seek(int64_t offset, lldb::TraceCursorSeekType origin) override;26 27 void Next() override;28 29 bool HasValue() const override;30 31 llvm::StringRef GetError() const override;32 33 lldb::addr_t GetLoadAddress() const override;34 35 lldb::TraceEvent GetEventType() const override;36 37 lldb::cpu_id_t GetCPU() const override;38 39 std::optional<uint64_t> GetHWClock() const override;40 41 lldb::TraceItemKind GetItemKind() const override;42 43 bool GoToId(lldb::user_id_t id) override;44 45 lldb::user_id_t GetId() const override;46 47 bool HasId(lldb::user_id_t id) const override;48 49 std::optional<double> GetWallClockTime() const override;50 51 std::optional<std::string> GetSyncPointMetadata() const override;52 53private:54 /// Clear the current TSC and nanoseconds ranges if after moving they are not55 /// valid anymore.56 void ClearTimingRangesIfInvalid();57 58 /// Get or calculate the TSC range that includes the current trace item.59 const std::optional<DecodedThread::TSCRange> &GetTSCRange() const;60 61 /// Get or calculate the TSC range that includes the current trace item.62 const std::optional<DecodedThread::NanosecondsRange> &63 GetNanosecondsRange() const;64 65 /// Storage of the actual instructions66 DecodedThreadSP m_decoded_thread_sp;67 /// Internal instruction index currently pointing at.68 int64_t m_pos;69 70 /// Timing information and cached values.71 /// \{72 73 /// TSC -> nanos conversion utility. \a std::nullopt if not available at all.74 std::optional<LinuxPerfZeroTscConversion> m_tsc_conversion;75 /// Lowest nanoseconds timestamp seen in any thread trace, \a std::nullopt if76 /// not available at all.77 std::optional<uint64_t> m_beginning_of_time_nanos;78 /// Range of trace items with the same TSC that includes the current trace79 /// item, \a std::nullopt if not calculated or not available.80 std::optional<DecodedThread::TSCRange> mutable m_tsc_range;81 bool mutable m_tsc_range_calculated = false;82 /// Range of trace items with the same non-interpolated timestamps in83 /// nanoseconds that includes the current trace item, \a std::nullopt if not84 /// calculated or not available.85 std::optional<DecodedThread::NanosecondsRange> mutable m_nanoseconds_range;86 bool mutable m_nanoseconds_range_calculated = false;87 /// \}88};89 90} // namespace trace_intel_pt91} // namespace lldb_private92 93#endif // LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_TRACECURSORINTELPT_H94