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 
20270e99abSZachary Turner #include "llvm/ADT/StringExtras.h"
21*1eb0d42aSPavel Labath #include "llvm/ADT/Triple.h"
2213b18261SZachary Turner #include "llvm/Support/Host.h"
2333183147SPavel Labath #include "llvm/Support/Path.h"
24*1eb0d42aSPavel Labath #include "llvm/Support/ScopedPrinter.h"
25270e99abSZachary Turner #include "llvm/Support/raw_ostream.h"
2697a14e60SZachary Turner 
2797a14e60SZachary Turner #include <thread>
28ff48e4beSGreg Clayton #include <mutex> // std::once
2997a14e60SZachary Turner 
3097a14e60SZachary Turner using namespace lldb;
3197a14e60SZachary Turner using namespace lldb_private;
3297a14e60SZachary Turner 
3342ff0ad8SZachary Turner namespace
3442ff0ad8SZachary Turner {
35ff48e4beSGreg Clayton     //----------------------------------------------------------------------
36ff48e4beSGreg Clayton     // The HostInfoBaseFields is a work around for windows not supporting
37ff48e4beSGreg Clayton     // static variables correctly in a thread safe way. Really each of the
38ff48e4beSGreg Clayton     // variables in HostInfoBaseFields should live in the functions in which
39ff48e4beSGreg Clayton     // they are used and each one should be static, but the work around is
40ff48e4beSGreg Clayton     // in place to avoid this restriction. Ick.
41ff48e4beSGreg Clayton     //----------------------------------------------------------------------
42ff48e4beSGreg Clayton 
43673b6e4fSZachary Turner     struct HostInfoBaseFields
44673b6e4fSZachary Turner     {
4541331afaSZachary Turner         ~HostInfoBaseFields()
4641331afaSZachary Turner         {
4741331afaSZachary Turner             if (m_lldb_process_tmp_dir.Exists())
4841331afaSZachary Turner             {
4941331afaSZachary Turner                 // Remove the LLDB temporary directory if we have one. Set "recurse" to
5041331afaSZachary Turner                 // true to all files that were created for the LLDB process can be cleaned up.
5141331afaSZachary Turner                 FileSystem::DeleteDirectory(m_lldb_process_tmp_dir, true);
5241331afaSZachary Turner             }
5341331afaSZachary Turner         }
5441331afaSZachary Turner 
55673b6e4fSZachary Turner         uint32_t m_number_cpus;
56673b6e4fSZachary Turner         std::string m_vendor_string;
57673b6e4fSZachary Turner         std::string m_os_string;
58673b6e4fSZachary Turner         std::string m_host_triple;
59673b6e4fSZachary Turner 
60673b6e4fSZachary Turner         ArchSpec m_host_arch_32;
61673b6e4fSZachary Turner         ArchSpec m_host_arch_64;
62673b6e4fSZachary Turner 
63673b6e4fSZachary Turner         FileSpec m_lldb_so_dir;
64673b6e4fSZachary Turner         FileSpec m_lldb_support_exe_dir;
65673b6e4fSZachary Turner         FileSpec m_lldb_headers_dir;
66673b6e4fSZachary Turner         FileSpec m_lldb_python_dir;
67b1e1c62fSSean Callanan         FileSpec m_lldb_clang_resource_dir;
68673b6e4fSZachary Turner         FileSpec m_lldb_system_plugin_dir;
69673b6e4fSZachary Turner         FileSpec m_lldb_user_plugin_dir;
7063acdfdeSOleksiy Vyalov         FileSpec m_lldb_process_tmp_dir;
7163acdfdeSOleksiy Vyalov         FileSpec m_lldb_global_tmp_dir;
72673b6e4fSZachary Turner     };
73673b6e4fSZachary Turner 
74673b6e4fSZachary Turner     HostInfoBaseFields *g_fields = nullptr;
7542ff0ad8SZachary Turner }
7642ff0ad8SZachary Turner 
77673b6e4fSZachary Turner void
78673b6e4fSZachary Turner HostInfoBase::Initialize()
79673b6e4fSZachary Turner {
80673b6e4fSZachary Turner     g_fields = new HostInfoBaseFields();
81673b6e4fSZachary Turner }
8242ff0ad8SZachary Turner 
8341331afaSZachary Turner void
8441331afaSZachary Turner HostInfoBase::Terminate()
8541331afaSZachary Turner {
8641331afaSZachary Turner     delete g_fields;
8741331afaSZachary Turner     g_fields = nullptr;
8841331afaSZachary Turner }
8941331afaSZachary Turner 
9097a14e60SZachary Turner uint32_t
9197a14e60SZachary Turner HostInfoBase::GetNumberCPUS()
9297a14e60SZachary Turner {
93ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
94ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
95673b6e4fSZachary Turner         g_fields->m_number_cpus = std::thread::hardware_concurrency();
96ff48e4beSGreg Clayton     });
97673b6e4fSZachary Turner     return g_fields->m_number_cpus;
9897a14e60SZachary Turner }
9997a14e60SZachary Turner 
10039de3110SZachary Turner uint32_t
10139de3110SZachary Turner HostInfoBase::GetMaxThreadNameLength()
10239de3110SZachary Turner {
10339de3110SZachary Turner     return 0;
10439de3110SZachary Turner }
10539de3110SZachary Turner 
10697a14e60SZachary Turner llvm::StringRef
10797a14e60SZachary Turner HostInfoBase::GetVendorString()
10897a14e60SZachary Turner {
109ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
110ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
1113a29f8b9SPavel Labath         g_fields->m_vendor_string = HostInfo::GetArchitecture().GetTriple().getVendorName().str();
112ff48e4beSGreg Clayton     });
113673b6e4fSZachary Turner     return g_fields->m_vendor_string;
11497a14e60SZachary Turner }
11597a14e60SZachary Turner 
11697a14e60SZachary Turner llvm::StringRef
11797a14e60SZachary Turner HostInfoBase::GetOSString()
11897a14e60SZachary Turner {
119ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
120ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
121ff48e4beSGreg Clayton         g_fields->m_os_string = std::move(HostInfo::GetArchitecture().GetTriple().getOSName());
122ff48e4beSGreg Clayton     });
123673b6e4fSZachary Turner     return g_fields->m_os_string;
12497a14e60SZachary Turner }
12597a14e60SZachary Turner 
12697a14e60SZachary Turner llvm::StringRef
12797a14e60SZachary Turner HostInfoBase::GetTargetTriple()
12897a14e60SZachary Turner {
129ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
130ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
131ff48e4beSGreg Clayton         g_fields->m_host_triple = HostInfo::GetArchitecture().GetTriple().getTriple();
132ff48e4beSGreg Clayton     });
133673b6e4fSZachary Turner     return g_fields->m_host_triple;
13497a14e60SZachary Turner }
13513b18261SZachary Turner 
13613b18261SZachary Turner const ArchSpec &
13713b18261SZachary Turner HostInfoBase::GetArchitecture(ArchitectureKind arch_kind)
13813b18261SZachary Turner {
139ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
140ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
141673b6e4fSZachary Turner         HostInfo::ComputeHostArchitectureSupport(g_fields->m_host_arch_32, g_fields->m_host_arch_64);
142ff48e4beSGreg Clayton     });
14313b18261SZachary Turner 
14413b18261SZachary Turner     // If an explicit 32 or 64-bit architecture was requested, return that.
14513b18261SZachary Turner     if (arch_kind == eArchKind32)
146673b6e4fSZachary Turner         return g_fields->m_host_arch_32;
14713b18261SZachary Turner     if (arch_kind == eArchKind64)
148673b6e4fSZachary Turner         return g_fields->m_host_arch_64;
14913b18261SZachary Turner 
15013b18261SZachary Turner     // Otherwise prefer the 64-bit architecture if it is valid.
151673b6e4fSZachary Turner     return (g_fields->m_host_arch_64.IsValid()) ? g_fields->m_host_arch_64 : g_fields->m_host_arch_32;
15213b18261SZachary Turner }
15313b18261SZachary Turner 
15442ff0ad8SZachary Turner bool
15542ff0ad8SZachary Turner HostInfoBase::GetLLDBPath(lldb::PathType type, FileSpec &file_spec)
15642ff0ad8SZachary Turner {
15742ff0ad8SZachary Turner     file_spec.Clear();
15842ff0ad8SZachary Turner 
15942ff0ad8SZachary Turner #if defined(LLDB_DISABLE_PYTHON)
16042ff0ad8SZachary Turner     if (type == lldb::ePathTypePythonDir)
16142ff0ad8SZachary Turner         return false;
16242ff0ad8SZachary Turner #endif
16342ff0ad8SZachary Turner 
16442ff0ad8SZachary Turner     FileSpec *result = nullptr;
16542ff0ad8SZachary Turner     switch (type)
16642ff0ad8SZachary Turner     {
16742ff0ad8SZachary Turner         case lldb::ePathTypeLLDBShlibDir:
168ff48e4beSGreg Clayton             {
169ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
170ff48e4beSGreg Clayton                 static bool success = false;
171ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
172ff48e4beSGreg Clayton                     success = HostInfo::ComputeSharedLibraryDirectory (g_fields->m_lldb_so_dir);
173ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
17442ff0ad8SZachary Turner                     if (log)
175673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBShlibDir) => '%s'", g_fields->m_lldb_so_dir.GetPath().c_str());
176ff48e4beSGreg Clayton                 });
177ff48e4beSGreg Clayton                 if (success)
178ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_so_dir;
179ff48e4beSGreg Clayton             }
18042ff0ad8SZachary Turner             break;
18142ff0ad8SZachary Turner         case lldb::ePathTypeSupportExecutableDir:
182ff48e4beSGreg Clayton             {
183ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
184ff48e4beSGreg Clayton                 static bool success = false;
185ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
186ff48e4beSGreg Clayton                     success = HostInfo::ComputeSupportExeDirectory (g_fields->m_lldb_support_exe_dir);
187ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
18842ff0ad8SZachary Turner                     if (log)
189673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeSupportExecutableDir) => '%s'",
190673b6e4fSZachary Turner                                     g_fields->m_lldb_support_exe_dir.GetPath().c_str());
191ff48e4beSGreg Clayton                 });
192ff48e4beSGreg Clayton                 if (success)
193ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_support_exe_dir;
194ff48e4beSGreg Clayton             }
19542ff0ad8SZachary Turner             break;
19642ff0ad8SZachary Turner         case lldb::ePathTypeHeaderDir:
197ff48e4beSGreg Clayton             {
198ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
199ff48e4beSGreg Clayton                 static bool success = false;
200ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
201ff48e4beSGreg Clayton                     success = HostInfo::ComputeHeaderDirectory (g_fields->m_lldb_headers_dir);
202ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
20342ff0ad8SZachary Turner                     if (log)
204673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeHeaderDir) => '%s'", g_fields->m_lldb_headers_dir.GetPath().c_str());
205ff48e4beSGreg Clayton                 });
206ff48e4beSGreg Clayton                 if (success)
207ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_headers_dir;
208ff48e4beSGreg Clayton             }
20942ff0ad8SZachary Turner             break;
21042ff0ad8SZachary Turner         case lldb::ePathTypePythonDir:
211ff48e4beSGreg Clayton             {
212ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
213ff48e4beSGreg Clayton                 static bool success = false;
214ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
215ff48e4beSGreg Clayton                     success = HostInfo::ComputePythonDirectory (g_fields->m_lldb_python_dir);
216ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
21742ff0ad8SZachary Turner                     if (log)
218673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypePythonDir) => '%s'", g_fields->m_lldb_python_dir.GetPath().c_str());
219ff48e4beSGreg Clayton                 });
220ff48e4beSGreg Clayton                 if (success)
221ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_python_dir;
222ff48e4beSGreg Clayton             }
22342ff0ad8SZachary Turner             break;
224b1e1c62fSSean Callanan         case lldb::ePathTypeClangDir:
225ff48e4beSGreg Clayton             {
226ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
227ff48e4beSGreg Clayton                 static bool success = false;
228ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
229ff48e4beSGreg Clayton                     success = HostInfo::ComputeClangDirectory (g_fields->m_lldb_clang_resource_dir);
230ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
231b1e1c62fSSean Callanan                     if (log)
232b1e1c62fSSean Callanan                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeClangResourceDir) => '%s'", g_fields->m_lldb_clang_resource_dir.GetPath().c_str());
233ff48e4beSGreg Clayton                 });
234ff48e4beSGreg Clayton                 if (success)
235ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_clang_resource_dir;
236ff48e4beSGreg Clayton             }
237b1e1c62fSSean Callanan             break;
23842ff0ad8SZachary Turner         case lldb::ePathTypeLLDBSystemPlugins:
239ff48e4beSGreg Clayton             {
240ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
241ff48e4beSGreg Clayton                 static bool success = false;
242ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
243ff48e4beSGreg Clayton                     success = HostInfo::ComputeSystemPluginsDirectory (g_fields->m_lldb_system_plugin_dir);
244ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
24542ff0ad8SZachary Turner                     if (log)
246673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBSystemPlugins) => '%s'",
247673b6e4fSZachary Turner                                     g_fields->m_lldb_system_plugin_dir.GetPath().c_str());
248ff48e4beSGreg Clayton                 });
249ff48e4beSGreg Clayton                 if (success)
250ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_system_plugin_dir;
251ff48e4beSGreg Clayton             }
25242ff0ad8SZachary Turner             break;
25342ff0ad8SZachary Turner         case lldb::ePathTypeLLDBUserPlugins:
254ff48e4beSGreg Clayton             {
255ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
256ff48e4beSGreg Clayton                 static bool success = false;
257ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
258ff48e4beSGreg Clayton                     success = HostInfo::ComputeUserPluginsDirectory (g_fields->m_lldb_user_plugin_dir);
259ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
26042ff0ad8SZachary Turner                     if (log)
261673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBUserPlugins) => '%s'",
262673b6e4fSZachary Turner                                     g_fields->m_lldb_user_plugin_dir.GetPath().c_str());
263ff48e4beSGreg Clayton                 });
264ff48e4beSGreg Clayton                 if (success)
265ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_user_plugin_dir;
266ff48e4beSGreg Clayton             }
26742ff0ad8SZachary Turner             break;
26842ff0ad8SZachary Turner         case lldb::ePathTypeLLDBTempSystemDir:
269ff48e4beSGreg Clayton             {
270ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
271ff48e4beSGreg Clayton                 static bool success = false;
272ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
27363acdfdeSOleksiy Vyalov                     success = HostInfo::ComputeProcessTempFileDirectory (g_fields->m_lldb_process_tmp_dir);
274ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
27542ff0ad8SZachary Turner                     if (log)
27663acdfdeSOleksiy Vyalov                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'", g_fields->m_lldb_process_tmp_dir.GetPath().c_str());
277ff48e4beSGreg Clayton                 });
278ff48e4beSGreg Clayton                 if (success)
27963acdfdeSOleksiy Vyalov                     result = &g_fields->m_lldb_process_tmp_dir;
28063acdfdeSOleksiy Vyalov             }
28163acdfdeSOleksiy Vyalov             break;
28263acdfdeSOleksiy Vyalov         case lldb::ePathTypeGlobalLLDBTempSystemDir:
28363acdfdeSOleksiy Vyalov             {
28463acdfdeSOleksiy Vyalov                 static std::once_flag g_once_flag;
28563acdfdeSOleksiy Vyalov                 static bool success = false;
28663acdfdeSOleksiy Vyalov                 std::call_once(g_once_flag,  []() {
28763acdfdeSOleksiy Vyalov                     success = HostInfo::ComputeGlobalTempFileDirectory (g_fields->m_lldb_global_tmp_dir);
28863acdfdeSOleksiy Vyalov                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
28963acdfdeSOleksiy Vyalov                     if (log)
29063acdfdeSOleksiy Vyalov                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeGlobalLLDBTempSystemDir) => '%s'", g_fields->m_lldb_global_tmp_dir.GetPath().c_str());
29163acdfdeSOleksiy Vyalov                 });
29263acdfdeSOleksiy Vyalov                 if (success)
29363acdfdeSOleksiy Vyalov                     result = &g_fields->m_lldb_global_tmp_dir;
294ff48e4beSGreg Clayton             }
29542ff0ad8SZachary Turner             break;
29642ff0ad8SZachary Turner     }
29742ff0ad8SZachary Turner 
29842ff0ad8SZachary Turner     if (!result)
29942ff0ad8SZachary Turner         return false;
30042ff0ad8SZachary Turner     file_spec = *result;
30142ff0ad8SZachary Turner     return true;
30242ff0ad8SZachary Turner }
30342ff0ad8SZachary Turner 
30442ff0ad8SZachary Turner bool
30542ff0ad8SZachary Turner HostInfoBase::ComputeSharedLibraryDirectory(FileSpec &file_spec)
30642ff0ad8SZachary Turner {
30742ff0ad8SZachary Turner     // To get paths related to LLDB we get the path to the executable that
30842ff0ad8SZachary Turner     // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB",
30942ff0ad8SZachary Turner     // on linux this is assumed to be the "lldb" main executable. If LLDB on
31042ff0ad8SZachary Turner     // linux is actually in a shared library (liblldb.so) then this function will
31142ff0ad8SZachary Turner     // need to be modified to "do the right thing".
31242ff0ad8SZachary Turner 
31342ff0ad8SZachary Turner     FileSpec lldb_file_spec(
31442ff0ad8SZachary Turner         Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>(reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath))));
31542ff0ad8SZachary Turner 
316db7d8083SSean Callanan     // This is necessary because when running the testsuite the shlib might be a symbolic link inside the Python resource dir.
3179077e9f8SSean Callanan     FileSystem::ResolveSymbolicLink(lldb_file_spec, lldb_file_spec);
318db7d8083SSean Callanan 
31942ff0ad8SZachary Turner     // Remove the filename so that this FileSpec only represents the directory.
3200d8400c8SGreg Clayton     file_spec.GetDirectory() = lldb_file_spec.GetDirectory();
32142ff0ad8SZachary Turner 
32242ff0ad8SZachary Turner     return (bool)file_spec.GetDirectory();
32342ff0ad8SZachary Turner }
32442ff0ad8SZachary Turner 
32542ff0ad8SZachary Turner bool
32642ff0ad8SZachary Turner HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec)
32742ff0ad8SZachary Turner {
32842ff0ad8SZachary Turner     return GetLLDBPath(lldb::ePathTypeLLDBShlibDir, file_spec);
32942ff0ad8SZachary Turner }
33042ff0ad8SZachary Turner 
33142ff0ad8SZachary Turner bool
33263acdfdeSOleksiy Vyalov HostInfoBase::ComputeProcessTempFileDirectory(FileSpec &file_spec)
33342ff0ad8SZachary Turner {
33463acdfdeSOleksiy Vyalov     FileSpec temp_file_spec;
335f3a24329STamas Berghammer     if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec))
33663acdfdeSOleksiy Vyalov         return false;
33763acdfdeSOleksiy Vyalov 
338*1eb0d42aSPavel Labath     std::string pid_str{llvm::to_string(Host::GetCurrentProcessID())};
339d3173f34SChaoren Lin     temp_file_spec.AppendPathComponent(pid_str);
340d3173f34SChaoren Lin     if (!FileSystem::MakeDirectory(temp_file_spec, eFilePermissionsDirectoryDefault).Success())
34163acdfdeSOleksiy Vyalov         return false;
34263acdfdeSOleksiy Vyalov 
343b79863c2SChaoren Lin     file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
34463acdfdeSOleksiy Vyalov     return true;
34563acdfdeSOleksiy Vyalov }
34663acdfdeSOleksiy Vyalov 
34763acdfdeSOleksiy Vyalov bool
348f3a24329STamas Berghammer HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec)
34963acdfdeSOleksiy Vyalov {
35033183147SPavel Labath     llvm::SmallVector<char, 16> tmpdir;
35133183147SPavel Labath     llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir);
35233183147SPavel Labath     file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()), true);
353f3a24329STamas Berghammer     return true;
354f3a24329STamas Berghammer }
355f3a24329STamas Berghammer 
356f3a24329STamas Berghammer bool
357f3a24329STamas Berghammer HostInfoBase::ComputeGlobalTempFileDirectory(FileSpec &file_spec)
358f3a24329STamas Berghammer {
359f3a24329STamas Berghammer     file_spec.Clear();
360f3a24329STamas Berghammer 
361f3a24329STamas Berghammer     FileSpec temp_file_spec;
362f3a24329STamas Berghammer     if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec))
363f3a24329STamas Berghammer         return false;
364f3a24329STamas Berghammer 
365270e99abSZachary Turner     temp_file_spec.AppendPathComponent("lldb");
366d3173f34SChaoren Lin     if (!FileSystem::MakeDirectory(temp_file_spec, eFilePermissionsDirectoryDefault).Success())
36742ff0ad8SZachary Turner         return false;
36842ff0ad8SZachary Turner 
369b79863c2SChaoren Lin     file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
37042ff0ad8SZachary Turner     return true;
37142ff0ad8SZachary Turner }
37242ff0ad8SZachary Turner 
37342ff0ad8SZachary Turner bool
37442ff0ad8SZachary Turner HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec)
37542ff0ad8SZachary Turner {
37642ff0ad8SZachary Turner     // TODO(zturner): Figure out how to compute the header directory for all platforms.
37742ff0ad8SZachary Turner     return false;
37842ff0ad8SZachary Turner }
37942ff0ad8SZachary Turner 
38042ff0ad8SZachary Turner bool
38142ff0ad8SZachary Turner HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec)
38242ff0ad8SZachary Turner {
38342ff0ad8SZachary Turner     // TODO(zturner): Figure out how to compute the system plugins directory for all platforms.
38442ff0ad8SZachary Turner     return false;
38542ff0ad8SZachary Turner }
38642ff0ad8SZachary Turner 
38742ff0ad8SZachary Turner bool
388b1e1c62fSSean Callanan HostInfoBase::ComputeClangDirectory(FileSpec &file_spec)
389b1e1c62fSSean Callanan {
390b1e1c62fSSean Callanan     return false;
391b1e1c62fSSean Callanan }
392b1e1c62fSSean Callanan 
393b1e1c62fSSean Callanan bool
39442ff0ad8SZachary Turner HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec)
39542ff0ad8SZachary Turner {
39642ff0ad8SZachary Turner     // TODO(zturner): Figure out how to compute the user plugins directory for all platforms.
39742ff0ad8SZachary Turner     return false;
39842ff0ad8SZachary Turner }
39942ff0ad8SZachary Turner 
40013b18261SZachary Turner void
40113b18261SZachary Turner HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32, ArchSpec &arch_64)
40213b18261SZachary Turner {
403b071bee2SOleksiy Vyalov     llvm::Triple triple(llvm::sys::getProcessTriple());
40413b18261SZachary Turner 
40513b18261SZachary Turner     arch_32.Clear();
40613b18261SZachary Turner     arch_64.Clear();
40713b18261SZachary Turner 
40813b18261SZachary Turner     switch (triple.getArch())
40913b18261SZachary Turner     {
41013b18261SZachary Turner         default:
41113b18261SZachary Turner             arch_32.SetTriple(triple);
41213b18261SZachary Turner             break;
41313b18261SZachary Turner 
414e85e6021STamas Berghammer         case llvm::Triple::aarch64:
4152559abdaSJustin Hibbits         case llvm::Triple::ppc64:
416f9ee7e4cSJustin Hibbits         case llvm::Triple::x86_64:
41713b18261SZachary Turner             arch_64.SetTriple(triple);
41813b18261SZachary Turner             arch_32.SetTriple(triple.get32BitArchVariant());
41913b18261SZachary Turner             break;
42013b18261SZachary Turner 
42113b18261SZachary Turner         case llvm::Triple::mips64:
4223df471c3SMohit K. Bhakkad         case llvm::Triple::mips64el:
42313b18261SZachary Turner         case llvm::Triple::sparcv9:
424bb00d0b6SUlrich Weigand         case llvm::Triple::systemz:
42513b18261SZachary Turner             arch_64.SetTriple(triple);
42613b18261SZachary Turner             break;
42713b18261SZachary Turner     }
42813b18261SZachary Turner }
429