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