1 //===-- SBTrace.cpp -------------------------------------------------------===//
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 "lldb/Target/Process.h"
10 #include "lldb/Utility/Instrumentation.h"
11 
12 #include "lldb/API/SBDebugger.h"
13 #include "lldb/API/SBStructuredData.h"
14 #include "lldb/API/SBThread.h"
15 #include "lldb/API/SBTrace.h"
16 
17 #include "lldb/Core/StructuredDataImpl.h"
18 
19 #include <memory>
20 
21 using namespace lldb;
22 using namespace lldb_private;
23 using namespace llvm;
24 
25 SBTrace::SBTrace() { LLDB_INSTRUMENT_VA(this); }
26 
27 SBTrace::SBTrace(const lldb::TraceSP &trace_sp) : m_opaque_sp(trace_sp) {
28   LLDB_INSTRUMENT_VA(this, trace_sp);
29 }
30 
31 SBTrace SBTrace::LoadTraceFromFile(SBError &error, SBDebugger &debugger,
32                                    const SBFileSpec &trace_description_file) {
33   LLDB_INSTRUMENT_VA(error, debugger, trace_description_file);
34 
35   Expected<lldb::TraceSP> trace_or_err = Trace::LoadPostMortemTraceFromFile(
36       debugger.ref(), trace_description_file.ref());
37 
38   if (!trace_or_err) {
39     error.SetErrorString(toString(trace_or_err.takeError()).c_str());
40     return SBTrace();
41   }
42 
43   return SBTrace(trace_or_err.get());
44 }
45 
46 const char *SBTrace::GetStartConfigurationHelp() {
47   LLDB_INSTRUMENT_VA(this);
48   return m_opaque_sp ? m_opaque_sp->GetStartConfigurationHelp() : nullptr;
49 }
50 
51 SBError SBTrace::Start(const SBStructuredData &configuration) {
52   LLDB_INSTRUMENT_VA(this, configuration);
53   SBError error;
54   if (!m_opaque_sp)
55     error.SetErrorString("error: invalid trace");
56   else if (llvm::Error err =
57                m_opaque_sp->Start(configuration.m_impl_up->GetObjectSP()))
58     error.SetErrorString(llvm::toString(std::move(err)).c_str());
59   return error;
60 }
61 
62 SBError SBTrace::Start(const SBThread &thread,
63                        const SBStructuredData &configuration) {
64   LLDB_INSTRUMENT_VA(this, thread, configuration);
65 
66   SBError error;
67   if (!m_opaque_sp)
68     error.SetErrorString("error: invalid trace");
69   else {
70     if (llvm::Error err =
71             m_opaque_sp->Start(std::vector<lldb::tid_t>{thread.GetThreadID()},
72                                configuration.m_impl_up->GetObjectSP()))
73       error.SetErrorString(llvm::toString(std::move(err)).c_str());
74   }
75 
76   return error;
77 }
78 
79 SBError SBTrace::Stop() {
80   LLDB_INSTRUMENT_VA(this);
81   SBError error;
82   if (!m_opaque_sp)
83     error.SetErrorString("error: invalid trace");
84   else if (llvm::Error err = m_opaque_sp->Stop())
85     error.SetErrorString(llvm::toString(std::move(err)).c_str());
86   return error;
87 }
88 
89 SBError SBTrace::Stop(const SBThread &thread) {
90   LLDB_INSTRUMENT_VA(this, thread);
91   SBError error;
92   if (!m_opaque_sp)
93     error.SetErrorString("error: invalid trace");
94   else if (llvm::Error err = m_opaque_sp->Stop({thread.GetThreadID()}))
95     error.SetErrorString(llvm::toString(std::move(err)).c_str());
96   return error;
97 }
98 
99 bool SBTrace::IsValid() {
100   LLDB_INSTRUMENT_VA(this);
101   return this->operator bool();
102 }
103 
104 SBTrace::operator bool() const {
105   LLDB_INSTRUMENT_VA(this);
106   return (bool)m_opaque_sp;
107 }
108