1 //===-- SBTrace.cpp ---------------------------------------------*- 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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "SBReproducerPrivate.h" 10 #include "lldb/Target/Process.h" 11 12 #include "lldb/API/SBTrace.h" 13 #include "lldb/API/SBTraceOptions.h" 14 15 #include <memory> 16 17 using namespace lldb; 18 using namespace lldb_private; 19 20 class TraceImpl { 21 public: 22 lldb::user_id_t uid; 23 }; 24 25 lldb::ProcessSP SBTrace::GetSP() const { return m_opaque_wp.lock(); } 26 27 size_t SBTrace::GetTraceData(SBError &error, void *buf, size_t size, 28 size_t offset, lldb::tid_t thread_id) { 29 ProcessSP process_sp(GetSP()); 30 llvm::MutableArrayRef<uint8_t> buffer(static_cast<uint8_t *>(buf), size); 31 error.Clear(); 32 33 if (!process_sp) { 34 error.SetErrorString("invalid process"); 35 } else { 36 error.SetError( 37 process_sp->GetData(GetTraceUID(), thread_id, buffer, offset)); 38 } 39 return buffer.size(); 40 } 41 42 size_t SBTrace::GetMetaData(SBError &error, void *buf, size_t size, 43 size_t offset, lldb::tid_t thread_id) { 44 ProcessSP process_sp(GetSP()); 45 llvm::MutableArrayRef<uint8_t> buffer(static_cast<uint8_t *>(buf), size); 46 error.Clear(); 47 48 if (!process_sp) { 49 error.SetErrorString("invalid process"); 50 } else { 51 error.SetError( 52 process_sp->GetMetaData(GetTraceUID(), thread_id, buffer, offset)); 53 } 54 return buffer.size(); 55 } 56 57 void SBTrace::StopTrace(SBError &error, lldb::tid_t thread_id) { 58 LLDB_RECORD_METHOD(void, SBTrace, StopTrace, (lldb::SBError &, lldb::tid_t), 59 error, thread_id); 60 61 ProcessSP process_sp(GetSP()); 62 error.Clear(); 63 64 if (!process_sp) { 65 error.SetErrorString("invalid process"); 66 return; 67 } 68 error.SetError(process_sp->StopTrace(GetTraceUID(), thread_id)); 69 } 70 71 void SBTrace::GetTraceConfig(SBTraceOptions &options, SBError &error) { 72 LLDB_RECORD_METHOD(void, SBTrace, GetTraceConfig, 73 (lldb::SBTraceOptions &, lldb::SBError &), options, error); 74 75 ProcessSP process_sp(GetSP()); 76 error.Clear(); 77 78 if (!process_sp) { 79 error.SetErrorString("invalid process"); 80 } else { 81 error.SetError(process_sp->GetTraceConfig(GetTraceUID(), 82 *(options.m_traceoptions_sp))); 83 } 84 } 85 86 lldb::user_id_t SBTrace::GetTraceUID() { 87 LLDB_RECORD_METHOD_NO_ARGS(lldb::user_id_t, SBTrace, GetTraceUID); 88 89 if (m_trace_impl_sp) 90 return m_trace_impl_sp->uid; 91 return LLDB_INVALID_UID; 92 } 93 94 void SBTrace::SetTraceUID(lldb::user_id_t uid) { 95 if (m_trace_impl_sp) 96 m_trace_impl_sp->uid = uid; 97 } 98 99 SBTrace::SBTrace() { 100 LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBTrace); 101 102 m_trace_impl_sp = std::make_shared<TraceImpl>(); 103 if (m_trace_impl_sp) 104 m_trace_impl_sp->uid = LLDB_INVALID_UID; 105 } 106 107 void SBTrace::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; } 108 109 bool SBTrace::IsValid() { 110 LLDB_RECORD_METHOD_NO_ARGS(bool, SBTrace, IsValid); 111 112 if (!m_trace_impl_sp) 113 return false; 114 if (!GetSP()) 115 return false; 116 return true; 117 } 118