Some parts of the code have to distinguish between live and postmortem threads to figure out how to get some data, e.g. thread trace buffers. This makes the code less generic and more error prone. An example of that is that we have two different decoders: LiveThreadDecoder and PostMortemThreadDecoder. They exist because getting the trace bufer is different for each case. The problem doesn't stop there. Soon we'll have even more kinds of data, like the context switch trace, whose fetching will be different for live and post- mortem processes. As a way to fix this, I'm creating a common API for accessing thread data, which is able to figure out how to handle the postmortem and live cases on behalf of the caller. As a result of that, I was able to eliminate the two decoders and unify them into a simpler one. Not only that, our TraceSave functionality only worked for live threads, but now it can also work for postmortem processes, which might be useful now, but it might in the future. This common API is OnThreadBinaryDataRead. More information in the inline documentation. Differential Revision: https://reviews.llvm.org/D123281
54 lines
1.6 KiB
C++
54 lines
1.6 KiB
C++
//===-- ThreadDecoder.h --======---------------------------------*- C++ -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_SOURCE_PLUGINS_TRACE_THREAD_DECODER_H
|
|
#define LLDB_SOURCE_PLUGINS_TRACE_THREAD_DECODER_H
|
|
|
|
#include "intel-pt.h"
|
|
|
|
#include "DecodedThread.h"
|
|
#include "forward-declarations.h"
|
|
#include "lldb/Target/Process.h"
|
|
#include "lldb/Utility/FileSpec.h"
|
|
|
|
namespace lldb_private {
|
|
namespace trace_intel_pt {
|
|
|
|
/// Class that handles the decoding of a thread and caches the result.
|
|
class ThreadDecoder {
|
|
public:
|
|
/// \param[in] thread_sp
|
|
/// The thread whose trace buffer will be decoded.
|
|
///
|
|
/// \param[in] trace
|
|
/// The main Trace object who owns this decoder and its data.
|
|
ThreadDecoder(const lldb::ThreadSP &thread_sp, TraceIntelPT &trace);
|
|
|
|
/// Decode the thread and store the result internally, to avoid
|
|
/// recomputations.
|
|
///
|
|
/// \return
|
|
/// A \a DecodedThread instance.
|
|
DecodedThreadSP Decode();
|
|
|
|
ThreadDecoder(const ThreadDecoder &other) = delete;
|
|
ThreadDecoder &operator=(const ThreadDecoder &other) = delete;
|
|
|
|
private:
|
|
DecodedThreadSP DoDecode();
|
|
|
|
lldb::ThreadSP m_thread_sp;
|
|
TraceIntelPT &m_trace;
|
|
llvm::Optional<DecodedThreadSP> m_decoded_thread;
|
|
};
|
|
|
|
} // namespace trace_intel_pt
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_SOURCE_PLUGINS_TRACE_THREAD_DECODER_H
|