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