180814287SRaphael Isemann //===-- SBHostOS.cpp ------------------------------------------------------===//
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"
1030fdc8d8SChris Lattner #include "lldb/API/SBError.h"
1159998b7bSJonas Devlieghere #include "lldb/Host/Config.h"
128f3be7a3SJonas Devlieghere #include "lldb/Host/FileSystem.h"
1330fdc8d8SChris Lattner #include "lldb/Host/Host.h"
1442ff0ad8SZachary Turner #include "lldb/Host/HostInfo.h"
15c3018992SZachary Turner #include "lldb/Host/HostNativeThread.h"
1639de3110SZachary Turner #include "lldb/Host/HostThread.h"
1739de3110SZachary Turner #include "lldb/Host/ThreadLauncher.h"
185713a05bSZachary Turner #include "lldb/Utility/FileSpec.h"
191755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
2039de3110SZachary Turner
21bdf08924SZachary Turner #include "Plugins/ExpressionParser/Clang/ClangHost.h"
224e26cf2cSJonas 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
GetProgramFileSpec()32b9c1b51eSKate Stone SBFileSpec SBHostOS::GetProgramFileSpec() {
331755f5b1SJonas Devlieghere LLDB_INSTRUMENT();
34baf5664fSJonas Devlieghere
3530fdc8d8SChris Lattner SBFileSpec sb_filespec;
36a21fee0eSZachary Turner sb_filespec.SetFileSpec(HostInfo::GetProgramFileSpec());
37d232abc3SJonas Devlieghere return sb_filespec;
3830fdc8d8SChris Lattner }
3930fdc8d8SChris Lattner
GetLLDBPythonPath()40b9c1b51eSKate Stone SBFileSpec SBHostOS::GetLLDBPythonPath() {
411755f5b1SJonas Devlieghere LLDB_INSTRUMENT();
42baf5664fSJonas Devlieghere
43d232abc3SJonas Devlieghere return GetLLDBPath(ePathTypePythonDir);
44e2231ac7SJim Ingham }
45e2231ac7SJim Ingham
GetLLDBPath(lldb::PathType path_type)46b9c1b51eSKate Stone SBFileSpec SBHostOS::GetLLDBPath(lldb::PathType path_type) {
471755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(path_type);
48baf5664fSJonas Devlieghere
4906357c93SGreg Clayton FileSpec fspec;
5060f028ffSPavel Labath switch (path_type) {
5160f028ffSPavel Labath case ePathTypeLLDBShlibDir:
5260f028ffSPavel Labath fspec = HostInfo::GetShlibDir();
5360f028ffSPavel Labath break;
5460f028ffSPavel Labath case ePathTypeSupportExecutableDir:
5560f028ffSPavel Labath fspec = HostInfo::GetSupportExeDir();
5660f028ffSPavel Labath break;
5760f028ffSPavel Labath case ePathTypeHeaderDir:
5860f028ffSPavel Labath fspec = HostInfo::GetHeaderDir();
5960f028ffSPavel Labath break;
6060f028ffSPavel Labath case ePathTypePythonDir:
614e26cf2cSJonas Devlieghere #if LLDB_ENABLE_PYTHON
622df331b0SPavel Labath fspec = ScriptInterpreterPython::GetPythonDir();
63af8b24faSPavel Labath #endif
6460f028ffSPavel Labath break;
6560f028ffSPavel Labath case ePathTypeLLDBSystemPlugins:
6660f028ffSPavel Labath fspec = HostInfo::GetSystemPluginDir();
6760f028ffSPavel Labath break;
6860f028ffSPavel Labath case ePathTypeLLDBUserPlugins:
6960f028ffSPavel Labath fspec = HostInfo::GetUserPluginDir();
7060f028ffSPavel Labath break;
7160f028ffSPavel Labath case ePathTypeLLDBTempSystemDir:
7260f028ffSPavel Labath fspec = HostInfo::GetProcessTempDir();
7360f028ffSPavel Labath break;
7460f028ffSPavel Labath case ePathTypeGlobalLLDBTempSystemDir:
7560f028ffSPavel Labath fspec = HostInfo::GetGlobalTempDir();
7660f028ffSPavel Labath break;
7760f028ffSPavel Labath case ePathTypeClangDir:
78bdf08924SZachary Turner fspec = GetClangResourceDir();
7960f028ffSPavel Labath break;
8060f028ffSPavel Labath }
8160f028ffSPavel Labath
8260f028ffSPavel Labath SBFileSpec sb_fspec;
8306357c93SGreg Clayton sb_fspec.SetFileSpec(fspec);
84d232abc3SJonas Devlieghere return sb_fspec;
8506357c93SGreg Clayton }
8606357c93SGreg Clayton
GetUserHomeDirectory()87b9c1b51eSKate Stone SBFileSpec SBHostOS::GetUserHomeDirectory() {
881755f5b1SJonas Devlieghere LLDB_INSTRUMENT();
89baf5664fSJonas Devlieghere
90921c1b7dSJonas Devlieghere FileSpec homedir;
91921c1b7dSJonas Devlieghere FileSystem::Instance().GetHomeDirectory(homedir);
928f3be7a3SJonas Devlieghere FileSystem::Instance().Resolve(homedir);
93878ae018SJason Molenda
94921c1b7dSJonas Devlieghere SBFileSpec sb_fspec;
95878ae018SJason Molenda sb_fspec.SetFileSpec(homedir);
96921c1b7dSJonas Devlieghere
97d232abc3SJonas Devlieghere return sb_fspec;
98878ae018SJason Molenda }
99878ae018SJason Molenda
ThreadCreate(const char * name,lldb::thread_func_t thread_function,void * thread_arg,SBError * error_ptr)100b9c1b51eSKate Stone lldb::thread_t SBHostOS::ThreadCreate(const char *name,
10199fbc076SDeepak Panickal lldb::thread_func_t thread_function,
102b9c1b51eSKate Stone void *thread_arg, SBError *error_ptr) {
1031755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(name, thread_function, thread_arg, error_ptr);
104f39c2e18SJonas Devlieghere llvm::Expected<HostThread> thread =
105*d0810779SPavel Labath ThreadLauncher::LaunchThread(name, [thread_function, thread_arg] {
106*d0810779SPavel Labath return thread_function(thread_arg);
107*d0810779SPavel Labath });
108f39c2e18SJonas Devlieghere if (!thread) {
109f39c2e18SJonas Devlieghere if (error_ptr)
110f39c2e18SJonas Devlieghere error_ptr->SetError(Status(thread.takeError()));
111f39c2e18SJonas Devlieghere else
112f39c2e18SJonas Devlieghere llvm::consumeError(thread.takeError());
113f39c2e18SJonas Devlieghere return LLDB_INVALID_HOST_THREAD;
114f39c2e18SJonas Devlieghere }
115f39c2e18SJonas Devlieghere
116f39c2e18SJonas Devlieghere return thread->Release();
11730fdc8d8SChris Lattner }
11830fdc8d8SChris Lattner
ThreadCreated(const char * name)1191755f5b1SJonas Devlieghere void SBHostOS::ThreadCreated(const char *name) { LLDB_INSTRUMENT_VA(name); }
12030fdc8d8SChris Lattner
ThreadCancel(lldb::thread_t thread,SBError * error_ptr)121b9c1b51eSKate Stone bool SBHostOS::ThreadCancel(lldb::thread_t thread, SBError *error_ptr) {
1221755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(thread, error_ptr);
123baf5664fSJonas Devlieghere
12497206d57SZachary Turner Status error;
12539de3110SZachary Turner HostThread host_thread(thread);
12639de3110SZachary Turner error = host_thread.Cancel();
12739de3110SZachary Turner if (error_ptr)
12839de3110SZachary Turner error_ptr->SetError(error);
12939de3110SZachary Turner host_thread.Release();
13039de3110SZachary Turner return error.Success();
13130fdc8d8SChris Lattner }
13230fdc8d8SChris Lattner
ThreadDetach(lldb::thread_t thread,SBError * error_ptr)133b9c1b51eSKate Stone bool SBHostOS::ThreadDetach(lldb::thread_t thread, SBError *error_ptr) {
1341755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(thread, error_ptr);
135baf5664fSJonas Devlieghere
13697206d57SZachary Turner Status error;
13739de3110SZachary Turner #if defined(_WIN32)
13839de3110SZachary Turner if (error_ptr)
13939de3110SZachary Turner error_ptr->SetErrorString("ThreadDetach is not supported on this platform");
14039de3110SZachary Turner #else
14139de3110SZachary Turner HostThread host_thread(thread);
142c3018992SZachary Turner error = host_thread.GetNativeThread().Detach();
14339de3110SZachary Turner if (error_ptr)
14439de3110SZachary Turner error_ptr->SetError(error);
14539de3110SZachary Turner host_thread.Release();
14639de3110SZachary Turner #endif
14739de3110SZachary Turner return error.Success();
14830fdc8d8SChris Lattner }
14930fdc8d8SChris Lattner
ThreadJoin(lldb::thread_t thread,lldb::thread_result_t * result,SBError * error_ptr)150b9c1b51eSKate Stone bool SBHostOS::ThreadJoin(lldb::thread_t thread, lldb::thread_result_t *result,
151b9c1b51eSKate Stone SBError *error_ptr) {
1521755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(thread, result, error_ptr);
153baf5664fSJonas Devlieghere
15497206d57SZachary Turner Status error;
15539de3110SZachary Turner HostThread host_thread(thread);
15639de3110SZachary Turner error = host_thread.Join(result);
15739de3110SZachary Turner if (error_ptr)
15839de3110SZachary Turner error_ptr->SetError(error);
15939de3110SZachary Turner host_thread.Release();
16039de3110SZachary Turner return error.Success();
16130fdc8d8SChris Lattner }
162