130fdc8d8SChris Lattner //===-- SBHostOS.cpp --------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner #include "lldb/API/SBHostOS.h" 1130fdc8d8SChris Lattner #include "lldb/API/SBError.h" 1230fdc8d8SChris Lattner #include "lldb/Host/Host.h" 1342ff0ad8SZachary Turner #include "lldb/Host/HostInfo.h" 14c3018992SZachary Turner #include "lldb/Host/HostNativeThread.h" 1539de3110SZachary Turner #include "lldb/Host/HostThread.h" 1639de3110SZachary Turner #include "lldb/Host/ThreadLauncher.h" 175713a05bSZachary Turner #include "lldb/Utility/FileSpec.h" 186f9e6901SZachary Turner #include "lldb/Utility/Log.h" 1939de3110SZachary Turner 20bdf08924SZachary Turner #include "Plugins/ExpressionParser/Clang/ClangHost.h" 21bdf08924SZachary Turner 227eafdcedSPavel Labath #include "llvm/ADT/SmallString.h" 23b9c1b51eSKate Stone #include "llvm/Support/Path.h" 24878ae018SJason Molenda 2530fdc8d8SChris Lattner using namespace lldb; 2630fdc8d8SChris Lattner using namespace lldb_private; 2730fdc8d8SChris Lattner 28b9c1b51eSKate Stone SBFileSpec SBHostOS::GetProgramFileSpec() { 2930fdc8d8SChris Lattner SBFileSpec sb_filespec; 30a21fee0eSZachary Turner sb_filespec.SetFileSpec(HostInfo::GetProgramFileSpec()); 3130fdc8d8SChris Lattner return sb_filespec; 3230fdc8d8SChris Lattner } 3330fdc8d8SChris Lattner 34b9c1b51eSKate Stone SBFileSpec SBHostOS::GetLLDBPythonPath() { 35*60f028ffSPavel Labath return GetLLDBPath(ePathTypePythonDir); 36e2231ac7SJim Ingham } 37e2231ac7SJim Ingham 38b9c1b51eSKate Stone SBFileSpec SBHostOS::GetLLDBPath(lldb::PathType path_type) { 3906357c93SGreg Clayton FileSpec fspec; 40*60f028ffSPavel Labath switch (path_type) { 41*60f028ffSPavel Labath case ePathTypeLLDBShlibDir: 42*60f028ffSPavel Labath fspec = HostInfo::GetShlibDir(); 43*60f028ffSPavel Labath break; 44*60f028ffSPavel Labath case ePathTypeSupportExecutableDir: 45*60f028ffSPavel Labath fspec = HostInfo::GetSupportExeDir(); 46*60f028ffSPavel Labath break; 47*60f028ffSPavel Labath case ePathTypeHeaderDir: 48*60f028ffSPavel Labath fspec = HostInfo::GetHeaderDir(); 49*60f028ffSPavel Labath break; 50*60f028ffSPavel Labath case ePathTypePythonDir: 51*60f028ffSPavel Labath fspec = HostInfo::GetPythonDir(); 52*60f028ffSPavel Labath break; 53*60f028ffSPavel Labath case ePathTypeLLDBSystemPlugins: 54*60f028ffSPavel Labath fspec = HostInfo::GetSystemPluginDir(); 55*60f028ffSPavel Labath break; 56*60f028ffSPavel Labath case ePathTypeLLDBUserPlugins: 57*60f028ffSPavel Labath fspec = HostInfo::GetUserPluginDir(); 58*60f028ffSPavel Labath break; 59*60f028ffSPavel Labath case ePathTypeLLDBTempSystemDir: 60*60f028ffSPavel Labath fspec = HostInfo::GetProcessTempDir(); 61*60f028ffSPavel Labath break; 62*60f028ffSPavel Labath case ePathTypeGlobalLLDBTempSystemDir: 63*60f028ffSPavel Labath fspec = HostInfo::GetGlobalTempDir(); 64*60f028ffSPavel Labath break; 65*60f028ffSPavel Labath case ePathTypeClangDir: 66bdf08924SZachary Turner fspec = GetClangResourceDir(); 67*60f028ffSPavel Labath break; 68*60f028ffSPavel Labath } 69*60f028ffSPavel Labath 70*60f028ffSPavel Labath SBFileSpec sb_fspec; 7106357c93SGreg Clayton sb_fspec.SetFileSpec(fspec); 7206357c93SGreg Clayton return sb_fspec; 7306357c93SGreg Clayton } 7406357c93SGreg Clayton 75b9c1b51eSKate Stone SBFileSpec SBHostOS::GetUserHomeDirectory() { 76878ae018SJason Molenda SBFileSpec sb_fspec; 77878ae018SJason Molenda 78878ae018SJason Molenda llvm::SmallString<64> home_dir_path; 79878ae018SJason Molenda llvm::sys::path::home_directory(home_dir_path); 80878ae018SJason Molenda FileSpec homedir(home_dir_path.c_str(), true); 81878ae018SJason Molenda 82878ae018SJason Molenda sb_fspec.SetFileSpec(homedir); 83878ae018SJason Molenda return sb_fspec; 84878ae018SJason Molenda } 85878ae018SJason Molenda 86b9c1b51eSKate Stone lldb::thread_t SBHostOS::ThreadCreate(const char *name, 8799fbc076SDeepak Panickal lldb::thread_func_t thread_function, 88b9c1b51eSKate Stone void *thread_arg, SBError *error_ptr) { 895160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 90ceb6b139SCaroline Tice 91ceb6b139SCaroline Tice if (log) 92b9c1b51eSKate Stone log->Printf( 93b9c1b51eSKate Stone "SBHostOS::ThreadCreate (name=\"%s\", thread_function=%p, " 94b9c1b51eSKate Stone "thread_arg=%p, error_ptr=%p)", 95b9c1b51eSKate Stone name, 96b9c1b51eSKate Stone reinterpret_cast<void *>(reinterpret_cast<intptr_t>(thread_function)), 97b9c1b51eSKate Stone static_cast<void *>(thread_arg), static_cast<void *>(error_ptr)); 98ceb6b139SCaroline Tice 99c1338e8dSCaroline Tice // FIXME: You should log the return value? 100ceb6b139SCaroline Tice 101b9c1b51eSKate Stone HostThread thread(ThreadLauncher::LaunchThread( 102b9c1b51eSKate Stone name, thread_function, thread_arg, error_ptr ? error_ptr->get() : NULL)); 10339de3110SZachary Turner return thread.Release(); 10430fdc8d8SChris Lattner } 10530fdc8d8SChris Lattner 106b9c1b51eSKate Stone void SBHostOS::ThreadCreated(const char *name) {} 10730fdc8d8SChris Lattner 108b9c1b51eSKate Stone bool SBHostOS::ThreadCancel(lldb::thread_t thread, SBError *error_ptr) { 10997206d57SZachary Turner Status error; 11039de3110SZachary Turner HostThread host_thread(thread); 11139de3110SZachary Turner error = host_thread.Cancel(); 11239de3110SZachary Turner if (error_ptr) 11339de3110SZachary Turner error_ptr->SetError(error); 11439de3110SZachary Turner host_thread.Release(); 11539de3110SZachary Turner return error.Success(); 11630fdc8d8SChris Lattner } 11730fdc8d8SChris Lattner 118b9c1b51eSKate Stone bool SBHostOS::ThreadDetach(lldb::thread_t thread, SBError *error_ptr) { 11997206d57SZachary Turner Status error; 12039de3110SZachary Turner #if defined(_WIN32) 12139de3110SZachary Turner if (error_ptr) 12239de3110SZachary Turner error_ptr->SetErrorString("ThreadDetach is not supported on this platform"); 12339de3110SZachary Turner #else 12439de3110SZachary Turner HostThread host_thread(thread); 125c3018992SZachary Turner error = host_thread.GetNativeThread().Detach(); 12639de3110SZachary Turner if (error_ptr) 12739de3110SZachary Turner error_ptr->SetError(error); 12839de3110SZachary Turner host_thread.Release(); 12939de3110SZachary Turner #endif 13039de3110SZachary Turner return error.Success(); 13130fdc8d8SChris Lattner } 13230fdc8d8SChris Lattner 133b9c1b51eSKate Stone bool SBHostOS::ThreadJoin(lldb::thread_t thread, lldb::thread_result_t *result, 134b9c1b51eSKate Stone SBError *error_ptr) { 13597206d57SZachary Turner Status error; 13639de3110SZachary Turner HostThread host_thread(thread); 13739de3110SZachary Turner error = host_thread.Join(result); 13839de3110SZachary Turner if (error_ptr) 13939de3110SZachary Turner error_ptr->SetError(error); 14039de3110SZachary Turner host_thread.Release(); 14139de3110SZachary Turner return error.Success(); 14230fdc8d8SChris Lattner } 143