| //===-- SBTrace.cpp ---------------------------------------------*- 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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "SBReproducerPrivate.h" | |
| #include "lldb/Target/Process.h" | |
| #include "lldb/API/SBTrace.h" | |
| #include "lldb/API/SBTraceOptions.h" | |
| #include <memory> | |
| using namespace lldb; | |
| using namespace lldb_private; | |
| class TraceImpl { | |
| public: | |
| lldb::user_id_t uid; | |
| }; | |
| lldb::ProcessSP SBTrace::GetSP() const { return m_opaque_wp.lock(); } | |
| size_t SBTrace::GetTraceData(SBError &error, void *buf, size_t size, | |
| size_t offset, lldb::tid_t thread_id) { | |
| LLDB_RECORD_DUMMY(size_t, SBTrace, GetTraceData, | |
| (lldb::SBError &, void *, size_t, size_t, lldb::tid_t), | |
| error, buf, size, offset, thread_id); | |
| ProcessSP process_sp(GetSP()); | |
| llvm::MutableArrayRef<uint8_t> buffer(static_cast<uint8_t *>(buf), size); | |
| error.Clear(); | |
| if (!process_sp) { | |
| error.SetErrorString("invalid process"); | |
| } else { | |
| error.SetError( | |
| process_sp->GetData(GetTraceUID(), thread_id, buffer, offset)); | |
| } | |
| return buffer.size(); | |
| } | |
| size_t SBTrace::GetMetaData(SBError &error, void *buf, size_t size, | |
| size_t offset, lldb::tid_t thread_id) { | |
| LLDB_RECORD_DUMMY(size_t, SBTrace, GetMetaData, | |
| (lldb::SBError &, void *, size_t, size_t, lldb::tid_t), | |
| error, buf, size, offset, thread_id); | |
| ProcessSP process_sp(GetSP()); | |
| llvm::MutableArrayRef<uint8_t> buffer(static_cast<uint8_t *>(buf), size); | |
| error.Clear(); | |
| if (!process_sp) { | |
| error.SetErrorString("invalid process"); | |
| } else { | |
| error.SetError( | |
| process_sp->GetMetaData(GetTraceUID(), thread_id, buffer, offset)); | |
| } | |
| return buffer.size(); | |
| } | |
| void SBTrace::StopTrace(SBError &error, lldb::tid_t thread_id) { | |
| LLDB_RECORD_METHOD(void, SBTrace, StopTrace, (lldb::SBError &, lldb::tid_t), | |
| error, thread_id); | |
| ProcessSP process_sp(GetSP()); | |
| error.Clear(); | |
| if (!process_sp) { | |
| error.SetErrorString("invalid process"); | |
| return; | |
| } | |
| error.SetError(process_sp->StopTrace(GetTraceUID(), thread_id)); | |
| } | |
| void SBTrace::GetTraceConfig(SBTraceOptions &options, SBError &error) { | |
| LLDB_RECORD_METHOD(void, SBTrace, GetTraceConfig, | |
| (lldb::SBTraceOptions &, lldb::SBError &), options, error); | |
| ProcessSP process_sp(GetSP()); | |
| error.Clear(); | |
| if (!process_sp) { | |
| error.SetErrorString("invalid process"); | |
| } else { | |
| error.SetError(process_sp->GetTraceConfig(GetTraceUID(), | |
| *(options.m_traceoptions_sp))); | |
| } | |
| } | |
| lldb::user_id_t SBTrace::GetTraceUID() { | |
| LLDB_RECORD_METHOD_NO_ARGS(lldb::user_id_t, SBTrace, GetTraceUID); | |
| if (m_trace_impl_sp) | |
| return m_trace_impl_sp->uid; | |
| return LLDB_INVALID_UID; | |
| } | |
| void SBTrace::SetTraceUID(lldb::user_id_t uid) { | |
| if (m_trace_impl_sp) | |
| m_trace_impl_sp->uid = uid; | |
| } | |
| SBTrace::SBTrace() { | |
| LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBTrace); | |
| m_trace_impl_sp = std::make_shared<TraceImpl>(); | |
| if (m_trace_impl_sp) | |
| m_trace_impl_sp->uid = LLDB_INVALID_UID; | |
| } | |
| void SBTrace::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; } | |
| bool SBTrace::IsValid() { | |
| LLDB_RECORD_METHOD_NO_ARGS(bool, SBTrace, IsValid); | |
| return this->operator bool(); | |
| } | |
| SBTrace::operator bool() const { | |
| LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBTrace, operator bool); | |
| if (!m_trace_impl_sp) | |
| return false; | |
| if (!GetSP()) | |
| return false; | |
| return true; | |
| } | |
| namespace lldb_private { | |
| namespace repro { | |
| template <> | |
| void RegisterMethods<SBTrace>(Registry &R) { | |
| LLDB_REGISTER_METHOD(void, SBTrace, StopTrace, | |
| (lldb::SBError &, lldb::tid_t)); | |
| LLDB_REGISTER_METHOD(void, SBTrace, GetTraceConfig, | |
| (lldb::SBTraceOptions &, lldb::SBError &)); | |
| LLDB_REGISTER_METHOD(lldb::user_id_t, SBTrace, GetTraceUID, ()); | |
| LLDB_REGISTER_CONSTRUCTOR(SBTrace, ()); | |
| LLDB_REGISTER_METHOD(bool, SBTrace, IsValid, ()); | |
| LLDB_REGISTER_METHOD_CONST(bool, SBTrace, operator bool, ()); | |
| } | |
| } | |
| } |