180814287SRaphael Isemann //===-- SBTrace.cpp -------------------------------------------------------===//
2d5d8d91cSRavitheja Addepally //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d5d8d91cSRavitheja Addepally //
7d5d8d91cSRavitheja Addepally //===----------------------------------------------------------------------===//
8d5d8d91cSRavitheja Addepally 
9d5d8d91cSRavitheja Addepally #include "lldb/Target/Process.h"
101755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
11d5d8d91cSRavitheja Addepally 
1250f93679SJakob Johnson #include "lldb/API/SBDebugger.h"
13bf9f21a2SWalter Erquinigo #include "lldb/API/SBStructuredData.h"
14bf9f21a2SWalter Erquinigo #include "lldb/API/SBThread.h"
15d5d8d91cSRavitheja Addepally #include "lldb/API/SBTrace.h"
16bf9f21a2SWalter Erquinigo 
17bf9f21a2SWalter Erquinigo #include "lldb/Core/StructuredDataImpl.h"
18d5d8d91cSRavitheja Addepally 
19796ac80bSJonas Devlieghere #include <memory>
20796ac80bSJonas Devlieghere 
21d5d8d91cSRavitheja Addepally using namespace lldb;
22d5d8d91cSRavitheja Addepally using namespace lldb_private;
2350f93679SJakob Johnson using namespace llvm;
24d5d8d91cSRavitheja Addepally 
SBTrace()251755f5b1SJonas Devlieghere SBTrace::SBTrace() { LLDB_INSTRUMENT_VA(this); }
26d5d8d91cSRavitheja Addepally 
SBTrace(const lldb::TraceSP & trace_sp)27bf9f21a2SWalter Erquinigo SBTrace::SBTrace(const lldb::TraceSP &trace_sp) : m_opaque_sp(trace_sp) {
281755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, trace_sp);
29d5d8d91cSRavitheja Addepally }
30d5d8d91cSRavitheja Addepally 
LoadTraceFromFile(SBError & error,SBDebugger & debugger,const SBFileSpec & trace_description_file)3150f93679SJakob Johnson SBTrace SBTrace::LoadTraceFromFile(SBError &error, SBDebugger &debugger,
3250f93679SJakob Johnson                                    const SBFileSpec &trace_description_file) {
3350f93679SJakob Johnson   LLDB_INSTRUMENT_VA(error, debugger, trace_description_file);
3450f93679SJakob Johnson 
3550f93679SJakob Johnson   Expected<lldb::TraceSP> trace_or_err = Trace::LoadPostMortemTraceFromFile(
3650f93679SJakob Johnson       debugger.ref(), trace_description_file.ref());
3750f93679SJakob Johnson 
3850f93679SJakob Johnson   if (!trace_or_err) {
3950f93679SJakob Johnson     error.SetErrorString(toString(trace_or_err.takeError()).c_str());
4050f93679SJakob Johnson     return SBTrace();
4150f93679SJakob Johnson   }
4250f93679SJakob Johnson 
4350f93679SJakob Johnson   return SBTrace(trace_or_err.get());
4450f93679SJakob Johnson }
4550f93679SJakob Johnson 
SaveToDisk(SBError & error,const SBFileSpec & bundle_dir,bool compact)46*b532dd54SWalter Erquinigo SBFileSpec SBTrace::SaveToDisk(SBError &error, const SBFileSpec &bundle_dir,
47*b532dd54SWalter Erquinigo                                bool compact) {
48*b532dd54SWalter Erquinigo   LLDB_INSTRUMENT_VA(this, error, bundle_dir, compact);
49*b532dd54SWalter Erquinigo 
50*b532dd54SWalter Erquinigo   error.Clear();
51*b532dd54SWalter Erquinigo   SBFileSpec file_spec;
52*b532dd54SWalter Erquinigo 
53*b532dd54SWalter Erquinigo   if (!m_opaque_sp)
54*b532dd54SWalter Erquinigo     error.SetErrorString("error: invalid trace");
55*b532dd54SWalter Erquinigo   else if (Expected<FileSpec> desc_file =
56*b532dd54SWalter Erquinigo                m_opaque_sp->SaveToDisk(bundle_dir.ref(), compact))
57*b532dd54SWalter Erquinigo     file_spec.SetFileSpec(*desc_file);
58*b532dd54SWalter Erquinigo   else
59*b532dd54SWalter Erquinigo     error.SetErrorString(llvm::toString(desc_file.takeError()).c_str());
60*b532dd54SWalter Erquinigo 
61*b532dd54SWalter Erquinigo   return file_spec;
62*b532dd54SWalter Erquinigo }
63*b532dd54SWalter Erquinigo 
GetStartConfigurationHelp()64bf9f21a2SWalter Erquinigo const char *SBTrace::GetStartConfigurationHelp() {
651755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
66d232abc3SJonas Devlieghere   return m_opaque_sp ? m_opaque_sp->GetStartConfigurationHelp() : nullptr;
67d5d8d91cSRavitheja Addepally }
68d5d8d91cSRavitheja Addepally 
Start(const SBStructuredData & configuration)69bf9f21a2SWalter Erquinigo SBError SBTrace::Start(const SBStructuredData &configuration) {
701755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, configuration);
71bf9f21a2SWalter Erquinigo   SBError error;
72bf9f21a2SWalter Erquinigo   if (!m_opaque_sp)
73bf9f21a2SWalter Erquinigo     error.SetErrorString("error: invalid trace");
74bf9f21a2SWalter Erquinigo   else if (llvm::Error err =
75bf9f21a2SWalter Erquinigo                m_opaque_sp->Start(configuration.m_impl_up->GetObjectSP()))
76bf9f21a2SWalter Erquinigo     error.SetErrorString(llvm::toString(std::move(err)).c_str());
77d232abc3SJonas Devlieghere   return error;
78d5d8d91cSRavitheja Addepally }
79d5d8d91cSRavitheja Addepally 
Start(const SBThread & thread,const SBStructuredData & configuration)80bf9f21a2SWalter Erquinigo SBError SBTrace::Start(const SBThread &thread,
81bf9f21a2SWalter Erquinigo                        const SBStructuredData &configuration) {
821755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, thread, configuration);
83bf9f21a2SWalter Erquinigo 
84bf9f21a2SWalter Erquinigo   SBError error;
85bf9f21a2SWalter Erquinigo   if (!m_opaque_sp)
86bf9f21a2SWalter Erquinigo     error.SetErrorString("error: invalid trace");
87bf9f21a2SWalter Erquinigo   else {
88bf9f21a2SWalter Erquinigo     if (llvm::Error err =
89bf9f21a2SWalter Erquinigo             m_opaque_sp->Start(std::vector<lldb::tid_t>{thread.GetThreadID()},
90bf9f21a2SWalter Erquinigo                                configuration.m_impl_up->GetObjectSP()))
91bf9f21a2SWalter Erquinigo       error.SetErrorString(llvm::toString(std::move(err)).c_str());
92d5d8d91cSRavitheja Addepally   }
93d5d8d91cSRavitheja Addepally 
94d232abc3SJonas Devlieghere   return error;
95d5d8d91cSRavitheja Addepally }
96d5d8d91cSRavitheja Addepally 
Stop()97bf9f21a2SWalter Erquinigo SBError SBTrace::Stop() {
981755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
99bf9f21a2SWalter Erquinigo   SBError error;
100bf9f21a2SWalter Erquinigo   if (!m_opaque_sp)
101bf9f21a2SWalter Erquinigo     error.SetErrorString("error: invalid trace");
102bf9f21a2SWalter Erquinigo   else if (llvm::Error err = m_opaque_sp->Stop())
103bf9f21a2SWalter Erquinigo     error.SetErrorString(llvm::toString(std::move(err)).c_str());
104d232abc3SJonas Devlieghere   return error;
105d5d8d91cSRavitheja Addepally }
106d5d8d91cSRavitheja Addepally 
Stop(const SBThread & thread)107bf9f21a2SWalter Erquinigo SBError SBTrace::Stop(const SBThread &thread) {
1081755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, thread);
109bf9f21a2SWalter Erquinigo   SBError error;
110bf9f21a2SWalter Erquinigo   if (!m_opaque_sp)
111bf9f21a2SWalter Erquinigo     error.SetErrorString("error: invalid trace");
112bf9f21a2SWalter Erquinigo   else if (llvm::Error err = m_opaque_sp->Stop({thread.GetThreadID()}))
113bf9f21a2SWalter Erquinigo     error.SetErrorString(llvm::toString(std::move(err)).c_str());
114d232abc3SJonas Devlieghere   return error;
115d5d8d91cSRavitheja Addepally }
116d5d8d91cSRavitheja Addepally 
IsValid()117d5d8d91cSRavitheja Addepally bool SBTrace::IsValid() {
1181755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1197f5237bcSPavel Labath   return this->operator bool();
1207f5237bcSPavel Labath }
121bf9f21a2SWalter Erquinigo 
operator bool() const1227f5237bcSPavel Labath SBTrace::operator bool() const {
1231755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
124bf9f21a2SWalter Erquinigo   return (bool)m_opaque_sp;
125d5d8d91cSRavitheja Addepally }
126