diff options
Diffstat (limited to 'lldb/source/API/SBTrace.cpp')
| -rw-r--r-- | lldb/source/API/SBTrace.cpp | 147 | 
1 files changed, 147 insertions, 0 deletions
| diff --git a/lldb/source/API/SBTrace.cpp b/lldb/source/API/SBTrace.cpp new file mode 100644 index 000000000000..9b871e6781d9 --- /dev/null +++ b/lldb/source/API/SBTrace.cpp @@ -0,0 +1,147 @@ +//===-- 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, ()); +} + +} +} | 
