130fdc8d8SChris Lattner //===-- SBHostOS.cpp --------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
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
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
9af8b24faSPavel Labath #ifndef LLDB_DISABLE_PYTHON
10af8b24faSPavel Labath #include "Plugins/ScriptInterpreter/Python/lldb-python.h"
11af8b24faSPavel Labath #endif
12af8b24faSPavel Labath 
13baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h"
1430fdc8d8SChris Lattner #include "lldb/API/SBError.h"
158f3be7a3SJonas Devlieghere #include "lldb/API/SBHostOS.h"
168f3be7a3SJonas Devlieghere #include "lldb/Host/FileSystem.h"
1730fdc8d8SChris Lattner #include "lldb/Host/Host.h"
1842ff0ad8SZachary Turner #include "lldb/Host/HostInfo.h"
19c3018992SZachary Turner #include "lldb/Host/HostNativeThread.h"
2039de3110SZachary Turner #include "lldb/Host/HostThread.h"
2139de3110SZachary Turner #include "lldb/Host/ThreadLauncher.h"
225713a05bSZachary Turner #include "lldb/Utility/FileSpec.h"
2339de3110SZachary Turner 
24bdf08924SZachary Turner #include "Plugins/ExpressionParser/Clang/ClangHost.h"
25af8b24faSPavel Labath #ifndef LLDB_DISABLE_PYTHON
262df331b0SPavel Labath #include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h"
27af8b24faSPavel Labath #endif
28bdf08924SZachary Turner 
297eafdcedSPavel Labath #include "llvm/ADT/SmallString.h"
30b9c1b51eSKate Stone #include "llvm/Support/Path.h"
31878ae018SJason Molenda 
3230fdc8d8SChris Lattner using namespace lldb;
3330fdc8d8SChris Lattner using namespace lldb_private;
3430fdc8d8SChris Lattner 
35b9c1b51eSKate Stone SBFileSpec SBHostOS::GetProgramFileSpec() {
36baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBFileSpec, SBHostOS,
37baf5664fSJonas Devlieghere                                     GetProgramFileSpec);
38baf5664fSJonas Devlieghere 
3930fdc8d8SChris Lattner   SBFileSpec sb_filespec;
40a21fee0eSZachary Turner   sb_filespec.SetFileSpec(HostInfo::GetProgramFileSpec());
41baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_filespec);
4230fdc8d8SChris Lattner }
4330fdc8d8SChris Lattner 
44b9c1b51eSKate Stone SBFileSpec SBHostOS::GetLLDBPythonPath() {
45baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBFileSpec, SBHostOS,
46baf5664fSJonas Devlieghere                                     GetLLDBPythonPath);
47baf5664fSJonas Devlieghere 
48baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(GetLLDBPath(ePathTypePythonDir));
49e2231ac7SJim Ingham }
50e2231ac7SJim Ingham 
51b9c1b51eSKate Stone SBFileSpec SBHostOS::GetLLDBPath(lldb::PathType path_type) {
52baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(lldb::SBFileSpec, SBHostOS, GetLLDBPath,
53baf5664fSJonas Devlieghere                             (lldb::PathType), path_type);
54baf5664fSJonas Devlieghere 
5506357c93SGreg Clayton   FileSpec fspec;
5660f028ffSPavel Labath   switch (path_type) {
5760f028ffSPavel Labath   case ePathTypeLLDBShlibDir:
5860f028ffSPavel Labath     fspec = HostInfo::GetShlibDir();
5960f028ffSPavel Labath     break;
6060f028ffSPavel Labath   case ePathTypeSupportExecutableDir:
6160f028ffSPavel Labath     fspec = HostInfo::GetSupportExeDir();
6260f028ffSPavel Labath     break;
6360f028ffSPavel Labath   case ePathTypeHeaderDir:
6460f028ffSPavel Labath     fspec = HostInfo::GetHeaderDir();
6560f028ffSPavel Labath     break;
6660f028ffSPavel Labath   case ePathTypePythonDir:
67af8b24faSPavel Labath #ifndef LLDB_DISABLE_PYTHON
682df331b0SPavel Labath     fspec = ScriptInterpreterPython::GetPythonDir();
69af8b24faSPavel Labath #endif
7060f028ffSPavel Labath     break;
7160f028ffSPavel Labath   case ePathTypeLLDBSystemPlugins:
7260f028ffSPavel Labath     fspec = HostInfo::GetSystemPluginDir();
7360f028ffSPavel Labath     break;
7460f028ffSPavel Labath   case ePathTypeLLDBUserPlugins:
7560f028ffSPavel Labath     fspec = HostInfo::GetUserPluginDir();
7660f028ffSPavel Labath     break;
7760f028ffSPavel Labath   case ePathTypeLLDBTempSystemDir:
7860f028ffSPavel Labath     fspec = HostInfo::GetProcessTempDir();
7960f028ffSPavel Labath     break;
8060f028ffSPavel Labath   case ePathTypeGlobalLLDBTempSystemDir:
8160f028ffSPavel Labath     fspec = HostInfo::GetGlobalTempDir();
8260f028ffSPavel Labath     break;
8360f028ffSPavel Labath   case ePathTypeClangDir:
84bdf08924SZachary Turner     fspec = GetClangResourceDir();
8560f028ffSPavel Labath     break;
8660f028ffSPavel Labath   }
8760f028ffSPavel Labath 
8860f028ffSPavel Labath   SBFileSpec sb_fspec;
8906357c93SGreg Clayton   sb_fspec.SetFileSpec(fspec);
90baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_fspec);
9106357c93SGreg Clayton }
9206357c93SGreg Clayton 
93b9c1b51eSKate Stone SBFileSpec SBHostOS::GetUserHomeDirectory() {
94baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBFileSpec, SBHostOS,
95baf5664fSJonas Devlieghere                                     GetUserHomeDirectory);
96baf5664fSJonas Devlieghere 
97878ae018SJason Molenda   SBFileSpec sb_fspec;
98878ae018SJason Molenda 
99878ae018SJason Molenda   llvm::SmallString<64> home_dir_path;
100878ae018SJason Molenda   llvm::sys::path::home_directory(home_dir_path);
1018f3be7a3SJonas Devlieghere   FileSpec homedir(home_dir_path.c_str());
1028f3be7a3SJonas Devlieghere   FileSystem::Instance().Resolve(homedir);
103878ae018SJason Molenda 
104878ae018SJason Molenda   sb_fspec.SetFileSpec(homedir);
105baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_fspec);
106878ae018SJason Molenda }
107878ae018SJason Molenda 
108b9c1b51eSKate Stone lldb::thread_t SBHostOS::ThreadCreate(const char *name,
10999fbc076SDeepak Panickal                                       lldb::thread_func_t thread_function,
110b9c1b51eSKate Stone                                       void *thread_arg, SBError *error_ptr) {
11184e571ceSJonas Devlieghere   LLDB_RECORD_DUMMY(lldb::thread_t, SBHostOS, ThreadCreate,
11284e571ceSJonas Devlieghere                     (lldb::thread_func_t, void *, SBError *), name,
11384e571ceSJonas Devlieghere                     thread_function, thread_arg, error_ptr);
114b9c1b51eSKate Stone   HostThread thread(ThreadLauncher::LaunchThread(
115b9c1b51eSKate Stone       name, thread_function, thread_arg, error_ptr ? error_ptr->get() : NULL));
11639de3110SZachary Turner   return thread.Release();
11730fdc8d8SChris Lattner }
11830fdc8d8SChris Lattner 
119baf5664fSJonas Devlieghere void SBHostOS::ThreadCreated(const char *name) {
120baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(void, SBHostOS, ThreadCreated, (const char *),
121baf5664fSJonas Devlieghere                             name);
122baf5664fSJonas Devlieghere }
12330fdc8d8SChris Lattner 
124b9c1b51eSKate Stone bool SBHostOS::ThreadCancel(lldb::thread_t thread, SBError *error_ptr) {
12584e571ceSJonas Devlieghere   LLDB_RECORD_DUMMY(bool, SBHostOS, ThreadCancel,
126baf5664fSJonas Devlieghere                             (lldb::thread_t, lldb::SBError *), thread,
127baf5664fSJonas Devlieghere                             error_ptr);
128baf5664fSJonas Devlieghere 
12997206d57SZachary Turner   Status error;
13039de3110SZachary Turner   HostThread host_thread(thread);
13139de3110SZachary Turner   error = host_thread.Cancel();
13239de3110SZachary Turner   if (error_ptr)
13339de3110SZachary Turner     error_ptr->SetError(error);
13439de3110SZachary Turner   host_thread.Release();
13539de3110SZachary Turner   return error.Success();
13630fdc8d8SChris Lattner }
13730fdc8d8SChris Lattner 
138b9c1b51eSKate Stone bool SBHostOS::ThreadDetach(lldb::thread_t thread, SBError *error_ptr) {
13984e571ceSJonas Devlieghere   LLDB_RECORD_DUMMY(bool, SBHostOS, ThreadDetach,
140baf5664fSJonas Devlieghere                             (lldb::thread_t, lldb::SBError *), thread,
141baf5664fSJonas Devlieghere                             error_ptr);
142baf5664fSJonas Devlieghere 
14397206d57SZachary Turner   Status error;
14439de3110SZachary Turner #if defined(_WIN32)
14539de3110SZachary Turner   if (error_ptr)
14639de3110SZachary Turner     error_ptr->SetErrorString("ThreadDetach is not supported on this platform");
14739de3110SZachary Turner #else
14839de3110SZachary Turner   HostThread host_thread(thread);
149c3018992SZachary Turner   error = host_thread.GetNativeThread().Detach();
15039de3110SZachary Turner   if (error_ptr)
15139de3110SZachary Turner     error_ptr->SetError(error);
15239de3110SZachary Turner   host_thread.Release();
15339de3110SZachary Turner #endif
15439de3110SZachary Turner   return error.Success();
15530fdc8d8SChris Lattner }
15630fdc8d8SChris Lattner 
157b9c1b51eSKate Stone bool SBHostOS::ThreadJoin(lldb::thread_t thread, lldb::thread_result_t *result,
158b9c1b51eSKate Stone                           SBError *error_ptr) {
15984e571ceSJonas Devlieghere   LLDB_RECORD_DUMMY(
160baf5664fSJonas Devlieghere       bool, SBHostOS, ThreadJoin,
161baf5664fSJonas Devlieghere       (lldb::thread_t, lldb::thread_result_t *, lldb::SBError *), thread,
162baf5664fSJonas Devlieghere       result, error_ptr);
163baf5664fSJonas Devlieghere 
16497206d57SZachary Turner   Status error;
16539de3110SZachary Turner   HostThread host_thread(thread);
16639de3110SZachary Turner   error = host_thread.Join(result);
16739de3110SZachary Turner   if (error_ptr)
16839de3110SZachary Turner     error_ptr->SetError(error);
16939de3110SZachary Turner   host_thread.Release();
17039de3110SZachary Turner   return error.Success();
17130fdc8d8SChris Lattner }
172*ae211eceSMichal Gorny 
173*ae211eceSMichal Gorny namespace lldb_private {
174*ae211eceSMichal Gorny namespace repro {
175*ae211eceSMichal Gorny 
176*ae211eceSMichal Gorny template <>
177*ae211eceSMichal Gorny void RegisterMethods<SBHostOS>(Registry &R) {
178*ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBFileSpec, SBHostOS, GetProgramFileSpec,
179*ae211eceSMichal Gorny                               ());
180*ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBFileSpec, SBHostOS, GetLLDBPythonPath,
181*ae211eceSMichal Gorny                               ());
182*ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBFileSpec, SBHostOS, GetLLDBPath,
183*ae211eceSMichal Gorny                               (lldb::PathType));
184*ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBFileSpec, SBHostOS,
185*ae211eceSMichal Gorny                               GetUserHomeDirectory, ());
186*ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(void, SBHostOS, ThreadCreated, (const char *));
187*ae211eceSMichal Gorny }
188*ae211eceSMichal Gorny 
189*ae211eceSMichal Gorny }
190*ae211eceSMichal Gorny }
191