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 
959998b7bSJonas Devlieghere #include "lldb/API/SBHostOS.h"
10baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h"
1130fdc8d8SChris Lattner #include "lldb/API/SBError.h"
1259998b7bSJonas Devlieghere #include "lldb/Host/Config.h"
138f3be7a3SJonas Devlieghere #include "lldb/Host/FileSystem.h"
1430fdc8d8SChris Lattner #include "lldb/Host/Host.h"
1542ff0ad8SZachary Turner #include "lldb/Host/HostInfo.h"
16c3018992SZachary Turner #include "lldb/Host/HostNativeThread.h"
1739de3110SZachary Turner #include "lldb/Host/HostThread.h"
1839de3110SZachary Turner #include "lldb/Host/ThreadLauncher.h"
195713a05bSZachary Turner #include "lldb/Utility/FileSpec.h"
2039de3110SZachary Turner 
21bdf08924SZachary Turner #include "Plugins/ExpressionParser/Clang/ClangHost.h"
22*4e26cf2cSJonas Devlieghere #if LLDB_ENABLE_PYTHON
232df331b0SPavel Labath #include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h"
24af8b24faSPavel Labath #endif
25bdf08924SZachary Turner 
267eafdcedSPavel Labath #include "llvm/ADT/SmallString.h"
27b9c1b51eSKate Stone #include "llvm/Support/Path.h"
28878ae018SJason Molenda 
2930fdc8d8SChris Lattner using namespace lldb;
3030fdc8d8SChris Lattner using namespace lldb_private;
3130fdc8d8SChris Lattner 
32b9c1b51eSKate Stone SBFileSpec SBHostOS::GetProgramFileSpec() {
33baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBFileSpec, SBHostOS,
34baf5664fSJonas Devlieghere                                     GetProgramFileSpec);
35baf5664fSJonas Devlieghere 
3630fdc8d8SChris Lattner   SBFileSpec sb_filespec;
37a21fee0eSZachary Turner   sb_filespec.SetFileSpec(HostInfo::GetProgramFileSpec());
38baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_filespec);
3930fdc8d8SChris Lattner }
4030fdc8d8SChris Lattner 
41b9c1b51eSKate Stone SBFileSpec SBHostOS::GetLLDBPythonPath() {
42baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBFileSpec, SBHostOS,
43baf5664fSJonas Devlieghere                                     GetLLDBPythonPath);
44baf5664fSJonas Devlieghere 
45baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(GetLLDBPath(ePathTypePythonDir));
46e2231ac7SJim Ingham }
47e2231ac7SJim Ingham 
48b9c1b51eSKate Stone SBFileSpec SBHostOS::GetLLDBPath(lldb::PathType path_type) {
49baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(lldb::SBFileSpec, SBHostOS, GetLLDBPath,
50baf5664fSJonas Devlieghere                             (lldb::PathType), path_type);
51baf5664fSJonas Devlieghere 
5206357c93SGreg Clayton   FileSpec fspec;
5360f028ffSPavel Labath   switch (path_type) {
5460f028ffSPavel Labath   case ePathTypeLLDBShlibDir:
5560f028ffSPavel Labath     fspec = HostInfo::GetShlibDir();
5660f028ffSPavel Labath     break;
5760f028ffSPavel Labath   case ePathTypeSupportExecutableDir:
5860f028ffSPavel Labath     fspec = HostInfo::GetSupportExeDir();
5960f028ffSPavel Labath     break;
6060f028ffSPavel Labath   case ePathTypeHeaderDir:
6160f028ffSPavel Labath     fspec = HostInfo::GetHeaderDir();
6260f028ffSPavel Labath     break;
6360f028ffSPavel Labath   case ePathTypePythonDir:
64*4e26cf2cSJonas Devlieghere #if LLDB_ENABLE_PYTHON
652df331b0SPavel Labath     fspec = ScriptInterpreterPython::GetPythonDir();
66af8b24faSPavel Labath #endif
6760f028ffSPavel Labath     break;
6860f028ffSPavel Labath   case ePathTypeLLDBSystemPlugins:
6960f028ffSPavel Labath     fspec = HostInfo::GetSystemPluginDir();
7060f028ffSPavel Labath     break;
7160f028ffSPavel Labath   case ePathTypeLLDBUserPlugins:
7260f028ffSPavel Labath     fspec = HostInfo::GetUserPluginDir();
7360f028ffSPavel Labath     break;
7460f028ffSPavel Labath   case ePathTypeLLDBTempSystemDir:
7560f028ffSPavel Labath     fspec = HostInfo::GetProcessTempDir();
7660f028ffSPavel Labath     break;
7760f028ffSPavel Labath   case ePathTypeGlobalLLDBTempSystemDir:
7860f028ffSPavel Labath     fspec = HostInfo::GetGlobalTempDir();
7960f028ffSPavel Labath     break;
8060f028ffSPavel Labath   case ePathTypeClangDir:
81bdf08924SZachary Turner     fspec = GetClangResourceDir();
8260f028ffSPavel Labath     break;
8360f028ffSPavel Labath   }
8460f028ffSPavel Labath 
8560f028ffSPavel Labath   SBFileSpec sb_fspec;
8606357c93SGreg Clayton   sb_fspec.SetFileSpec(fspec);
87baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_fspec);
8806357c93SGreg Clayton }
8906357c93SGreg Clayton 
90b9c1b51eSKate Stone SBFileSpec SBHostOS::GetUserHomeDirectory() {
91baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBFileSpec, SBHostOS,
92baf5664fSJonas Devlieghere                                     GetUserHomeDirectory);
93baf5664fSJonas Devlieghere 
94878ae018SJason Molenda   SBFileSpec sb_fspec;
95878ae018SJason Molenda 
96878ae018SJason Molenda   llvm::SmallString<64> home_dir_path;
97878ae018SJason Molenda   llvm::sys::path::home_directory(home_dir_path);
988f3be7a3SJonas Devlieghere   FileSpec homedir(home_dir_path.c_str());
998f3be7a3SJonas Devlieghere   FileSystem::Instance().Resolve(homedir);
100878ae018SJason Molenda 
101878ae018SJason Molenda   sb_fspec.SetFileSpec(homedir);
102baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_fspec);
103878ae018SJason Molenda }
104878ae018SJason Molenda 
105b9c1b51eSKate Stone lldb::thread_t SBHostOS::ThreadCreate(const char *name,
10699fbc076SDeepak Panickal                                       lldb::thread_func_t thread_function,
107b9c1b51eSKate Stone                                       void *thread_arg, SBError *error_ptr) {
10884e571ceSJonas Devlieghere   LLDB_RECORD_DUMMY(lldb::thread_t, SBHostOS, ThreadCreate,
10984e571ceSJonas Devlieghere                     (lldb::thread_func_t, void *, SBError *), name,
11084e571ceSJonas Devlieghere                     thread_function, thread_arg, error_ptr);
111f39c2e18SJonas Devlieghere   llvm::Expected<HostThread> thread =
112f39c2e18SJonas Devlieghere       ThreadLauncher::LaunchThread(name, thread_function, thread_arg);
113f39c2e18SJonas Devlieghere   if (!thread) {
114f39c2e18SJonas Devlieghere     if (error_ptr)
115f39c2e18SJonas Devlieghere       error_ptr->SetError(Status(thread.takeError()));
116f39c2e18SJonas Devlieghere     else
117f39c2e18SJonas Devlieghere       llvm::consumeError(thread.takeError());
118f39c2e18SJonas Devlieghere     return LLDB_INVALID_HOST_THREAD;
119f39c2e18SJonas Devlieghere   }
120f39c2e18SJonas Devlieghere 
121f39c2e18SJonas Devlieghere   return thread->Release();
12230fdc8d8SChris Lattner }
12330fdc8d8SChris Lattner 
124baf5664fSJonas Devlieghere void SBHostOS::ThreadCreated(const char *name) {
125baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(void, SBHostOS, ThreadCreated, (const char *),
126baf5664fSJonas Devlieghere                             name);
127baf5664fSJonas Devlieghere }
12830fdc8d8SChris Lattner 
129b9c1b51eSKate Stone bool SBHostOS::ThreadCancel(lldb::thread_t thread, SBError *error_ptr) {
13084e571ceSJonas Devlieghere   LLDB_RECORD_DUMMY(bool, SBHostOS, ThreadCancel,
131baf5664fSJonas Devlieghere                             (lldb::thread_t, lldb::SBError *), thread,
132baf5664fSJonas Devlieghere                             error_ptr);
133baf5664fSJonas Devlieghere 
13497206d57SZachary Turner   Status error;
13539de3110SZachary Turner   HostThread host_thread(thread);
13639de3110SZachary Turner   error = host_thread.Cancel();
13739de3110SZachary Turner   if (error_ptr)
13839de3110SZachary Turner     error_ptr->SetError(error);
13939de3110SZachary Turner   host_thread.Release();
14039de3110SZachary Turner   return error.Success();
14130fdc8d8SChris Lattner }
14230fdc8d8SChris Lattner 
143b9c1b51eSKate Stone bool SBHostOS::ThreadDetach(lldb::thread_t thread, SBError *error_ptr) {
14484e571ceSJonas Devlieghere   LLDB_RECORD_DUMMY(bool, SBHostOS, ThreadDetach,
145baf5664fSJonas Devlieghere                             (lldb::thread_t, lldb::SBError *), thread,
146baf5664fSJonas Devlieghere                             error_ptr);
147baf5664fSJonas Devlieghere 
14897206d57SZachary Turner   Status error;
14939de3110SZachary Turner #if defined(_WIN32)
15039de3110SZachary Turner   if (error_ptr)
15139de3110SZachary Turner     error_ptr->SetErrorString("ThreadDetach is not supported on this platform");
15239de3110SZachary Turner #else
15339de3110SZachary Turner   HostThread host_thread(thread);
154c3018992SZachary Turner   error = host_thread.GetNativeThread().Detach();
15539de3110SZachary Turner   if (error_ptr)
15639de3110SZachary Turner     error_ptr->SetError(error);
15739de3110SZachary Turner   host_thread.Release();
15839de3110SZachary Turner #endif
15939de3110SZachary Turner   return error.Success();
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
162b9c1b51eSKate Stone bool SBHostOS::ThreadJoin(lldb::thread_t thread, lldb::thread_result_t *result,
163b9c1b51eSKate Stone                           SBError *error_ptr) {
16484e571ceSJonas Devlieghere   LLDB_RECORD_DUMMY(
165baf5664fSJonas Devlieghere       bool, SBHostOS, ThreadJoin,
166baf5664fSJonas Devlieghere       (lldb::thread_t, lldb::thread_result_t *, lldb::SBError *), thread,
167baf5664fSJonas Devlieghere       result, error_ptr);
168baf5664fSJonas Devlieghere 
16997206d57SZachary Turner   Status error;
17039de3110SZachary Turner   HostThread host_thread(thread);
17139de3110SZachary Turner   error = host_thread.Join(result);
17239de3110SZachary Turner   if (error_ptr)
17339de3110SZachary Turner     error_ptr->SetError(error);
17439de3110SZachary Turner   host_thread.Release();
17539de3110SZachary Turner   return error.Success();
17630fdc8d8SChris Lattner }
177ae211eceSMichal Gorny 
178ae211eceSMichal Gorny namespace lldb_private {
179ae211eceSMichal Gorny namespace repro {
180ae211eceSMichal Gorny 
181ae211eceSMichal Gorny template <>
182ae211eceSMichal Gorny void RegisterMethods<SBHostOS>(Registry &R) {
183ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBFileSpec, SBHostOS, GetProgramFileSpec,
184ae211eceSMichal Gorny                               ());
185ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBFileSpec, SBHostOS, GetLLDBPythonPath,
186ae211eceSMichal Gorny                               ());
187ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBFileSpec, SBHostOS, GetLLDBPath,
188ae211eceSMichal Gorny                               (lldb::PathType));
189ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBFileSpec, SBHostOS,
190ae211eceSMichal Gorny                               GetUserHomeDirectory, ());
191ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(void, SBHostOS, ThreadCreated, (const char *));
192ae211eceSMichal Gorny }
193ae211eceSMichal Gorny 
194ae211eceSMichal Gorny }
195ae211eceSMichal Gorny }
196