blob: f74c63cd35a246bcb5d4ea30aedfabafdc41db45 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBHostOS.cpp --------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/API/SBHostOS.h"
11#include "lldb/API/SBError.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000012#include "lldb/Host/Host.h"
Zachary Turner42ff0ad2014-08-21 17:29:12 +000013#include "lldb/Host/HostInfo.h"
Zachary Turnerc3018992014-11-17 22:42:57 +000014#include "lldb/Host/HostNativeThread.h"
Zachary Turner39de3112014-09-09 20:54:56 +000015#include "lldb/Host/HostThread.h"
16#include "lldb/Host/ThreadLauncher.h"
Zachary Turner5713a052017-03-22 18:40:07 +000017#include "lldb/Utility/FileSpec.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000018#include "lldb/Utility/Log.h"
Zachary Turner39de3112014-09-09 20:54:56 +000019
Zachary Turnerbdf08922018-06-04 17:41:00 +000020#include "Plugins/ExpressionParser/Clang/ClangHost.h"
21
Pavel Labath7eafdce2016-04-18 12:18:35 +000022#include "llvm/ADT/SmallString.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000023#include "llvm/Support/Path.h"
Jason Molenda878ae012016-02-19 00:05:17 +000024
Chris Lattner30fdc8d2010-06-08 16:52:24 +000025using namespace lldb;
26using namespace lldb_private;
27
Kate Stoneb9c1b512016-09-06 20:57:50 +000028SBFileSpec SBHostOS::GetProgramFileSpec() {
29 SBFileSpec sb_filespec;
30 sb_filespec.SetFileSpec(HostInfo::GetProgramFileSpec());
31 return sb_filespec;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032}
33
Kate Stoneb9c1b512016-09-06 20:57:50 +000034SBFileSpec SBHostOS::GetLLDBPythonPath() {
Pavel Labath60f028f2018-06-19 15:09:07 +000035 return GetLLDBPath(ePathTypePythonDir);
Jim Inghame2231ac2012-12-21 22:22:26 +000036}
37
Kate Stoneb9c1b512016-09-06 20:57:50 +000038SBFileSpec SBHostOS::GetLLDBPath(lldb::PathType path_type) {
Kate Stoneb9c1b512016-09-06 20:57:50 +000039 FileSpec fspec;
Pavel Labath60f028f2018-06-19 15:09:07 +000040 switch (path_type) {
41 case ePathTypeLLDBShlibDir:
42 fspec = HostInfo::GetShlibDir();
43 break;
44 case ePathTypeSupportExecutableDir:
45 fspec = HostInfo::GetSupportExeDir();
46 break;
47 case ePathTypeHeaderDir:
48 fspec = HostInfo::GetHeaderDir();
49 break;
50 case ePathTypePythonDir:
51 fspec = HostInfo::GetPythonDir();
52 break;
53 case ePathTypeLLDBSystemPlugins:
54 fspec = HostInfo::GetSystemPluginDir();
55 break;
56 case ePathTypeLLDBUserPlugins:
57 fspec = HostInfo::GetUserPluginDir();
58 break;
59 case ePathTypeLLDBTempSystemDir:
60 fspec = HostInfo::GetProcessTempDir();
61 break;
62 case ePathTypeGlobalLLDBTempSystemDir:
63 fspec = HostInfo::GetGlobalTempDir();
64 break;
65 case ePathTypeClangDir:
Zachary Turnerbdf08922018-06-04 17:41:00 +000066 fspec = GetClangResourceDir();
Pavel Labath60f028f2018-06-19 15:09:07 +000067 break;
68 }
69
70 SBFileSpec sb_fspec;
71 sb_fspec.SetFileSpec(fspec);
Kate Stoneb9c1b512016-09-06 20:57:50 +000072 return sb_fspec;
Greg Clayton06357c92014-07-30 17:38:47 +000073}
74
Kate Stoneb9c1b512016-09-06 20:57:50 +000075SBFileSpec SBHostOS::GetUserHomeDirectory() {
76 SBFileSpec sb_fspec;
Jason Molenda878ae012016-02-19 00:05:17 +000077
Kate Stoneb9c1b512016-09-06 20:57:50 +000078 llvm::SmallString<64> home_dir_path;
79 llvm::sys::path::home_directory(home_dir_path);
80 FileSpec homedir(home_dir_path.c_str(), true);
Jason Molenda878ae012016-02-19 00:05:17 +000081
Kate Stoneb9c1b512016-09-06 20:57:50 +000082 sb_fspec.SetFileSpec(homedir);
83 return sb_fspec;
Jason Molenda878ae012016-02-19 00:05:17 +000084}
85
Kate Stoneb9c1b512016-09-06 20:57:50 +000086lldb::thread_t SBHostOS::ThreadCreate(const char *name,
87 lldb::thread_func_t thread_function,
88 void *thread_arg, SBError *error_ptr) {
89 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000090
Kate Stoneb9c1b512016-09-06 20:57:50 +000091 if (log)
92 log->Printf(
93 "SBHostOS::ThreadCreate (name=\"%s\", thread_function=%p, "
94 "thread_arg=%p, error_ptr=%p)",
95 name,
96 reinterpret_cast<void *>(reinterpret_cast<intptr_t>(thread_function)),
97 static_cast<void *>(thread_arg), static_cast<void *>(error_ptr));
Caroline Ticeceb6b132010-10-26 03:11:13 +000098
Kate Stoneb9c1b512016-09-06 20:57:50 +000099 // FIXME: You should log the return value?
Caroline Ticeceb6b132010-10-26 03:11:13 +0000100
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101 HostThread thread(ThreadLauncher::LaunchThread(
102 name, thread_function, thread_arg, error_ptr ? error_ptr->get() : NULL));
103 return thread.Release();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000104}
105
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106void SBHostOS::ThreadCreated(const char *name) {}
107
108bool SBHostOS::ThreadCancel(lldb::thread_t thread, SBError *error_ptr) {
Zachary Turner97206d52017-05-12 04:51:55 +0000109 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110 HostThread host_thread(thread);
111 error = host_thread.Cancel();
112 if (error_ptr)
113 error_ptr->SetError(error);
114 host_thread.Release();
115 return error.Success();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000116}
117
Kate Stoneb9c1b512016-09-06 20:57:50 +0000118bool SBHostOS::ThreadDetach(lldb::thread_t thread, SBError *error_ptr) {
Zachary Turner97206d52017-05-12 04:51:55 +0000119 Status error;
Zachary Turner39de3112014-09-09 20:54:56 +0000120#if defined(_WIN32)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000121 if (error_ptr)
122 error_ptr->SetErrorString("ThreadDetach is not supported on this platform");
Zachary Turner39de3112014-09-09 20:54:56 +0000123#else
Kate Stoneb9c1b512016-09-06 20:57:50 +0000124 HostThread host_thread(thread);
125 error = host_thread.GetNativeThread().Detach();
126 if (error_ptr)
127 error_ptr->SetError(error);
128 host_thread.Release();
Zachary Turner39de3112014-09-09 20:54:56 +0000129#endif
Kate Stoneb9c1b512016-09-06 20:57:50 +0000130 return error.Success();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000131}
132
Kate Stoneb9c1b512016-09-06 20:57:50 +0000133bool SBHostOS::ThreadJoin(lldb::thread_t thread, lldb::thread_result_t *result,
134 SBError *error_ptr) {
Zachary Turner97206d52017-05-12 04:51:55 +0000135 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000136 HostThread host_thread(thread);
137 error = host_thread.Join(result);
138 if (error_ptr)
139 error_ptr->SetError(error);
140 host_thread.Release();
141 return error.Success();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000142}