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" 10*d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.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" 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 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: 644e26cf2cSJonas 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 94921c1b7dSJonas Devlieghere FileSpec homedir; 95921c1b7dSJonas Devlieghere FileSystem::Instance().GetHomeDirectory(homedir); 968f3be7a3SJonas Devlieghere FileSystem::Instance().Resolve(homedir); 97878ae018SJason Molenda 98921c1b7dSJonas Devlieghere SBFileSpec sb_fspec; 99878ae018SJason Molenda sb_fspec.SetFileSpec(homedir); 100921c1b7dSJonas Devlieghere 101baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_fspec); 102878ae018SJason Molenda } 103878ae018SJason Molenda 104b9c1b51eSKate Stone lldb::thread_t SBHostOS::ThreadCreate(const char *name, 10599fbc076SDeepak Panickal lldb::thread_func_t thread_function, 106b9c1b51eSKate Stone void *thread_arg, SBError *error_ptr) { 10784e571ceSJonas Devlieghere LLDB_RECORD_DUMMY(lldb::thread_t, SBHostOS, ThreadCreate, 10884e571ceSJonas Devlieghere (lldb::thread_func_t, void *, SBError *), name, 10984e571ceSJonas Devlieghere thread_function, thread_arg, error_ptr); 110f39c2e18SJonas Devlieghere llvm::Expected<HostThread> thread = 111f39c2e18SJonas Devlieghere ThreadLauncher::LaunchThread(name, thread_function, thread_arg); 112f39c2e18SJonas Devlieghere if (!thread) { 113f39c2e18SJonas Devlieghere if (error_ptr) 114f39c2e18SJonas Devlieghere error_ptr->SetError(Status(thread.takeError())); 115f39c2e18SJonas Devlieghere else 116f39c2e18SJonas Devlieghere llvm::consumeError(thread.takeError()); 117f39c2e18SJonas Devlieghere return LLDB_INVALID_HOST_THREAD; 118f39c2e18SJonas Devlieghere } 119f39c2e18SJonas Devlieghere 120f39c2e18SJonas Devlieghere return thread->Release(); 12130fdc8d8SChris Lattner } 12230fdc8d8SChris Lattner 123baf5664fSJonas Devlieghere void SBHostOS::ThreadCreated(const char *name) { 124baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(void, SBHostOS, ThreadCreated, (const char *), 125baf5664fSJonas Devlieghere name); 126baf5664fSJonas Devlieghere } 12730fdc8d8SChris Lattner 128b9c1b51eSKate Stone bool SBHostOS::ThreadCancel(lldb::thread_t thread, SBError *error_ptr) { 12984e571ceSJonas Devlieghere LLDB_RECORD_DUMMY(bool, SBHostOS, ThreadCancel, 130baf5664fSJonas Devlieghere (lldb::thread_t, lldb::SBError *), thread, 131baf5664fSJonas Devlieghere error_ptr); 132baf5664fSJonas Devlieghere 13397206d57SZachary Turner Status error; 13439de3110SZachary Turner HostThread host_thread(thread); 13539de3110SZachary Turner error = host_thread.Cancel(); 13639de3110SZachary Turner if (error_ptr) 13739de3110SZachary Turner error_ptr->SetError(error); 13839de3110SZachary Turner host_thread.Release(); 13939de3110SZachary Turner return error.Success(); 14030fdc8d8SChris Lattner } 14130fdc8d8SChris Lattner 142b9c1b51eSKate Stone bool SBHostOS::ThreadDetach(lldb::thread_t thread, SBError *error_ptr) { 14384e571ceSJonas Devlieghere LLDB_RECORD_DUMMY(bool, SBHostOS, ThreadDetach, 144baf5664fSJonas Devlieghere (lldb::thread_t, lldb::SBError *), thread, 145baf5664fSJonas Devlieghere error_ptr); 146baf5664fSJonas Devlieghere 14797206d57SZachary Turner Status error; 14839de3110SZachary Turner #if defined(_WIN32) 14939de3110SZachary Turner if (error_ptr) 15039de3110SZachary Turner error_ptr->SetErrorString("ThreadDetach is not supported on this platform"); 15139de3110SZachary Turner #else 15239de3110SZachary Turner HostThread host_thread(thread); 153c3018992SZachary Turner error = host_thread.GetNativeThread().Detach(); 15439de3110SZachary Turner if (error_ptr) 15539de3110SZachary Turner error_ptr->SetError(error); 15639de3110SZachary Turner host_thread.Release(); 15739de3110SZachary Turner #endif 15839de3110SZachary Turner return error.Success(); 15930fdc8d8SChris Lattner } 16030fdc8d8SChris Lattner 161b9c1b51eSKate Stone bool SBHostOS::ThreadJoin(lldb::thread_t thread, lldb::thread_result_t *result, 162b9c1b51eSKate Stone SBError *error_ptr) { 16384e571ceSJonas Devlieghere LLDB_RECORD_DUMMY( 164baf5664fSJonas Devlieghere bool, SBHostOS, ThreadJoin, 165baf5664fSJonas Devlieghere (lldb::thread_t, lldb::thread_result_t *, lldb::SBError *), thread, 166baf5664fSJonas Devlieghere result, error_ptr); 167baf5664fSJonas Devlieghere 16897206d57SZachary Turner Status error; 16939de3110SZachary Turner HostThread host_thread(thread); 17039de3110SZachary Turner error = host_thread.Join(result); 17139de3110SZachary Turner if (error_ptr) 17239de3110SZachary Turner error_ptr->SetError(error); 17339de3110SZachary Turner host_thread.Release(); 17439de3110SZachary Turner return error.Success(); 17530fdc8d8SChris Lattner } 176