1*d5d8d91cSRavitheja Addepally //===-- SBTrace.cpp ---------------------------------------------*- C++ -*-===// 2*d5d8d91cSRavitheja Addepally // 3*d5d8d91cSRavitheja Addepally // The LLVM Compiler Infrastructure 4*d5d8d91cSRavitheja Addepally // 5*d5d8d91cSRavitheja Addepally // This file is distributed under the University of Illinois Open Source 6*d5d8d91cSRavitheja Addepally // License. See LICENSE.TXT for details. 7*d5d8d91cSRavitheja Addepally // 8*d5d8d91cSRavitheja Addepally //===----------------------------------------------------------------------===// 9*d5d8d91cSRavitheja Addepally 10*d5d8d91cSRavitheja Addepally #include "lldb/Utility/Log.h" 11*d5d8d91cSRavitheja Addepally #include "lldb/Target/Process.h" 12*d5d8d91cSRavitheja Addepally 13*d5d8d91cSRavitheja Addepally #include "lldb/API/SBTrace.h" 14*d5d8d91cSRavitheja Addepally #include "lldb/API/SBTraceOptions.h" 15*d5d8d91cSRavitheja Addepally 16*d5d8d91cSRavitheja Addepally using namespace lldb; 17*d5d8d91cSRavitheja Addepally using namespace lldb_private; 18*d5d8d91cSRavitheja Addepally 19*d5d8d91cSRavitheja Addepally class TraceImpl { 20*d5d8d91cSRavitheja Addepally public: 21*d5d8d91cSRavitheja Addepally lldb::user_id_t uid; 22*d5d8d91cSRavitheja Addepally }; 23*d5d8d91cSRavitheja Addepally 24*d5d8d91cSRavitheja Addepally lldb::ProcessSP SBTrace::GetSP() const { return m_opaque_wp.lock(); } 25*d5d8d91cSRavitheja Addepally 26*d5d8d91cSRavitheja Addepally size_t SBTrace::GetTraceData(SBError &error, void *buf, size_t size, 27*d5d8d91cSRavitheja Addepally size_t offset, lldb::tid_t thread_id) { 28*d5d8d91cSRavitheja Addepally size_t bytes_read = 0; 29*d5d8d91cSRavitheja Addepally ProcessSP process_sp(GetSP()); 30*d5d8d91cSRavitheja Addepally Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 31*d5d8d91cSRavitheja Addepally error.Clear(); 32*d5d8d91cSRavitheja Addepally 33*d5d8d91cSRavitheja Addepally if (!process_sp) { 34*d5d8d91cSRavitheja Addepally error.SetErrorString("invalid process"); 35*d5d8d91cSRavitheja Addepally } else { 36*d5d8d91cSRavitheja Addepally bytes_read = process_sp->GetData(GetTraceUID(), thread_id, error.ref(), buf, 37*d5d8d91cSRavitheja Addepally size, offset); 38*d5d8d91cSRavitheja Addepally LLDB_LOG(log, "SBTrace::bytes_read - %" PRIx64, bytes_read); 39*d5d8d91cSRavitheja Addepally } 40*d5d8d91cSRavitheja Addepally return bytes_read; 41*d5d8d91cSRavitheja Addepally } 42*d5d8d91cSRavitheja Addepally 43*d5d8d91cSRavitheja Addepally size_t SBTrace::GetMetaData(SBError &error, void *buf, size_t size, 44*d5d8d91cSRavitheja Addepally size_t offset, lldb::tid_t thread_id) { 45*d5d8d91cSRavitheja Addepally size_t bytes_read = 0; 46*d5d8d91cSRavitheja Addepally ProcessSP process_sp(GetSP()); 47*d5d8d91cSRavitheja Addepally Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 48*d5d8d91cSRavitheja Addepally error.Clear(); 49*d5d8d91cSRavitheja Addepally 50*d5d8d91cSRavitheja Addepally if (!process_sp) { 51*d5d8d91cSRavitheja Addepally error.SetErrorString("invalid process"); 52*d5d8d91cSRavitheja Addepally } else { 53*d5d8d91cSRavitheja Addepally 54*d5d8d91cSRavitheja Addepally bytes_read = process_sp->GetMetaData(GetTraceUID(), thread_id, error.ref(), 55*d5d8d91cSRavitheja Addepally buf, size, offset); 56*d5d8d91cSRavitheja Addepally LLDB_LOG(log, "SBTrace::bytes_read - %" PRIx64, bytes_read); 57*d5d8d91cSRavitheja Addepally } 58*d5d8d91cSRavitheja Addepally return bytes_read; 59*d5d8d91cSRavitheja Addepally } 60*d5d8d91cSRavitheja Addepally 61*d5d8d91cSRavitheja Addepally void SBTrace::StopTrace(SBError &error, lldb::tid_t thread_id) { 62*d5d8d91cSRavitheja Addepally ProcessSP process_sp(GetSP()); 63*d5d8d91cSRavitheja Addepally error.Clear(); 64*d5d8d91cSRavitheja Addepally 65*d5d8d91cSRavitheja Addepally if (!process_sp) { 66*d5d8d91cSRavitheja Addepally error.SetErrorString("invalid process"); 67*d5d8d91cSRavitheja Addepally return; 68*d5d8d91cSRavitheja Addepally } 69*d5d8d91cSRavitheja Addepally process_sp->StopTrace(GetTraceUID(), thread_id, error.ref()); 70*d5d8d91cSRavitheja Addepally } 71*d5d8d91cSRavitheja Addepally 72*d5d8d91cSRavitheja Addepally void SBTrace::GetTraceConfig(SBTraceOptions &options, SBError &error) { 73*d5d8d91cSRavitheja Addepally ProcessSP process_sp(GetSP()); 74*d5d8d91cSRavitheja Addepally error.Clear(); 75*d5d8d91cSRavitheja Addepally 76*d5d8d91cSRavitheja Addepally if (!process_sp) { 77*d5d8d91cSRavitheja Addepally error.SetErrorString("invalid process"); 78*d5d8d91cSRavitheja Addepally } else { 79*d5d8d91cSRavitheja Addepally process_sp->GetTraceConfig(GetTraceUID(), error.ref(), 80*d5d8d91cSRavitheja Addepally options.m_traceoptions_sp); 81*d5d8d91cSRavitheja Addepally } 82*d5d8d91cSRavitheja Addepally } 83*d5d8d91cSRavitheja Addepally 84*d5d8d91cSRavitheja Addepally lldb::user_id_t SBTrace::GetTraceUID() { 85*d5d8d91cSRavitheja Addepally if (m_trace_impl_sp) 86*d5d8d91cSRavitheja Addepally return m_trace_impl_sp->uid; 87*d5d8d91cSRavitheja Addepally return LLDB_INVALID_UID; 88*d5d8d91cSRavitheja Addepally } 89*d5d8d91cSRavitheja Addepally 90*d5d8d91cSRavitheja Addepally void SBTrace::SetTraceUID(lldb::user_id_t uid) { 91*d5d8d91cSRavitheja Addepally if (m_trace_impl_sp) 92*d5d8d91cSRavitheja Addepally m_trace_impl_sp->uid = uid; 93*d5d8d91cSRavitheja Addepally } 94*d5d8d91cSRavitheja Addepally 95*d5d8d91cSRavitheja Addepally SBTrace::SBTrace() { 96*d5d8d91cSRavitheja Addepally m_trace_impl_sp.reset(new TraceImpl); 97*d5d8d91cSRavitheja Addepally if (m_trace_impl_sp) 98*d5d8d91cSRavitheja Addepally m_trace_impl_sp->uid = LLDB_INVALID_UID; 99*d5d8d91cSRavitheja Addepally } 100*d5d8d91cSRavitheja Addepally 101*d5d8d91cSRavitheja Addepally void SBTrace::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; } 102*d5d8d91cSRavitheja Addepally 103*d5d8d91cSRavitheja Addepally bool SBTrace::IsValid() { 104*d5d8d91cSRavitheja Addepally if (!m_trace_impl_sp) 105*d5d8d91cSRavitheja Addepally return false; 106*d5d8d91cSRavitheja Addepally if (!GetSP()) 107*d5d8d91cSRavitheja Addepally return false; 108*d5d8d91cSRavitheja Addepally return true; 109*d5d8d91cSRavitheja Addepally } 110