15ffd83dbSDimitry Andric //===-- SBHostOS.cpp ------------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
9480093f4SDimitry Andric #include "lldb/API/SBHostOS.h"
100b57cec5SDimitry Andric #include "lldb/API/SBError.h"
11480093f4SDimitry Andric #include "lldb/Host/Config.h"
120b57cec5SDimitry Andric #include "lldb/Host/FileSystem.h"
130b57cec5SDimitry Andric #include "lldb/Host/Host.h"
140b57cec5SDimitry Andric #include "lldb/Host/HostInfo.h"
150b57cec5SDimitry Andric #include "lldb/Host/HostNativeThread.h"
160b57cec5SDimitry Andric #include "lldb/Host/HostThread.h"
170b57cec5SDimitry Andric #include "lldb/Host/ThreadLauncher.h"
180b57cec5SDimitry Andric #include "lldb/Utility/FileSpec.h"
1904eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric #include "Plugins/ExpressionParser/Clang/ClangHost.h"
22480093f4SDimitry Andric #if LLDB_ENABLE_PYTHON
230b57cec5SDimitry Andric #include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h"
240b57cec5SDimitry Andric #endif
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric #include "llvm/ADT/SmallString.h"
270b57cec5SDimitry Andric #include "llvm/Support/Path.h"
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric using namespace lldb;
300b57cec5SDimitry Andric using namespace lldb_private;
310b57cec5SDimitry Andric 
GetProgramFileSpec()320b57cec5SDimitry Andric SBFileSpec SBHostOS::GetProgramFileSpec() {
3304eeddc0SDimitry Andric   LLDB_INSTRUMENT();
340b57cec5SDimitry Andric 
350b57cec5SDimitry Andric   SBFileSpec sb_filespec;
360b57cec5SDimitry Andric   sb_filespec.SetFileSpec(HostInfo::GetProgramFileSpec());
3704eeddc0SDimitry Andric   return sb_filespec;
380b57cec5SDimitry Andric }
390b57cec5SDimitry Andric 
GetLLDBPythonPath()400b57cec5SDimitry Andric SBFileSpec SBHostOS::GetLLDBPythonPath() {
4104eeddc0SDimitry Andric   LLDB_INSTRUMENT();
420b57cec5SDimitry Andric 
4304eeddc0SDimitry Andric   return GetLLDBPath(ePathTypePythonDir);
440b57cec5SDimitry Andric }
450b57cec5SDimitry Andric 
GetLLDBPath(lldb::PathType path_type)460b57cec5SDimitry Andric SBFileSpec SBHostOS::GetLLDBPath(lldb::PathType path_type) {
4704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(path_type);
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric   FileSpec fspec;
500b57cec5SDimitry Andric   switch (path_type) {
510b57cec5SDimitry Andric   case ePathTypeLLDBShlibDir:
520b57cec5SDimitry Andric     fspec = HostInfo::GetShlibDir();
530b57cec5SDimitry Andric     break;
540b57cec5SDimitry Andric   case ePathTypeSupportExecutableDir:
550b57cec5SDimitry Andric     fspec = HostInfo::GetSupportExeDir();
560b57cec5SDimitry Andric     break;
570b57cec5SDimitry Andric   case ePathTypeHeaderDir:
580b57cec5SDimitry Andric     fspec = HostInfo::GetHeaderDir();
590b57cec5SDimitry Andric     break;
600b57cec5SDimitry Andric   case ePathTypePythonDir:
61480093f4SDimitry Andric #if LLDB_ENABLE_PYTHON
620b57cec5SDimitry Andric     fspec = ScriptInterpreterPython::GetPythonDir();
630b57cec5SDimitry Andric #endif
640b57cec5SDimitry Andric     break;
650b57cec5SDimitry Andric   case ePathTypeLLDBSystemPlugins:
660b57cec5SDimitry Andric     fspec = HostInfo::GetSystemPluginDir();
670b57cec5SDimitry Andric     break;
680b57cec5SDimitry Andric   case ePathTypeLLDBUserPlugins:
690b57cec5SDimitry Andric     fspec = HostInfo::GetUserPluginDir();
700b57cec5SDimitry Andric     break;
710b57cec5SDimitry Andric   case ePathTypeLLDBTempSystemDir:
720b57cec5SDimitry Andric     fspec = HostInfo::GetProcessTempDir();
730b57cec5SDimitry Andric     break;
740b57cec5SDimitry Andric   case ePathTypeGlobalLLDBTempSystemDir:
750b57cec5SDimitry Andric     fspec = HostInfo::GetGlobalTempDir();
760b57cec5SDimitry Andric     break;
770b57cec5SDimitry Andric   case ePathTypeClangDir:
780b57cec5SDimitry Andric     fspec = GetClangResourceDir();
790b57cec5SDimitry Andric     break;
800b57cec5SDimitry Andric   }
810b57cec5SDimitry Andric 
820b57cec5SDimitry Andric   SBFileSpec sb_fspec;
830b57cec5SDimitry Andric   sb_fspec.SetFileSpec(fspec);
8404eeddc0SDimitry Andric   return sb_fspec;
850b57cec5SDimitry Andric }
860b57cec5SDimitry Andric 
GetUserHomeDirectory()870b57cec5SDimitry Andric SBFileSpec SBHostOS::GetUserHomeDirectory() {
8804eeddc0SDimitry Andric   LLDB_INSTRUMENT();
890b57cec5SDimitry Andric 
90e8d8bef9SDimitry Andric   FileSpec homedir;
91e8d8bef9SDimitry Andric   FileSystem::Instance().GetHomeDirectory(homedir);
920b57cec5SDimitry Andric   FileSystem::Instance().Resolve(homedir);
930b57cec5SDimitry Andric 
94e8d8bef9SDimitry Andric   SBFileSpec sb_fspec;
950b57cec5SDimitry Andric   sb_fspec.SetFileSpec(homedir);
96e8d8bef9SDimitry Andric 
9704eeddc0SDimitry Andric   return sb_fspec;
980b57cec5SDimitry Andric }
990b57cec5SDimitry Andric 
ThreadCreate(const char * name,lldb::thread_func_t thread_function,void * thread_arg,SBError * error_ptr)1000b57cec5SDimitry Andric lldb::thread_t SBHostOS::ThreadCreate(const char *name,
1010b57cec5SDimitry Andric                                       lldb::thread_func_t thread_function,
1020b57cec5SDimitry Andric                                       void *thread_arg, SBError *error_ptr) {
10304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(name, thread_function, thread_arg, error_ptr);
1040b57cec5SDimitry Andric   return LLDB_INVALID_HOST_THREAD;
1050b57cec5SDimitry Andric }
1060b57cec5SDimitry Andric 
ThreadCreated(const char * name)10704eeddc0SDimitry Andric void SBHostOS::ThreadCreated(const char *name) { LLDB_INSTRUMENT_VA(name); }
1080b57cec5SDimitry Andric 
ThreadCancel(lldb::thread_t thread,SBError * error_ptr)1090b57cec5SDimitry Andric bool SBHostOS::ThreadCancel(lldb::thread_t thread, SBError *error_ptr) {
11004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(thread, error_ptr);
1115f757f3fSDimitry Andric   return false;
1120b57cec5SDimitry Andric }
1130b57cec5SDimitry Andric 
ThreadDetach(lldb::thread_t thread,SBError * error_ptr)1140b57cec5SDimitry Andric bool SBHostOS::ThreadDetach(lldb::thread_t thread, SBError *error_ptr) {
11504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(thread, error_ptr);
1165f757f3fSDimitry Andric   return false;
1170b57cec5SDimitry Andric }
1180b57cec5SDimitry Andric 
ThreadJoin(lldb::thread_t thread,lldb::thread_result_t * result,SBError * error_ptr)1190b57cec5SDimitry Andric bool SBHostOS::ThreadJoin(lldb::thread_t thread, lldb::thread_result_t *result,
1200b57cec5SDimitry Andric                           SBError *error_ptr) {
12104eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(thread, result, error_ptr);
1225f757f3fSDimitry Andric   return false;
1230b57cec5SDimitry Andric }
124