197a14e60SZachary Turner //===-- HostInfoBase.cpp ----------------------------------------*- C++ -*-===//
297a14e60SZachary Turner //
397a14e60SZachary Turner //                     The LLVM Compiler Infrastructure
497a14e60SZachary Turner //
597a14e60SZachary Turner // This file is distributed under the University of Illinois Open Source
697a14e60SZachary Turner // License. See LICENSE.TXT for details.
797a14e60SZachary Turner //
897a14e60SZachary Turner //===----------------------------------------------------------------------===//
997a14e60SZachary Turner 
1097a14e60SZachary Turner #include "lldb/Host/Config.h"
1197a14e60SZachary Turner 
1297a14e60SZachary Turner #include "lldb/Core/ArchSpec.h"
1342ff0ad8SZachary Turner #include "lldb/Core/Log.h"
1442ff0ad8SZachary Turner #include "lldb/Core/StreamString.h"
1542ff0ad8SZachary Turner #include "lldb/Host/FileSystem.h"
1697a14e60SZachary Turner #include "lldb/Host/Host.h"
1713b18261SZachary Turner #include "lldb/Host/HostInfo.h"
1813b18261SZachary Turner #include "lldb/Host/HostInfoBase.h"
1913b18261SZachary Turner 
2013b18261SZachary Turner #include "llvm/ADT/Triple.h"
21270e99abSZachary Turner #include "llvm/ADT/StringExtras.h"
2213b18261SZachary Turner #include "llvm/Support/Host.h"
23*33183147SPavel Labath #include "llvm/Support/Path.h"
24270e99abSZachary Turner #include "llvm/Support/raw_ostream.h"
2597a14e60SZachary Turner 
2697a14e60SZachary Turner #include <thread>
27ff48e4beSGreg Clayton #include <mutex> // std::once
2897a14e60SZachary Turner 
2997a14e60SZachary Turner using namespace lldb;
3097a14e60SZachary Turner using namespace lldb_private;
3197a14e60SZachary Turner 
3242ff0ad8SZachary Turner namespace
3342ff0ad8SZachary Turner {
3442ff0ad8SZachary Turner     void
3542ff0ad8SZachary Turner     CleanupProcessSpecificLLDBTempDir()
3642ff0ad8SZachary Turner     {
3742ff0ad8SZachary Turner         // Get the process specific LLDB temporary directory and delete it.
3842ff0ad8SZachary Turner         FileSpec tmpdir_file_spec;
3942ff0ad8SZachary Turner         if (!HostInfo::GetLLDBPath(ePathTypeLLDBTempSystemDir, tmpdir_file_spec))
4042ff0ad8SZachary Turner             return;
4142ff0ad8SZachary Turner 
4242ff0ad8SZachary Turner         // Remove the LLDB temporary directory if we have one. Set "recurse" to
4342ff0ad8SZachary Turner         // true to all files that were created for the LLDB process can be cleaned up.
44d3173f34SChaoren Lin         FileSystem::DeleteDirectory(tmpdir_file_spec, true);
4542ff0ad8SZachary Turner     }
46673b6e4fSZachary Turner 
47ff48e4beSGreg Clayton     //----------------------------------------------------------------------
48ff48e4beSGreg Clayton     // The HostInfoBaseFields is a work around for windows not supporting
49ff48e4beSGreg Clayton     // static variables correctly in a thread safe way. Really each of the
50ff48e4beSGreg Clayton     // variables in HostInfoBaseFields should live in the functions in which
51ff48e4beSGreg Clayton     // they are used and each one should be static, but the work around is
52ff48e4beSGreg Clayton     // in place to avoid this restriction. Ick.
53ff48e4beSGreg Clayton     //----------------------------------------------------------------------
54ff48e4beSGreg Clayton 
55673b6e4fSZachary Turner     struct HostInfoBaseFields
56673b6e4fSZachary Turner     {
57673b6e4fSZachary Turner         uint32_t m_number_cpus;
58673b6e4fSZachary Turner         std::string m_vendor_string;
59673b6e4fSZachary Turner         std::string m_os_string;
60673b6e4fSZachary Turner         std::string m_host_triple;
61673b6e4fSZachary Turner 
62673b6e4fSZachary Turner         ArchSpec m_host_arch_32;
63673b6e4fSZachary Turner         ArchSpec m_host_arch_64;
64673b6e4fSZachary Turner 
65673b6e4fSZachary Turner         FileSpec m_lldb_so_dir;
66673b6e4fSZachary Turner         FileSpec m_lldb_support_exe_dir;
67673b6e4fSZachary Turner         FileSpec m_lldb_headers_dir;
68673b6e4fSZachary Turner         FileSpec m_lldb_python_dir;
69b1e1c62fSSean Callanan         FileSpec m_lldb_clang_resource_dir;
70673b6e4fSZachary Turner         FileSpec m_lldb_system_plugin_dir;
71673b6e4fSZachary Turner         FileSpec m_lldb_user_plugin_dir;
7263acdfdeSOleksiy Vyalov         FileSpec m_lldb_process_tmp_dir;
7363acdfdeSOleksiy Vyalov         FileSpec m_lldb_global_tmp_dir;
74673b6e4fSZachary Turner     };
75673b6e4fSZachary Turner 
76673b6e4fSZachary Turner     HostInfoBaseFields *g_fields = nullptr;
7742ff0ad8SZachary Turner }
7842ff0ad8SZachary Turner 
79673b6e4fSZachary Turner void
80673b6e4fSZachary Turner HostInfoBase::Initialize()
81673b6e4fSZachary Turner {
82673b6e4fSZachary Turner     g_fields = new HostInfoBaseFields();
83673b6e4fSZachary Turner }
8442ff0ad8SZachary Turner 
8597a14e60SZachary Turner uint32_t
8697a14e60SZachary Turner HostInfoBase::GetNumberCPUS()
8797a14e60SZachary Turner {
88ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
89ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
90673b6e4fSZachary Turner         g_fields->m_number_cpus = std::thread::hardware_concurrency();
91ff48e4beSGreg Clayton     });
92673b6e4fSZachary Turner     return g_fields->m_number_cpus;
9397a14e60SZachary Turner }
9497a14e60SZachary Turner 
9539de3110SZachary Turner uint32_t
9639de3110SZachary Turner HostInfoBase::GetMaxThreadNameLength()
9739de3110SZachary Turner {
9839de3110SZachary Turner     return 0;
9939de3110SZachary Turner }
10039de3110SZachary Turner 
10197a14e60SZachary Turner llvm::StringRef
10297a14e60SZachary Turner HostInfoBase::GetVendorString()
10397a14e60SZachary Turner {
104ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
105ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
1063a29f8b9SPavel Labath         g_fields->m_vendor_string = HostInfo::GetArchitecture().GetTriple().getVendorName().str();
107ff48e4beSGreg Clayton     });
108673b6e4fSZachary Turner     return g_fields->m_vendor_string;
10997a14e60SZachary Turner }
11097a14e60SZachary Turner 
11197a14e60SZachary Turner llvm::StringRef
11297a14e60SZachary Turner HostInfoBase::GetOSString()
11397a14e60SZachary Turner {
114ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
115ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
116ff48e4beSGreg Clayton         g_fields->m_os_string = std::move(HostInfo::GetArchitecture().GetTriple().getOSName());
117ff48e4beSGreg Clayton     });
118673b6e4fSZachary Turner     return g_fields->m_os_string;
11997a14e60SZachary Turner }
12097a14e60SZachary Turner 
12197a14e60SZachary Turner llvm::StringRef
12297a14e60SZachary Turner HostInfoBase::GetTargetTriple()
12397a14e60SZachary Turner {
124ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
125ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
126ff48e4beSGreg Clayton         g_fields->m_host_triple = HostInfo::GetArchitecture().GetTriple().getTriple();
127ff48e4beSGreg Clayton     });
128673b6e4fSZachary Turner     return g_fields->m_host_triple;
12997a14e60SZachary Turner }
13013b18261SZachary Turner 
13113b18261SZachary Turner const ArchSpec &
13213b18261SZachary Turner HostInfoBase::GetArchitecture(ArchitectureKind arch_kind)
13313b18261SZachary Turner {
134ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
135ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
136673b6e4fSZachary Turner         HostInfo::ComputeHostArchitectureSupport(g_fields->m_host_arch_32, g_fields->m_host_arch_64);
137ff48e4beSGreg Clayton     });
13813b18261SZachary Turner 
13913b18261SZachary Turner     // If an explicit 32 or 64-bit architecture was requested, return that.
14013b18261SZachary Turner     if (arch_kind == eArchKind32)
141673b6e4fSZachary Turner         return g_fields->m_host_arch_32;
14213b18261SZachary Turner     if (arch_kind == eArchKind64)
143673b6e4fSZachary Turner         return g_fields->m_host_arch_64;
14413b18261SZachary Turner 
14513b18261SZachary Turner     // Otherwise prefer the 64-bit architecture if it is valid.
146673b6e4fSZachary Turner     return (g_fields->m_host_arch_64.IsValid()) ? g_fields->m_host_arch_64 : g_fields->m_host_arch_32;
14713b18261SZachary Turner }
14813b18261SZachary Turner 
14942ff0ad8SZachary Turner bool
15042ff0ad8SZachary Turner HostInfoBase::GetLLDBPath(lldb::PathType type, FileSpec &file_spec)
15142ff0ad8SZachary Turner {
15242ff0ad8SZachary Turner     file_spec.Clear();
15342ff0ad8SZachary Turner 
15442ff0ad8SZachary Turner #if defined(LLDB_DISABLE_PYTHON)
15542ff0ad8SZachary Turner     if (type == lldb::ePathTypePythonDir)
15642ff0ad8SZachary Turner         return false;
15742ff0ad8SZachary Turner #endif
15842ff0ad8SZachary Turner 
15942ff0ad8SZachary Turner     FileSpec *result = nullptr;
16042ff0ad8SZachary Turner     switch (type)
16142ff0ad8SZachary Turner     {
16242ff0ad8SZachary Turner         case lldb::ePathTypeLLDBShlibDir:
163ff48e4beSGreg Clayton             {
164ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
165ff48e4beSGreg Clayton                 static bool success = false;
166ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
167ff48e4beSGreg Clayton                     success = HostInfo::ComputeSharedLibraryDirectory (g_fields->m_lldb_so_dir);
168ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
16942ff0ad8SZachary Turner                     if (log)
170673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBShlibDir) => '%s'", g_fields->m_lldb_so_dir.GetPath().c_str());
171ff48e4beSGreg Clayton                 });
172ff48e4beSGreg Clayton                 if (success)
173ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_so_dir;
174ff48e4beSGreg Clayton             }
17542ff0ad8SZachary Turner             break;
17642ff0ad8SZachary Turner         case lldb::ePathTypeSupportExecutableDir:
177ff48e4beSGreg Clayton             {
178ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
179ff48e4beSGreg Clayton                 static bool success = false;
180ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
181ff48e4beSGreg Clayton                     success = HostInfo::ComputeSupportExeDirectory (g_fields->m_lldb_support_exe_dir);
182ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
18342ff0ad8SZachary Turner                     if (log)
184673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeSupportExecutableDir) => '%s'",
185673b6e4fSZachary Turner                                     g_fields->m_lldb_support_exe_dir.GetPath().c_str());
186ff48e4beSGreg Clayton                 });
187ff48e4beSGreg Clayton                 if (success)
188ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_support_exe_dir;
189ff48e4beSGreg Clayton             }
19042ff0ad8SZachary Turner             break;
19142ff0ad8SZachary Turner         case lldb::ePathTypeHeaderDir:
192ff48e4beSGreg Clayton             {
193ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
194ff48e4beSGreg Clayton                 static bool success = false;
195ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
196ff48e4beSGreg Clayton                     success = HostInfo::ComputeHeaderDirectory (g_fields->m_lldb_headers_dir);
197ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
19842ff0ad8SZachary Turner                     if (log)
199673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeHeaderDir) => '%s'", g_fields->m_lldb_headers_dir.GetPath().c_str());
200ff48e4beSGreg Clayton                 });
201ff48e4beSGreg Clayton                 if (success)
202ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_headers_dir;
203ff48e4beSGreg Clayton             }
20442ff0ad8SZachary Turner             break;
20542ff0ad8SZachary Turner         case lldb::ePathTypePythonDir:
206ff48e4beSGreg Clayton             {
207ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
208ff48e4beSGreg Clayton                 static bool success = false;
209ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
210ff48e4beSGreg Clayton                     success = HostInfo::ComputePythonDirectory (g_fields->m_lldb_python_dir);
211ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
21242ff0ad8SZachary Turner                     if (log)
213673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypePythonDir) => '%s'", g_fields->m_lldb_python_dir.GetPath().c_str());
214ff48e4beSGreg Clayton                 });
215ff48e4beSGreg Clayton                 if (success)
216ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_python_dir;
217ff48e4beSGreg Clayton             }
21842ff0ad8SZachary Turner             break;
219b1e1c62fSSean Callanan         case lldb::ePathTypeClangDir:
220ff48e4beSGreg Clayton             {
221ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
222ff48e4beSGreg Clayton                 static bool success = false;
223ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
224ff48e4beSGreg Clayton                     success = HostInfo::ComputeClangDirectory (g_fields->m_lldb_clang_resource_dir);
225ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
226b1e1c62fSSean Callanan                     if (log)
227b1e1c62fSSean Callanan                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeClangResourceDir) => '%s'", g_fields->m_lldb_clang_resource_dir.GetPath().c_str());
228ff48e4beSGreg Clayton                 });
229ff48e4beSGreg Clayton                 if (success)
230ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_clang_resource_dir;
231ff48e4beSGreg Clayton             }
232b1e1c62fSSean Callanan             break;
23342ff0ad8SZachary Turner         case lldb::ePathTypeLLDBSystemPlugins:
234ff48e4beSGreg Clayton             {
235ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
236ff48e4beSGreg Clayton                 static bool success = false;
237ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
238ff48e4beSGreg Clayton                     success = HostInfo::ComputeSystemPluginsDirectory (g_fields->m_lldb_system_plugin_dir);
239ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
24042ff0ad8SZachary Turner                     if (log)
241673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBSystemPlugins) => '%s'",
242673b6e4fSZachary Turner                                     g_fields->m_lldb_system_plugin_dir.GetPath().c_str());
243ff48e4beSGreg Clayton                 });
244ff48e4beSGreg Clayton                 if (success)
245ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_system_plugin_dir;
246ff48e4beSGreg Clayton             }
24742ff0ad8SZachary Turner             break;
24842ff0ad8SZachary Turner         case lldb::ePathTypeLLDBUserPlugins:
249ff48e4beSGreg Clayton             {
250ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
251ff48e4beSGreg Clayton                 static bool success = false;
252ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
253ff48e4beSGreg Clayton                     success = HostInfo::ComputeUserPluginsDirectory (g_fields->m_lldb_user_plugin_dir);
254ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
25542ff0ad8SZachary Turner                     if (log)
256673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBUserPlugins) => '%s'",
257673b6e4fSZachary Turner                                     g_fields->m_lldb_user_plugin_dir.GetPath().c_str());
258ff48e4beSGreg Clayton                 });
259ff48e4beSGreg Clayton                 if (success)
260ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_user_plugin_dir;
261ff48e4beSGreg Clayton             }
26242ff0ad8SZachary Turner             break;
26342ff0ad8SZachary Turner         case lldb::ePathTypeLLDBTempSystemDir:
264ff48e4beSGreg Clayton             {
265ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
266ff48e4beSGreg Clayton                 static bool success = false;
267ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
26863acdfdeSOleksiy Vyalov                     success = HostInfo::ComputeProcessTempFileDirectory (g_fields->m_lldb_process_tmp_dir);
269ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
27042ff0ad8SZachary Turner                     if (log)
27163acdfdeSOleksiy Vyalov                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'", g_fields->m_lldb_process_tmp_dir.GetPath().c_str());
272ff48e4beSGreg Clayton                 });
273ff48e4beSGreg Clayton                 if (success)
27463acdfdeSOleksiy Vyalov                     result = &g_fields->m_lldb_process_tmp_dir;
27563acdfdeSOleksiy Vyalov             }
27663acdfdeSOleksiy Vyalov             break;
27763acdfdeSOleksiy Vyalov         case lldb::ePathTypeGlobalLLDBTempSystemDir:
27863acdfdeSOleksiy Vyalov             {
27963acdfdeSOleksiy Vyalov                 static std::once_flag g_once_flag;
28063acdfdeSOleksiy Vyalov                 static bool success = false;
28163acdfdeSOleksiy Vyalov                 std::call_once(g_once_flag,  []() {
28263acdfdeSOleksiy Vyalov                     success = HostInfo::ComputeGlobalTempFileDirectory (g_fields->m_lldb_global_tmp_dir);
28363acdfdeSOleksiy Vyalov                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
28463acdfdeSOleksiy Vyalov                     if (log)
28563acdfdeSOleksiy Vyalov                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeGlobalLLDBTempSystemDir) => '%s'", g_fields->m_lldb_global_tmp_dir.GetPath().c_str());
28663acdfdeSOleksiy Vyalov                 });
28763acdfdeSOleksiy Vyalov                 if (success)
28863acdfdeSOleksiy Vyalov                     result = &g_fields->m_lldb_global_tmp_dir;
289ff48e4beSGreg Clayton             }
29042ff0ad8SZachary Turner             break;
29142ff0ad8SZachary Turner     }
29242ff0ad8SZachary Turner 
29342ff0ad8SZachary Turner     if (!result)
29442ff0ad8SZachary Turner         return false;
29542ff0ad8SZachary Turner     file_spec = *result;
29642ff0ad8SZachary Turner     return true;
29742ff0ad8SZachary Turner }
29842ff0ad8SZachary Turner 
29942ff0ad8SZachary Turner bool
30042ff0ad8SZachary Turner HostInfoBase::ComputeSharedLibraryDirectory(FileSpec &file_spec)
30142ff0ad8SZachary Turner {
30242ff0ad8SZachary Turner     // To get paths related to LLDB we get the path to the executable that
30342ff0ad8SZachary Turner     // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB",
30442ff0ad8SZachary Turner     // on linux this is assumed to be the "lldb" main executable. If LLDB on
30542ff0ad8SZachary Turner     // linux is actually in a shared library (liblldb.so) then this function will
30642ff0ad8SZachary Turner     // need to be modified to "do the right thing".
30742ff0ad8SZachary Turner 
30842ff0ad8SZachary Turner     FileSpec lldb_file_spec(
30942ff0ad8SZachary Turner         Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>(reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath))));
31042ff0ad8SZachary Turner 
311db7d8083SSean Callanan     // This is necessary because when running the testsuite the shlib might be a symbolic link inside the Python resource dir.
3129077e9f8SSean Callanan     FileSystem::ResolveSymbolicLink(lldb_file_spec, lldb_file_spec);
313db7d8083SSean Callanan 
31442ff0ad8SZachary Turner     // Remove the filename so that this FileSpec only represents the directory.
3150d8400c8SGreg Clayton     file_spec.GetDirectory() = lldb_file_spec.GetDirectory();
31642ff0ad8SZachary Turner 
31742ff0ad8SZachary Turner     return (bool)file_spec.GetDirectory();
31842ff0ad8SZachary Turner }
31942ff0ad8SZachary Turner 
32042ff0ad8SZachary Turner bool
32142ff0ad8SZachary Turner HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec)
32242ff0ad8SZachary Turner {
32342ff0ad8SZachary Turner     return GetLLDBPath(lldb::ePathTypeLLDBShlibDir, file_spec);
32442ff0ad8SZachary Turner }
32542ff0ad8SZachary Turner 
32642ff0ad8SZachary Turner bool
32763acdfdeSOleksiy Vyalov HostInfoBase::ComputeProcessTempFileDirectory(FileSpec &file_spec)
32842ff0ad8SZachary Turner {
32963acdfdeSOleksiy Vyalov     FileSpec temp_file_spec;
330f3a24329STamas Berghammer     if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec))
33163acdfdeSOleksiy Vyalov         return false;
33263acdfdeSOleksiy Vyalov 
333d3173f34SChaoren Lin     std::string pid_str{std::to_string(Host::GetCurrentProcessID())};
334d3173f34SChaoren Lin     temp_file_spec.AppendPathComponent(pid_str);
335d3173f34SChaoren Lin     if (!FileSystem::MakeDirectory(temp_file_spec, eFilePermissionsDirectoryDefault).Success())
33663acdfdeSOleksiy Vyalov         return false;
33763acdfdeSOleksiy Vyalov 
33863acdfdeSOleksiy Vyalov     // Make an atexit handler to clean up the process specify LLDB temp dir
33963acdfdeSOleksiy Vyalov     // and all of its contents.
34063acdfdeSOleksiy Vyalov     ::atexit(CleanupProcessSpecificLLDBTempDir);
341b79863c2SChaoren Lin     file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
34263acdfdeSOleksiy Vyalov     return true;
34363acdfdeSOleksiy Vyalov }
34463acdfdeSOleksiy Vyalov 
34563acdfdeSOleksiy Vyalov bool
346f3a24329STamas Berghammer HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec)
34763acdfdeSOleksiy Vyalov {
348*33183147SPavel Labath     llvm::SmallVector<char, 16> tmpdir;
349*33183147SPavel Labath     llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir);
350*33183147SPavel Labath     file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()), true);
351f3a24329STamas Berghammer     return true;
352f3a24329STamas Berghammer }
353f3a24329STamas Berghammer 
354f3a24329STamas Berghammer bool
355f3a24329STamas Berghammer HostInfoBase::ComputeGlobalTempFileDirectory(FileSpec &file_spec)
356f3a24329STamas Berghammer {
357f3a24329STamas Berghammer     file_spec.Clear();
358f3a24329STamas Berghammer 
359f3a24329STamas Berghammer     FileSpec temp_file_spec;
360f3a24329STamas Berghammer     if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec))
361f3a24329STamas Berghammer         return false;
362f3a24329STamas Berghammer 
363270e99abSZachary Turner     temp_file_spec.AppendPathComponent("lldb");
364d3173f34SChaoren Lin     if (!FileSystem::MakeDirectory(temp_file_spec, eFilePermissionsDirectoryDefault).Success())
36542ff0ad8SZachary Turner         return false;
36642ff0ad8SZachary Turner 
367b79863c2SChaoren Lin     file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
36842ff0ad8SZachary Turner     return true;
36942ff0ad8SZachary Turner }
37042ff0ad8SZachary Turner 
37142ff0ad8SZachary Turner bool
37242ff0ad8SZachary Turner HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec)
37342ff0ad8SZachary Turner {
37442ff0ad8SZachary Turner     // TODO(zturner): Figure out how to compute the header directory for all platforms.
37542ff0ad8SZachary Turner     return false;
37642ff0ad8SZachary Turner }
37742ff0ad8SZachary Turner 
37842ff0ad8SZachary Turner bool
37942ff0ad8SZachary Turner HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec)
38042ff0ad8SZachary Turner {
38142ff0ad8SZachary Turner     // TODO(zturner): Figure out how to compute the system plugins directory for all platforms.
38242ff0ad8SZachary Turner     return false;
38342ff0ad8SZachary Turner }
38442ff0ad8SZachary Turner 
38542ff0ad8SZachary Turner bool
386b1e1c62fSSean Callanan HostInfoBase::ComputeClangDirectory(FileSpec &file_spec)
387b1e1c62fSSean Callanan {
388b1e1c62fSSean Callanan     return false;
389b1e1c62fSSean Callanan }
390b1e1c62fSSean Callanan 
391b1e1c62fSSean Callanan bool
39242ff0ad8SZachary Turner HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec)
39342ff0ad8SZachary Turner {
39442ff0ad8SZachary Turner     // TODO(zturner): Figure out how to compute the user plugins directory for all platforms.
39542ff0ad8SZachary Turner     return false;
39642ff0ad8SZachary Turner }
39742ff0ad8SZachary Turner 
39813b18261SZachary Turner void
39913b18261SZachary Turner HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32, ArchSpec &arch_64)
40013b18261SZachary Turner {
401b071bee2SOleksiy Vyalov     llvm::Triple triple(llvm::sys::getProcessTriple());
40213b18261SZachary Turner 
40313b18261SZachary Turner     arch_32.Clear();
40413b18261SZachary Turner     arch_64.Clear();
40513b18261SZachary Turner 
40613b18261SZachary Turner     switch (triple.getArch())
40713b18261SZachary Turner     {
40813b18261SZachary Turner         default:
40913b18261SZachary Turner             arch_32.SetTriple(triple);
41013b18261SZachary Turner             break;
41113b18261SZachary Turner 
4122559abdaSJustin Hibbits         case llvm::Triple::ppc64:
413f9ee7e4cSJustin Hibbits         case llvm::Triple::x86_64:
41413b18261SZachary Turner             arch_64.SetTriple(triple);
41513b18261SZachary Turner             arch_32.SetTriple(triple.get32BitArchVariant());
41613b18261SZachary Turner             break;
41713b18261SZachary Turner 
418e4d6922cSTodd Fiala         case llvm::Triple::aarch64:
41913b18261SZachary Turner         case llvm::Triple::mips64:
4203df471c3SMohit K. Bhakkad         case llvm::Triple::mips64el:
42113b18261SZachary Turner         case llvm::Triple::sparcv9:
42213b18261SZachary Turner             arch_64.SetTriple(triple);
42313b18261SZachary Turner             break;
42413b18261SZachary Turner     }
42513b18261SZachary Turner }
426