180814287SRaphael Isemann //===-- SBPlatform.cpp ----------------------------------------------------===//
2fbb76349SGreg Clayton //
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
6fbb76349SGreg Clayton //
7fbb76349SGreg Clayton //===----------------------------------------------------------------------===//
8fbb76349SGreg Clayton 
9fbb76349SGreg Clayton #include "lldb/API/SBPlatform.h"
10baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h"
11ca69be21SWalter Erquinigo #include "lldb/API/SBEnvironment.h"
12fbb76349SGreg Clayton #include "lldb/API/SBError.h"
13fbb76349SGreg Clayton #include "lldb/API/SBFileSpec.h"
141ef7b2c8SOleksiy Vyalov #include "lldb/API/SBLaunchInfo.h"
15ca69be21SWalter Erquinigo #include "lldb/API/SBPlatform.h"
1698d0a4b3SChaoren Lin #include "lldb/API/SBUnixSignals.h"
17fbb76349SGreg Clayton #include "lldb/Host/File.h"
18fbb76349SGreg Clayton #include "lldb/Target/Platform.h"
19b9c1b51eSKate Stone #include "lldb/Target/Target.h"
205f19b907SPavel Labath #include "lldb/Utility/ArchSpec.h"
21145d95c9SPavel Labath #include "lldb/Utility/Args.h"
2297206d57SZachary Turner #include "lldb/Utility/Status.h"
23fbb76349SGreg Clayton 
247d86ee5aSZachary Turner #include "llvm/Support/FileSystem.h"
257d86ee5aSZachary Turner 
261ef7b2c8SOleksiy Vyalov #include <functional>
271ef7b2c8SOleksiy Vyalov 
28fbb76349SGreg Clayton using namespace lldb;
29fbb76349SGreg Clayton using namespace lldb_private;
30fbb76349SGreg Clayton 
31fbb76349SGreg Clayton // PlatformConnectOptions
32fbb76349SGreg Clayton struct PlatformConnectOptions {
33248a1305SKonrad Kleine   PlatformConnectOptions(const char *url = nullptr)
34b9c1b51eSKate Stone       : m_url(), m_rsync_options(), m_rsync_remote_path_prefix(),
359494c510SJonas Devlieghere 
36b9c1b51eSKate Stone         m_local_cache_directory() {
37fbb76349SGreg Clayton     if (url && url[0])
38fbb76349SGreg Clayton       m_url = url;
39fbb76349SGreg Clayton   }
40fbb76349SGreg Clayton 
41866b7a65SJonas Devlieghere   ~PlatformConnectOptions() = default;
42fbb76349SGreg Clayton 
43fbb76349SGreg Clayton   std::string m_url;
44fbb76349SGreg Clayton   std::string m_rsync_options;
45fbb76349SGreg Clayton   std::string m_rsync_remote_path_prefix;
469494c510SJonas Devlieghere   bool m_rsync_enabled = false;
479494c510SJonas Devlieghere   bool m_rsync_omit_hostname_from_remote_path = false;
48fbb76349SGreg Clayton   ConstString m_local_cache_directory;
49fbb76349SGreg Clayton };
50fbb76349SGreg Clayton 
51fbb76349SGreg Clayton // PlatformShellCommand
52fbb76349SGreg Clayton struct PlatformShellCommand {
53addb5148SMed Ismail Bennani   PlatformShellCommand(llvm::StringRef shell_interpreter,
54addb5148SMed Ismail Bennani                        llvm::StringRef shell_command)
5519dd1a0eSPavel Labath       : m_command(), m_working_dir(), m_status(0), m_signo(0) {
56addb5148SMed Ismail Bennani     if (!shell_interpreter.empty())
57addb5148SMed Ismail Bennani       m_shell = shell_interpreter.str();
58addb5148SMed Ismail Bennani 
59addb5148SMed Ismail Bennani     if (!m_shell.empty() && !shell_command.empty())
60addb5148SMed Ismail Bennani       m_command = shell_command.str();
61addb5148SMed Ismail Bennani   }
62addb5148SMed Ismail Bennani 
63addb5148SMed Ismail Bennani   PlatformShellCommand(llvm::StringRef shell_command = llvm::StringRef())
649494c510SJonas Devlieghere       : m_shell(), m_command(), m_working_dir() {
65addb5148SMed Ismail Bennani     if (!shell_command.empty())
66addb5148SMed Ismail Bennani       m_command = shell_command.str();
67fbb76349SGreg Clayton   }
68fbb76349SGreg Clayton 
69866b7a65SJonas Devlieghere   ~PlatformShellCommand() = default;
70fbb76349SGreg Clayton 
71addb5148SMed Ismail Bennani   std::string m_shell;
72fbb76349SGreg Clayton   std::string m_command;
73fbb76349SGreg Clayton   std::string m_working_dir;
74fbb76349SGreg Clayton   std::string m_output;
759494c510SJonas Devlieghere   int m_status = 0;
769494c510SJonas Devlieghere   int m_signo = 0;
7719dd1a0eSPavel Labath   Timeout<std::ratio<1>> m_timeout = llvm::None;
78fbb76349SGreg Clayton };
79fbb76349SGreg Clayton // SBPlatformConnectOptions
80b9c1b51eSKate Stone SBPlatformConnectOptions::SBPlatformConnectOptions(const char *url)
81baf5664fSJonas Devlieghere     : m_opaque_ptr(new PlatformConnectOptions(url)) {
82baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBPlatformConnectOptions, (const char *), url);
83baf5664fSJonas Devlieghere }
84fbb76349SGreg Clayton 
85b9c1b51eSKate Stone SBPlatformConnectOptions::SBPlatformConnectOptions(
86b9c1b51eSKate Stone     const SBPlatformConnectOptions &rhs)
87b9c1b51eSKate Stone     : m_opaque_ptr(new PlatformConnectOptions()) {
88baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBPlatformConnectOptions,
89baf5664fSJonas Devlieghere                           (const lldb::SBPlatformConnectOptions &), rhs);
90baf5664fSJonas Devlieghere 
91fbb76349SGreg Clayton   *m_opaque_ptr = *rhs.m_opaque_ptr;
92fbb76349SGreg Clayton }
93fbb76349SGreg Clayton 
94b9c1b51eSKate Stone SBPlatformConnectOptions::~SBPlatformConnectOptions() { delete m_opaque_ptr; }
95fbb76349SGreg Clayton 
96bc0a35f3SJonas Devlieghere SBPlatformConnectOptions &
97bc0a35f3SJonas Devlieghere SBPlatformConnectOptions::operator=(const SBPlatformConnectOptions &rhs) {
98baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(
99ede5cd9aSJonas Devlieghere       SBPlatformConnectOptions &,
100baf5664fSJonas Devlieghere       SBPlatformConnectOptions, operator=,(
101baf5664fSJonas Devlieghere                                     const lldb::SBPlatformConnectOptions &),
102baf5664fSJonas Devlieghere       rhs);
103baf5664fSJonas Devlieghere 
104fbb76349SGreg Clayton   *m_opaque_ptr = *rhs.m_opaque_ptr;
105ede5cd9aSJonas Devlieghere   return LLDB_RECORD_RESULT(*this);
106fbb76349SGreg Clayton }
107fbb76349SGreg Clayton 
108b9c1b51eSKate Stone const char *SBPlatformConnectOptions::GetURL() {
109baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBPlatformConnectOptions, GetURL);
110baf5664fSJonas Devlieghere 
111fbb76349SGreg Clayton   if (m_opaque_ptr->m_url.empty())
112248a1305SKonrad Kleine     return nullptr;
113fbb76349SGreg Clayton   return m_opaque_ptr->m_url.c_str();
114fbb76349SGreg Clayton }
115fbb76349SGreg Clayton 
116b9c1b51eSKate Stone void SBPlatformConnectOptions::SetURL(const char *url) {
117baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBPlatformConnectOptions, SetURL, (const char *),
118baf5664fSJonas Devlieghere                      url);
119baf5664fSJonas Devlieghere 
120fbb76349SGreg Clayton   if (url && url[0])
121fbb76349SGreg Clayton     m_opaque_ptr->m_url = url;
122fbb76349SGreg Clayton   else
123fbb76349SGreg Clayton     m_opaque_ptr->m_url.clear();
124fbb76349SGreg Clayton }
125fbb76349SGreg Clayton 
126b9c1b51eSKate Stone bool SBPlatformConnectOptions::GetRsyncEnabled() {
127baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBPlatformConnectOptions, GetRsyncEnabled);
128baf5664fSJonas Devlieghere 
129fbb76349SGreg Clayton   return m_opaque_ptr->m_rsync_enabled;
130fbb76349SGreg Clayton }
131fbb76349SGreg Clayton 
132b9c1b51eSKate Stone void SBPlatformConnectOptions::EnableRsync(
133b9c1b51eSKate Stone     const char *options, const char *remote_path_prefix,
134b9c1b51eSKate Stone     bool omit_hostname_from_remote_path) {
135baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBPlatformConnectOptions, EnableRsync,
136baf5664fSJonas Devlieghere                      (const char *, const char *, bool), options,
137baf5664fSJonas Devlieghere                      remote_path_prefix, omit_hostname_from_remote_path);
138baf5664fSJonas Devlieghere 
139fbb76349SGreg Clayton   m_opaque_ptr->m_rsync_enabled = true;
140b9c1b51eSKate Stone   m_opaque_ptr->m_rsync_omit_hostname_from_remote_path =
141b9c1b51eSKate Stone       omit_hostname_from_remote_path;
142fbb76349SGreg Clayton   if (remote_path_prefix && remote_path_prefix[0])
143fbb76349SGreg Clayton     m_opaque_ptr->m_rsync_remote_path_prefix = remote_path_prefix;
144fbb76349SGreg Clayton   else
145fbb76349SGreg Clayton     m_opaque_ptr->m_rsync_remote_path_prefix.clear();
146fbb76349SGreg Clayton 
147fbb76349SGreg Clayton   if (options && options[0])
148fbb76349SGreg Clayton     m_opaque_ptr->m_rsync_options = options;
149fbb76349SGreg Clayton   else
150fbb76349SGreg Clayton     m_opaque_ptr->m_rsync_options.clear();
151fbb76349SGreg Clayton }
152fbb76349SGreg Clayton 
153b9c1b51eSKate Stone void SBPlatformConnectOptions::DisableRsync() {
154baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBPlatformConnectOptions, DisableRsync);
155baf5664fSJonas Devlieghere 
156fbb76349SGreg Clayton   m_opaque_ptr->m_rsync_enabled = false;
157fbb76349SGreg Clayton }
158fbb76349SGreg Clayton 
159b9c1b51eSKate Stone const char *SBPlatformConnectOptions::GetLocalCacheDirectory() {
160baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBPlatformConnectOptions,
161baf5664fSJonas Devlieghere                              GetLocalCacheDirectory);
162baf5664fSJonas Devlieghere 
163fbb76349SGreg Clayton   return m_opaque_ptr->m_local_cache_directory.GetCString();
164fbb76349SGreg Clayton }
165fbb76349SGreg Clayton 
166b9c1b51eSKate Stone void SBPlatformConnectOptions::SetLocalCacheDirectory(const char *path) {
167baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBPlatformConnectOptions, SetLocalCacheDirectory,
168baf5664fSJonas Devlieghere                      (const char *), path);
169baf5664fSJonas Devlieghere 
170fbb76349SGreg Clayton   if (path && path[0])
171fbb76349SGreg Clayton     m_opaque_ptr->m_local_cache_directory.SetCString(path);
172fbb76349SGreg Clayton   else
173fbb76349SGreg Clayton     m_opaque_ptr->m_local_cache_directory = ConstString();
174fbb76349SGreg Clayton }
175fbb76349SGreg Clayton 
176fbb76349SGreg Clayton // SBPlatformShellCommand
177addb5148SMed Ismail Bennani SBPlatformShellCommand::SBPlatformShellCommand(const char *shell_interpreter,
178addb5148SMed Ismail Bennani                                                const char *shell_command)
179addb5148SMed Ismail Bennani     : m_opaque_ptr(new PlatformShellCommand(shell_interpreter, shell_command)) {
180addb5148SMed Ismail Bennani   LLDB_RECORD_CONSTRUCTOR(SBPlatformShellCommand, (const char *, const char *),
181addb5148SMed Ismail Bennani                           shell_interpreter, shell_command);
182addb5148SMed Ismail Bennani }
183addb5148SMed Ismail Bennani 
184b9c1b51eSKate Stone SBPlatformShellCommand::SBPlatformShellCommand(const char *shell_command)
185baf5664fSJonas Devlieghere     : m_opaque_ptr(new PlatformShellCommand(shell_command)) {
186baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBPlatformShellCommand, (const char *),
187baf5664fSJonas Devlieghere                           shell_command);
188baf5664fSJonas Devlieghere }
189fbb76349SGreg Clayton 
190b9c1b51eSKate Stone SBPlatformShellCommand::SBPlatformShellCommand(
191b9c1b51eSKate Stone     const SBPlatformShellCommand &rhs)
192b9c1b51eSKate Stone     : m_opaque_ptr(new PlatformShellCommand()) {
193baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBPlatformShellCommand,
194baf5664fSJonas Devlieghere                           (const lldb::SBPlatformShellCommand &), rhs);
195baf5664fSJonas Devlieghere 
196fbb76349SGreg Clayton   *m_opaque_ptr = *rhs.m_opaque_ptr;
197fbb76349SGreg Clayton }
198fbb76349SGreg Clayton 
199bc0a35f3SJonas Devlieghere SBPlatformShellCommand &
200bc0a35f3SJonas Devlieghere SBPlatformShellCommand::operator=(const SBPlatformShellCommand &rhs) {
201ede5cd9aSJonas Devlieghere 
202ede5cd9aSJonas Devlieghere   LLDB_RECORD_METHOD(
203ede5cd9aSJonas Devlieghere       SBPlatformShellCommand &,
204ede5cd9aSJonas Devlieghere       SBPlatformShellCommand, operator=,(const lldb::SBPlatformShellCommand &),
205ede5cd9aSJonas Devlieghere       rhs);
206ede5cd9aSJonas Devlieghere 
207ede5cd9aSJonas Devlieghere   *m_opaque_ptr = *rhs.m_opaque_ptr;
208ede5cd9aSJonas Devlieghere   return LLDB_RECORD_RESULT(*this);
209ede5cd9aSJonas Devlieghere }
210ede5cd9aSJonas Devlieghere 
211b9c1b51eSKate Stone SBPlatformShellCommand::~SBPlatformShellCommand() { delete m_opaque_ptr; }
212fbb76349SGreg Clayton 
213b9c1b51eSKate Stone void SBPlatformShellCommand::Clear() {
214baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBPlatformShellCommand, Clear);
215baf5664fSJonas Devlieghere 
2163a29f8b9SPavel Labath   m_opaque_ptr->m_output = std::string();
217fbb76349SGreg Clayton   m_opaque_ptr->m_status = 0;
218fbb76349SGreg Clayton   m_opaque_ptr->m_signo = 0;
219fbb76349SGreg Clayton }
220fbb76349SGreg Clayton 
221addb5148SMed Ismail Bennani const char *SBPlatformShellCommand::GetShell() {
222addb5148SMed Ismail Bennani   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBPlatformShellCommand, GetShell);
223addb5148SMed Ismail Bennani 
224addb5148SMed Ismail Bennani   if (m_opaque_ptr->m_shell.empty())
225addb5148SMed Ismail Bennani     return nullptr;
226addb5148SMed Ismail Bennani   return m_opaque_ptr->m_shell.c_str();
227addb5148SMed Ismail Bennani }
228addb5148SMed Ismail Bennani 
229addb5148SMed Ismail Bennani void SBPlatformShellCommand::SetShell(const char *shell_interpreter) {
230addb5148SMed Ismail Bennani   LLDB_RECORD_METHOD(void, SBPlatformShellCommand, SetShell, (const char *),
231addb5148SMed Ismail Bennani                      shell_interpreter);
232addb5148SMed Ismail Bennani 
233addb5148SMed Ismail Bennani   if (shell_interpreter && shell_interpreter[0])
234addb5148SMed Ismail Bennani     m_opaque_ptr->m_shell = shell_interpreter;
235addb5148SMed Ismail Bennani   else
236addb5148SMed Ismail Bennani     m_opaque_ptr->m_shell.clear();
237addb5148SMed Ismail Bennani }
238addb5148SMed Ismail Bennani 
239b9c1b51eSKate Stone const char *SBPlatformShellCommand::GetCommand() {
240baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBPlatformShellCommand, GetCommand);
241baf5664fSJonas Devlieghere 
242fbb76349SGreg Clayton   if (m_opaque_ptr->m_command.empty())
243248a1305SKonrad Kleine     return nullptr;
244fbb76349SGreg Clayton   return m_opaque_ptr->m_command.c_str();
245fbb76349SGreg Clayton }
246fbb76349SGreg Clayton 
247b9c1b51eSKate Stone void SBPlatformShellCommand::SetCommand(const char *shell_command) {
248baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBPlatformShellCommand, SetCommand, (const char *),
249baf5664fSJonas Devlieghere                      shell_command);
250baf5664fSJonas Devlieghere 
251fbb76349SGreg Clayton   if (shell_command && shell_command[0])
252fbb76349SGreg Clayton     m_opaque_ptr->m_command = shell_command;
253fbb76349SGreg Clayton   else
254fbb76349SGreg Clayton     m_opaque_ptr->m_command.clear();
255fbb76349SGreg Clayton }
256fbb76349SGreg Clayton 
257b9c1b51eSKate Stone const char *SBPlatformShellCommand::GetWorkingDirectory() {
258baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBPlatformShellCommand,
259baf5664fSJonas Devlieghere                              GetWorkingDirectory);
260baf5664fSJonas Devlieghere 
261fbb76349SGreg Clayton   if (m_opaque_ptr->m_working_dir.empty())
262248a1305SKonrad Kleine     return nullptr;
263fbb76349SGreg Clayton   return m_opaque_ptr->m_working_dir.c_str();
264fbb76349SGreg Clayton }
265fbb76349SGreg Clayton 
266b9c1b51eSKate Stone void SBPlatformShellCommand::SetWorkingDirectory(const char *path) {
267baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBPlatformShellCommand, SetWorkingDirectory,
268baf5664fSJonas Devlieghere                      (const char *), path);
269baf5664fSJonas Devlieghere 
270fbb76349SGreg Clayton   if (path && path[0])
271fbb76349SGreg Clayton     m_opaque_ptr->m_working_dir = path;
272fbb76349SGreg Clayton   else
273fbb76349SGreg Clayton     m_opaque_ptr->m_working_dir.clear();
274fbb76349SGreg Clayton }
275fbb76349SGreg Clayton 
276b9c1b51eSKate Stone uint32_t SBPlatformShellCommand::GetTimeoutSeconds() {
277baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBPlatformShellCommand,
278baf5664fSJonas Devlieghere                              GetTimeoutSeconds);
279baf5664fSJonas Devlieghere 
28019dd1a0eSPavel Labath   if (m_opaque_ptr->m_timeout)
28119dd1a0eSPavel Labath     return m_opaque_ptr->m_timeout->count();
28219dd1a0eSPavel Labath   return UINT32_MAX;
283fbb76349SGreg Clayton }
284fbb76349SGreg Clayton 
285b9c1b51eSKate Stone void SBPlatformShellCommand::SetTimeoutSeconds(uint32_t sec) {
286baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBPlatformShellCommand, SetTimeoutSeconds,
287baf5664fSJonas Devlieghere                      (uint32_t), sec);
288baf5664fSJonas Devlieghere 
28919dd1a0eSPavel Labath   if (sec == UINT32_MAX)
29019dd1a0eSPavel Labath     m_opaque_ptr->m_timeout = llvm::None;
29119dd1a0eSPavel Labath   else
29219dd1a0eSPavel Labath     m_opaque_ptr->m_timeout = std::chrono::seconds(sec);
293fbb76349SGreg Clayton }
294fbb76349SGreg Clayton 
295baf5664fSJonas Devlieghere int SBPlatformShellCommand::GetSignal() {
296baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(int, SBPlatformShellCommand, GetSignal);
297fbb76349SGreg Clayton 
298baf5664fSJonas Devlieghere   return m_opaque_ptr->m_signo;
299baf5664fSJonas Devlieghere }
300baf5664fSJonas Devlieghere 
301baf5664fSJonas Devlieghere int SBPlatformShellCommand::GetStatus() {
302baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(int, SBPlatformShellCommand, GetStatus);
303baf5664fSJonas Devlieghere 
304baf5664fSJonas Devlieghere   return m_opaque_ptr->m_status;
305baf5664fSJonas Devlieghere }
306fbb76349SGreg Clayton 
307b9c1b51eSKate Stone const char *SBPlatformShellCommand::GetOutput() {
308baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBPlatformShellCommand, GetOutput);
309baf5664fSJonas Devlieghere 
310fbb76349SGreg Clayton   if (m_opaque_ptr->m_output.empty())
311248a1305SKonrad Kleine     return nullptr;
312fbb76349SGreg Clayton   return m_opaque_ptr->m_output.c_str();
313fbb76349SGreg Clayton }
314fbb76349SGreg Clayton 
315fbb76349SGreg Clayton // SBPlatform
316baf5664fSJonas Devlieghere SBPlatform::SBPlatform() : m_opaque_sp() {
317baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBPlatform);
318baf5664fSJonas Devlieghere }
319fbb76349SGreg Clayton 
320b9c1b51eSKate Stone SBPlatform::SBPlatform(const char *platform_name) : m_opaque_sp() {
321baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBPlatform, (const char *), platform_name);
322baf5664fSJonas Devlieghere 
32397206d57SZachary Turner   Status error;
324615eb7e6SGreg Clayton   if (platform_name && platform_name[0])
325615eb7e6SGreg Clayton     m_opaque_sp = Platform::Create(ConstString(platform_name), error);
326fbb76349SGreg Clayton }
327fbb76349SGreg Clayton 
32866dc4672SJonas Devlieghere SBPlatform::SBPlatform(const SBPlatform &rhs) {
32966dc4672SJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBPlatform, (const lldb::SBPlatform &), rhs);
33066dc4672SJonas Devlieghere 
33166dc4672SJonas Devlieghere   m_opaque_sp = rhs.m_opaque_sp;
33266dc4672SJonas Devlieghere }
33366dc4672SJonas Devlieghere 
334ede5cd9aSJonas Devlieghere SBPlatform &SBPlatform::operator=(const SBPlatform &rhs) {
335ede5cd9aSJonas Devlieghere   LLDB_RECORD_METHOD(SBPlatform &,
336ede5cd9aSJonas Devlieghere                      SBPlatform, operator=,(const lldb::SBPlatform &), rhs);
33766dc4672SJonas Devlieghere 
33866dc4672SJonas Devlieghere   m_opaque_sp = rhs.m_opaque_sp;
339ede5cd9aSJonas Devlieghere   return LLDB_RECORD_RESULT(*this);
34066dc4672SJonas Devlieghere }
34166dc4672SJonas Devlieghere 
342866b7a65SJonas Devlieghere SBPlatform::~SBPlatform() = default;
343fbb76349SGreg Clayton 
344a31130f6STatyana Krasnukha SBPlatform SBPlatform::GetHostPlatform() {
3455c2bf577SJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBPlatform, SBPlatform,
3465c2bf577SJonas Devlieghere                                     GetHostPlatform);
3475c2bf577SJonas Devlieghere 
348a31130f6STatyana Krasnukha   SBPlatform host_platform;
349a31130f6STatyana Krasnukha   host_platform.m_opaque_sp = Platform::GetHostPlatform();
3505c2bf577SJonas Devlieghere   return LLDB_RECORD_RESULT(host_platform);
351a31130f6STatyana Krasnukha }
352a31130f6STatyana Krasnukha 
353baf5664fSJonas Devlieghere bool SBPlatform::IsValid() const {
354baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBPlatform, IsValid);
3557f5237bcSPavel Labath   return this->operator bool();
3567f5237bcSPavel Labath }
3577f5237bcSPavel Labath SBPlatform::operator bool() const {
3587f5237bcSPavel Labath   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBPlatform, operator bool);
359fbb76349SGreg Clayton 
360248a1305SKonrad Kleine   return m_opaque_sp.get() != nullptr;
361baf5664fSJonas Devlieghere }
362baf5664fSJonas Devlieghere 
363baf5664fSJonas Devlieghere void SBPlatform::Clear() {
364baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBPlatform, Clear);
365baf5664fSJonas Devlieghere 
366baf5664fSJonas Devlieghere   m_opaque_sp.reset();
367baf5664fSJonas Devlieghere }
368fbb76349SGreg Clayton 
369b9c1b51eSKate Stone const char *SBPlatform::GetName() {
370baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBPlatform, GetName);
371baf5664fSJonas Devlieghere 
372fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
373fbb76349SGreg Clayton   if (platform_sp)
374fbb76349SGreg Clayton     return platform_sp->GetName().GetCString();
375248a1305SKonrad Kleine   return nullptr;
376fbb76349SGreg Clayton }
377fbb76349SGreg Clayton 
378b9c1b51eSKate Stone lldb::PlatformSP SBPlatform::GetSP() const { return m_opaque_sp; }
379fbb76349SGreg Clayton 
380b9c1b51eSKate Stone void SBPlatform::SetSP(const lldb::PlatformSP &platform_sp) {
381fbb76349SGreg Clayton   m_opaque_sp = platform_sp;
382fbb76349SGreg Clayton }
383fbb76349SGreg Clayton 
384b9c1b51eSKate Stone const char *SBPlatform::GetWorkingDirectory() {
385baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBPlatform, GetWorkingDirectory);
386baf5664fSJonas Devlieghere 
387fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
388fbb76349SGreg Clayton   if (platform_sp)
389fbb76349SGreg Clayton     return platform_sp->GetWorkingDirectory().GetCString();
390248a1305SKonrad Kleine   return nullptr;
391fbb76349SGreg Clayton }
392fbb76349SGreg Clayton 
393b9c1b51eSKate Stone bool SBPlatform::SetWorkingDirectory(const char *path) {
394baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBPlatform, SetWorkingDirectory, (const char *),
395baf5664fSJonas Devlieghere                      path);
396baf5664fSJonas Devlieghere 
397fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
398b9c1b51eSKate Stone   if (platform_sp) {
399fbb76349SGreg Clayton     if (path)
4008f3be7a3SJonas Devlieghere       platform_sp->SetWorkingDirectory(FileSpec(path));
401fbb76349SGreg Clayton     else
4028f3be7a3SJonas Devlieghere       platform_sp->SetWorkingDirectory(FileSpec());
403fbb76349SGreg Clayton     return true;
404fbb76349SGreg Clayton   }
405fbb76349SGreg Clayton   return false;
406fbb76349SGreg Clayton }
407fbb76349SGreg Clayton 
408b9c1b51eSKate Stone SBError SBPlatform::ConnectRemote(SBPlatformConnectOptions &connect_options) {
409baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBPlatform, ConnectRemote,
410baf5664fSJonas Devlieghere                      (lldb::SBPlatformConnectOptions &), connect_options);
411baf5664fSJonas Devlieghere 
412fbb76349SGreg Clayton   SBError sb_error;
413fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
414b9c1b51eSKate Stone   if (platform_sp && connect_options.GetURL()) {
415fbb76349SGreg Clayton     Args args;
416bbea3610SRaphael Isemann     args.AppendArgument(connect_options.GetURL());
417fbb76349SGreg Clayton     sb_error.ref() = platform_sp->ConnectRemote(args);
418b9c1b51eSKate Stone   } else {
419fbb76349SGreg Clayton     sb_error.SetErrorString("invalid platform");
420fbb76349SGreg Clayton   }
421baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
422fbb76349SGreg Clayton }
423fbb76349SGreg Clayton 
424b9c1b51eSKate Stone void SBPlatform::DisconnectRemote() {
425baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBPlatform, DisconnectRemote);
426baf5664fSJonas Devlieghere 
427fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
428fbb76349SGreg Clayton   if (platform_sp)
429fbb76349SGreg Clayton     platform_sp->DisconnectRemote();
430fbb76349SGreg Clayton }
431fbb76349SGreg Clayton 
432b9c1b51eSKate Stone bool SBPlatform::IsConnected() {
433baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBPlatform, IsConnected);
434baf5664fSJonas Devlieghere 
435fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
436fbb76349SGreg Clayton   if (platform_sp)
437ca38766cSJim Ingham     return platform_sp->IsConnected();
438fbb76349SGreg Clayton   return false;
439fbb76349SGreg Clayton }
440fbb76349SGreg Clayton 
441b9c1b51eSKate Stone const char *SBPlatform::GetTriple() {
442baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBPlatform, GetTriple);
443baf5664fSJonas Devlieghere 
444fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
445b9c1b51eSKate Stone   if (platform_sp) {
446ccd28a14STamas Berghammer     ArchSpec arch(platform_sp->GetSystemArchitecture());
447b9c1b51eSKate Stone     if (arch.IsValid()) {
448b9c1b51eSKate Stone       // Const-ify the string so we don't need to worry about the lifetime of
449b9c1b51eSKate Stone       // the string
450fbb76349SGreg Clayton       return ConstString(arch.GetTriple().getTriple().c_str()).GetCString();
451fbb76349SGreg Clayton     }
452fbb76349SGreg Clayton   }
453248a1305SKonrad Kleine   return nullptr;
454fbb76349SGreg Clayton }
455fbb76349SGreg Clayton 
456b9c1b51eSKate Stone const char *SBPlatform::GetOSBuild() {
457baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBPlatform, GetOSBuild);
458baf5664fSJonas Devlieghere 
459fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
460b9c1b51eSKate Stone   if (platform_sp) {
46140e4ac3eSPavel Labath     std::string s = platform_sp->GetOSBuildString().getValueOr("");
462b9c1b51eSKate Stone     if (!s.empty()) {
463b9c1b51eSKate Stone       // Const-ify the string so we don't need to worry about the lifetime of
464b9c1b51eSKate Stone       // the string
46540e4ac3eSPavel Labath       return ConstString(s).GetCString();
466fbb76349SGreg Clayton     }
467fbb76349SGreg Clayton   }
468248a1305SKonrad Kleine   return nullptr;
469fbb76349SGreg Clayton }
470fbb76349SGreg Clayton 
471b9c1b51eSKate Stone const char *SBPlatform::GetOSDescription() {
472baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBPlatform, GetOSDescription);
473baf5664fSJonas Devlieghere 
474fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
475b9c1b51eSKate Stone   if (platform_sp) {
476*f5158ca4SPavel Labath     std::string s = platform_sp->GetOSKernelDescription().getValueOr("");
477b9c1b51eSKate Stone     if (!s.empty()) {
478b9c1b51eSKate Stone       // Const-ify the string so we don't need to worry about the lifetime of
479b9c1b51eSKate Stone       // the string
480fbb76349SGreg Clayton       return ConstString(s.c_str()).GetCString();
481fbb76349SGreg Clayton     }
482fbb76349SGreg Clayton   }
483248a1305SKonrad Kleine   return nullptr;
484fbb76349SGreg Clayton }
485fbb76349SGreg Clayton 
486b9c1b51eSKate Stone const char *SBPlatform::GetHostname() {
487baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBPlatform, GetHostname);
488baf5664fSJonas Devlieghere 
489fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
490fbb76349SGreg Clayton   if (platform_sp)
491fbb76349SGreg Clayton     return platform_sp->GetHostname();
492248a1305SKonrad Kleine   return nullptr;
493fbb76349SGreg Clayton }
494fbb76349SGreg Clayton 
495b9c1b51eSKate Stone uint32_t SBPlatform::GetOSMajorVersion() {
496baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBPlatform, GetOSMajorVersion);
497baf5664fSJonas Devlieghere 
4982272c481SPavel Labath   llvm::VersionTuple version;
4992272c481SPavel Labath   if (PlatformSP platform_sp = GetSP())
5002272c481SPavel Labath     version = platform_sp->GetOSVersion();
5012272c481SPavel Labath   return version.empty() ? UINT32_MAX : version.getMajor();
502fbb76349SGreg Clayton }
503fbb76349SGreg Clayton 
504b9c1b51eSKate Stone uint32_t SBPlatform::GetOSMinorVersion() {
505baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBPlatform, GetOSMinorVersion);
506baf5664fSJonas Devlieghere 
5072272c481SPavel Labath   llvm::VersionTuple version;
5082272c481SPavel Labath   if (PlatformSP platform_sp = GetSP())
5092272c481SPavel Labath     version = platform_sp->GetOSVersion();
5102272c481SPavel Labath   return version.getMinor().getValueOr(UINT32_MAX);
511fbb76349SGreg Clayton }
512fbb76349SGreg Clayton 
513b9c1b51eSKate Stone uint32_t SBPlatform::GetOSUpdateVersion() {
514baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBPlatform, GetOSUpdateVersion);
515baf5664fSJonas Devlieghere 
5162272c481SPavel Labath   llvm::VersionTuple version;
5172272c481SPavel Labath   if (PlatformSP platform_sp = GetSP())
5182272c481SPavel Labath     version = platform_sp->GetOSVersion();
5192272c481SPavel Labath   return version.getSubminor().getValueOr(UINT32_MAX);
520fbb76349SGreg Clayton }
521fbb76349SGreg Clayton 
522b9c1b51eSKate Stone SBError SBPlatform::Get(SBFileSpec &src, SBFileSpec &dst) {
523baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBPlatform, Get,
524baf5664fSJonas Devlieghere                      (lldb::SBFileSpec &, lldb::SBFileSpec &), src, dst);
525baf5664fSJonas Devlieghere 
526fbb76349SGreg Clayton   SBError sb_error;
527fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
528b9c1b51eSKate Stone   if (platform_sp) {
529fbb76349SGreg Clayton     sb_error.ref() = platform_sp->GetFile(src.ref(), dst.ref());
530b9c1b51eSKate Stone   } else {
531fbb76349SGreg Clayton     sb_error.SetErrorString("invalid platform");
532fbb76349SGreg Clayton   }
533baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
534fbb76349SGreg Clayton }
535fbb76349SGreg Clayton 
536b9c1b51eSKate Stone SBError SBPlatform::Put(SBFileSpec &src, SBFileSpec &dst) {
537baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBPlatform, Put,
538baf5664fSJonas Devlieghere                      (lldb::SBFileSpec &, lldb::SBFileSpec &), src, dst);
539baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
540baf5664fSJonas Devlieghere       ExecuteConnected([&](const lldb::PlatformSP &platform_sp) {
541b9c1b51eSKate Stone         if (src.Exists()) {
542baf5664fSJonas Devlieghere           uint32_t permissions =
543baf5664fSJonas Devlieghere               FileSystem::Instance().GetPermissions(src.ref());
544b9c1b51eSKate Stone           if (permissions == 0) {
5453a58d898SJonas Devlieghere             if (FileSystem::Instance().IsDirectory(src.ref()))
546fbb76349SGreg Clayton               permissions = eFilePermissionsDirectoryDefault;
547fbb76349SGreg Clayton             else
548fbb76349SGreg Clayton               permissions = eFilePermissionsFileDefault;
549fbb76349SGreg Clayton           }
550fbb76349SGreg Clayton 
5511ef7b2c8SOleksiy Vyalov           return platform_sp->PutFile(src.ref(), dst.ref(), permissions);
552fbb76349SGreg Clayton         }
5531ef7b2c8SOleksiy Vyalov 
55497206d57SZachary Turner         Status error;
555b9c1b51eSKate Stone         error.SetErrorStringWithFormat("'src' argument doesn't exist: '%s'",
556b9c1b51eSKate Stone                                        src.ref().GetPath().c_str());
5571ef7b2c8SOleksiy Vyalov         return error;
558baf5664fSJonas Devlieghere       }));
559fbb76349SGreg Clayton }
560fbb76349SGreg Clayton 
561b9c1b51eSKate Stone SBError SBPlatform::Install(SBFileSpec &src, SBFileSpec &dst) {
562baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBPlatform, Install,
563baf5664fSJonas Devlieghere                      (lldb::SBFileSpec &, lldb::SBFileSpec &), src, dst);
564baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
565baf5664fSJonas Devlieghere       ExecuteConnected([&](const lldb::PlatformSP &platform_sp) {
566fbb76349SGreg Clayton         if (src.Exists())
5671ef7b2c8SOleksiy Vyalov           return platform_sp->Install(src.ref(), dst.ref());
5681ef7b2c8SOleksiy Vyalov 
56997206d57SZachary Turner         Status error;
570b9c1b51eSKate Stone         error.SetErrorStringWithFormat("'src' argument doesn't exist: '%s'",
571b9c1b51eSKate Stone                                        src.ref().GetPath().c_str());
5721ef7b2c8SOleksiy Vyalov         return error;
573baf5664fSJonas Devlieghere       }));
574fbb76349SGreg Clayton }
575fbb76349SGreg Clayton 
576b9c1b51eSKate Stone SBError SBPlatform::Run(SBPlatformShellCommand &shell_command) {
577baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBPlatform, Run,
578baf5664fSJonas Devlieghere                      (lldb::SBPlatformShellCommand &), shell_command);
579bc0a35f3SJonas Devlieghere   return LLDB_RECORD_RESULT(
580bc0a35f3SJonas Devlieghere       ExecuteConnected([&](const lldb::PlatformSP &platform_sp) {
581fbb76349SGreg Clayton         const char *command = shell_command.GetCommand();
5821ef7b2c8SOleksiy Vyalov         if (!command)
58397206d57SZachary Turner           return Status("invalid shell command (empty)");
5841ef7b2c8SOleksiy Vyalov 
585fbb76349SGreg Clayton         const char *working_dir = shell_command.GetWorkingDirectory();
586248a1305SKonrad Kleine         if (working_dir == nullptr) {
587fbb76349SGreg Clayton           working_dir = platform_sp->GetWorkingDirectory().GetCString();
588fbb76349SGreg Clayton           if (working_dir)
589fbb76349SGreg Clayton             shell_command.SetWorkingDirectory(working_dir);
590fbb76349SGreg Clayton         }
591bc0a35f3SJonas Devlieghere         return platform_sp->RunShellCommand(
592bc0a35f3SJonas Devlieghere             shell_command.m_opaque_ptr->m_shell, command, FileSpec(working_dir),
593fbb76349SGreg Clayton             &shell_command.m_opaque_ptr->m_status,
594fbb76349SGreg Clayton             &shell_command.m_opaque_ptr->m_signo,
595fbb76349SGreg Clayton             &shell_command.m_opaque_ptr->m_output,
59619dd1a0eSPavel Labath             shell_command.m_opaque_ptr->m_timeout);
597baf5664fSJonas Devlieghere       }));
598fbb76349SGreg Clayton }
5991ef7b2c8SOleksiy Vyalov 
600b9c1b51eSKate Stone SBError SBPlatform::Launch(SBLaunchInfo &launch_info) {
601baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBPlatform, Launch, (lldb::SBLaunchInfo &),
602baf5664fSJonas Devlieghere                      launch_info);
603baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
604baf5664fSJonas Devlieghere       ExecuteConnected([&](const lldb::PlatformSP &platform_sp) {
60562930e57SPavel Labath         ProcessLaunchInfo info = launch_info.ref();
60662930e57SPavel Labath         Status error = platform_sp->LaunchProcess(info);
60762930e57SPavel Labath         launch_info.set_ref(info);
60862930e57SPavel Labath         return error;
609baf5664fSJonas Devlieghere       }));
6101ef7b2c8SOleksiy Vyalov }
6111ef7b2c8SOleksiy Vyalov 
612b9c1b51eSKate Stone SBError SBPlatform::Kill(const lldb::pid_t pid) {
613baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBPlatform, Kill, (const lldb::pid_t), pid);
614baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
615baf5664fSJonas Devlieghere       ExecuteConnected([&](const lldb::PlatformSP &platform_sp) {
6161ef7b2c8SOleksiy Vyalov         return platform_sp->KillProcess(pid);
617baf5664fSJonas Devlieghere       }));
6181ef7b2c8SOleksiy Vyalov }
6191ef7b2c8SOleksiy Vyalov 
620b9c1b51eSKate Stone SBError SBPlatform::ExecuteConnected(
62197206d57SZachary Turner     const std::function<Status(const lldb::PlatformSP &)> &func) {
6221ef7b2c8SOleksiy Vyalov   SBError sb_error;
6231ef7b2c8SOleksiy Vyalov   const auto platform_sp(GetSP());
624b9c1b51eSKate Stone   if (platform_sp) {
6251ef7b2c8SOleksiy Vyalov     if (platform_sp->IsConnected())
6261ef7b2c8SOleksiy Vyalov       sb_error.ref() = func(platform_sp);
6271ef7b2c8SOleksiy Vyalov     else
628fbb76349SGreg Clayton       sb_error.SetErrorString("not connected");
629b9c1b51eSKate Stone   } else
630fbb76349SGreg Clayton     sb_error.SetErrorString("invalid platform");
6311ef7b2c8SOleksiy Vyalov 
632fbb76349SGreg Clayton   return sb_error;
633fbb76349SGreg Clayton }
634fbb76349SGreg Clayton 
635b9c1b51eSKate Stone SBError SBPlatform::MakeDirectory(const char *path, uint32_t file_permissions) {
636baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBPlatform, MakeDirectory,
637baf5664fSJonas Devlieghere                      (const char *, uint32_t), path, file_permissions);
638baf5664fSJonas Devlieghere 
639fbb76349SGreg Clayton   SBError sb_error;
640fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
641b9c1b51eSKate Stone   if (platform_sp) {
642b9c1b51eSKate Stone     sb_error.ref() =
6438f3be7a3SJonas Devlieghere         platform_sp->MakeDirectory(FileSpec(path), file_permissions);
644b9c1b51eSKate Stone   } else {
645fbb76349SGreg Clayton     sb_error.SetErrorString("invalid platform");
646fbb76349SGreg Clayton   }
647baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
648fbb76349SGreg Clayton }
649fbb76349SGreg Clayton 
650b9c1b51eSKate Stone uint32_t SBPlatform::GetFilePermissions(const char *path) {
651baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(uint32_t, SBPlatform, GetFilePermissions, (const char *),
652baf5664fSJonas Devlieghere                      path);
653baf5664fSJonas Devlieghere 
654fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
655b9c1b51eSKate Stone   if (platform_sp) {
656fbb76349SGreg Clayton     uint32_t file_permissions = 0;
6578f3be7a3SJonas Devlieghere     platform_sp->GetFilePermissions(FileSpec(path), file_permissions);
658fbb76349SGreg Clayton     return file_permissions;
659fbb76349SGreg Clayton   }
660fbb76349SGreg Clayton   return 0;
661fbb76349SGreg Clayton }
662fbb76349SGreg Clayton 
663b9c1b51eSKate Stone SBError SBPlatform::SetFilePermissions(const char *path,
664b9c1b51eSKate Stone                                        uint32_t file_permissions) {
665baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBPlatform, SetFilePermissions,
666baf5664fSJonas Devlieghere                      (const char *, uint32_t), path, file_permissions);
667baf5664fSJonas Devlieghere 
668fbb76349SGreg Clayton   SBError sb_error;
669fbb76349SGreg Clayton   PlatformSP platform_sp(GetSP());
670b9c1b51eSKate Stone   if (platform_sp) {
6718f3be7a3SJonas Devlieghere     sb_error.ref() =
6728f3be7a3SJonas Devlieghere         platform_sp->SetFilePermissions(FileSpec(path), file_permissions);
673b9c1b51eSKate Stone   } else {
674fbb76349SGreg Clayton     sb_error.SetErrorString("invalid platform");
675fbb76349SGreg Clayton   }
676baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
677fbb76349SGreg Clayton }
678fbb76349SGreg Clayton 
679b9c1b51eSKate Stone SBUnixSignals SBPlatform::GetUnixSignals() const {
680baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBUnixSignals, SBPlatform,
681baf5664fSJonas Devlieghere                                    GetUnixSignals);
68298d0a4b3SChaoren Lin 
683baf5664fSJonas Devlieghere   if (auto platform_sp = GetSP())
684baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBUnixSignals{platform_sp});
685baf5664fSJonas Devlieghere 
686baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBUnixSignals());
68798d0a4b3SChaoren Lin }
688ae211eceSMichal Gorny 
689ca69be21SWalter Erquinigo SBEnvironment SBPlatform::GetEnvironment() {
690ca69be21SWalter Erquinigo   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBEnvironment, SBPlatform, GetEnvironment);
691ca69be21SWalter Erquinigo   PlatformSP platform_sp(GetSP());
692ca69be21SWalter Erquinigo 
693ca69be21SWalter Erquinigo   if (platform_sp) {
694ca69be21SWalter Erquinigo     return LLDB_RECORD_RESULT(SBEnvironment(platform_sp->GetEnvironment()));
695ca69be21SWalter Erquinigo   }
696ca69be21SWalter Erquinigo 
697ca69be21SWalter Erquinigo   return LLDB_RECORD_RESULT(SBEnvironment());
698ca69be21SWalter Erquinigo }
699ca69be21SWalter Erquinigo 
700ae211eceSMichal Gorny namespace lldb_private {
701ae211eceSMichal Gorny namespace repro {
702ae211eceSMichal Gorny 
703bc0a35f3SJonas Devlieghere template <> void RegisterMethods<SBPlatformConnectOptions>(Registry &R) {
704ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBPlatformConnectOptions, (const char *));
705ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBPlatformConnectOptions,
706ae211eceSMichal Gorny                             (const lldb::SBPlatformConnectOptions &));
707ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(
708ede5cd9aSJonas Devlieghere       SBPlatformConnectOptions &,
709ae211eceSMichal Gorny       SBPlatformConnectOptions, operator=,(
710ae211eceSMichal Gorny                                     const lldb::SBPlatformConnectOptions &));
711ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBPlatformConnectOptions, GetURL, ());
712bc0a35f3SJonas Devlieghere   LLDB_REGISTER_METHOD(void, SBPlatformConnectOptions, SetURL, (const char *));
713ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBPlatformConnectOptions, GetRsyncEnabled, ());
714ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBPlatformConnectOptions, EnableRsync,
715ae211eceSMichal Gorny                        (const char *, const char *, bool));
716ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBPlatformConnectOptions, DisableRsync, ());
717ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBPlatformConnectOptions,
718ae211eceSMichal Gorny                        GetLocalCacheDirectory, ());
719ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBPlatformConnectOptions, SetLocalCacheDirectory,
720ae211eceSMichal Gorny                        (const char *));
721ae211eceSMichal Gorny }
722ae211eceSMichal Gorny 
723bc0a35f3SJonas Devlieghere template <> void RegisterMethods<SBPlatformShellCommand>(Registry &R) {
724ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBPlatformShellCommand, (const char *));
725ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBPlatformShellCommand,
726ae211eceSMichal Gorny                             (const lldb::SBPlatformShellCommand &));
727ede5cd9aSJonas Devlieghere   LLDB_REGISTER_METHOD(
728ede5cd9aSJonas Devlieghere       SBPlatformShellCommand &,
729ede5cd9aSJonas Devlieghere       SBPlatformShellCommand, operator=,(const lldb::SBPlatformShellCommand &));
730ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBPlatformShellCommand, Clear, ());
731addb5148SMed Ismail Bennani   LLDB_REGISTER_METHOD(const char *, SBPlatformShellCommand, GetShell, ());
732addb5148SMed Ismail Bennani   LLDB_REGISTER_METHOD(void, SBPlatformShellCommand, SetShell, (const char *));
733ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBPlatformShellCommand, GetCommand, ());
734ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBPlatformShellCommand, SetCommand,
735ae211eceSMichal Gorny                        (const char *));
736ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBPlatformShellCommand,
737ae211eceSMichal Gorny                        GetWorkingDirectory, ());
738ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBPlatformShellCommand, SetWorkingDirectory,
739ae211eceSMichal Gorny                        (const char *));
740bc0a35f3SJonas Devlieghere   LLDB_REGISTER_METHOD(uint32_t, SBPlatformShellCommand, GetTimeoutSeconds, ());
741ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBPlatformShellCommand, SetTimeoutSeconds,
742ae211eceSMichal Gorny                        (uint32_t));
743ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(int, SBPlatformShellCommand, GetSignal, ());
744ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(int, SBPlatformShellCommand, GetStatus, ());
745ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBPlatformShellCommand, GetOutput, ());
746ae211eceSMichal Gorny }
747ae211eceSMichal Gorny 
748bc0a35f3SJonas Devlieghere template <> void RegisterMethods<SBPlatform>(Registry &R) {
749ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBPlatform, ());
750ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBPlatform, (const char *));
75166dc4672SJonas Devlieghere   LLDB_REGISTER_CONSTRUCTOR(SBPlatform, (const lldb::SBPlatform &));
752bc0a35f3SJonas Devlieghere   LLDB_REGISTER_CONSTRUCTOR(SBPlatformShellCommand,
753bc0a35f3SJonas Devlieghere                             (const char *, const char *));
754ede5cd9aSJonas Devlieghere   LLDB_REGISTER_METHOD(SBPlatform &,
755ede5cd9aSJonas Devlieghere                        SBPlatform, operator=,(const lldb::SBPlatform &));
756ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBPlatform, IsValid, ());
757ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBPlatform, operator bool,());
758ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBPlatform, Clear, ());
759ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBPlatform, GetName, ());
760ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBPlatform, GetWorkingDirectory, ());
761ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBPlatform, SetWorkingDirectory, (const char *));
762ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBError, SBPlatform, ConnectRemote,
763ae211eceSMichal Gorny                        (lldb::SBPlatformConnectOptions &));
764ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBPlatform, DisconnectRemote, ());
765ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBPlatform, IsConnected, ());
766ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBPlatform, GetTriple, ());
767ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBPlatform, GetOSBuild, ());
768ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBPlatform, GetOSDescription, ());
769ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBPlatform, GetHostname, ());
770ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBPlatform, GetOSMajorVersion, ());
771ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBPlatform, GetOSMinorVersion, ());
772ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBPlatform, GetOSUpdateVersion, ());
773ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBError, SBPlatform, Get,
774ae211eceSMichal Gorny                        (lldb::SBFileSpec &, lldb::SBFileSpec &));
775ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBError, SBPlatform, Put,
776ae211eceSMichal Gorny                        (lldb::SBFileSpec &, lldb::SBFileSpec &));
777ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBError, SBPlatform, Install,
778ae211eceSMichal Gorny                        (lldb::SBFileSpec &, lldb::SBFileSpec &));
779ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBError, SBPlatform, Run,
780ae211eceSMichal Gorny                        (lldb::SBPlatformShellCommand &));
781ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBError, SBPlatform, Launch,
782ae211eceSMichal Gorny                        (lldb::SBLaunchInfo &));
783ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBError, SBPlatform, Kill, (const lldb::pid_t));
784ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBError, SBPlatform, MakeDirectory,
785ae211eceSMichal Gorny                        (const char *, uint32_t));
786ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBPlatform, GetFilePermissions,
787ae211eceSMichal Gorny                        (const char *));
788ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBError, SBPlatform, SetFilePermissions,
789ae211eceSMichal Gorny                        (const char *, uint32_t));
790ca69be21SWalter Erquinigo   LLDB_REGISTER_METHOD(lldb::SBEnvironment, SBPlatform, GetEnvironment, ());
791ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBUnixSignals, SBPlatform, GetUnixSignals,
792ae211eceSMichal Gorny                              ());
7935c2bf577SJonas Devlieghere   LLDB_REGISTER_STATIC_METHOD(lldb::SBPlatform, SBPlatform, GetHostPlatform,
7945c2bf577SJonas Devlieghere                               ());
795ae211eceSMichal Gorny }
796ae211eceSMichal Gorny 
797bc0a35f3SJonas Devlieghere } // namespace repro
798bc0a35f3SJonas Devlieghere } // namespace lldb_private
799