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"
2333183147SPavel 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 {
34ff48e4beSGreg Clayton     //----------------------------------------------------------------------
35ff48e4beSGreg Clayton     // The HostInfoBaseFields is a work around for windows not supporting
36ff48e4beSGreg Clayton     // static variables correctly in a thread safe way. Really each of the
37ff48e4beSGreg Clayton     // variables in HostInfoBaseFields should live in the functions in which
38ff48e4beSGreg Clayton     // they are used and each one should be static, but the work around is
39ff48e4beSGreg Clayton     // in place to avoid this restriction. Ick.
40ff48e4beSGreg Clayton     //----------------------------------------------------------------------
41ff48e4beSGreg Clayton 
42673b6e4fSZachary Turner     struct HostInfoBaseFields
43673b6e4fSZachary Turner     {
44*41331afaSZachary Turner         ~HostInfoBaseFields()
45*41331afaSZachary Turner         {
46*41331afaSZachary Turner             if (m_lldb_process_tmp_dir.Exists())
47*41331afaSZachary Turner             {
48*41331afaSZachary Turner                 // Remove the LLDB temporary directory if we have one. Set "recurse" to
49*41331afaSZachary Turner                 // true to all files that were created for the LLDB process can be cleaned up.
50*41331afaSZachary Turner                 FileSystem::DeleteDirectory(m_lldb_process_tmp_dir, true);
51*41331afaSZachary Turner             }
52*41331afaSZachary Turner         }
53*41331afaSZachary Turner 
54673b6e4fSZachary Turner         uint32_t m_number_cpus;
55673b6e4fSZachary Turner         std::string m_vendor_string;
56673b6e4fSZachary Turner         std::string m_os_string;
57673b6e4fSZachary Turner         std::string m_host_triple;
58673b6e4fSZachary Turner 
59673b6e4fSZachary Turner         ArchSpec m_host_arch_32;
60673b6e4fSZachary Turner         ArchSpec m_host_arch_64;
61673b6e4fSZachary Turner 
62673b6e4fSZachary Turner         FileSpec m_lldb_so_dir;
63673b6e4fSZachary Turner         FileSpec m_lldb_support_exe_dir;
64673b6e4fSZachary Turner         FileSpec m_lldb_headers_dir;
65673b6e4fSZachary Turner         FileSpec m_lldb_python_dir;
66b1e1c62fSSean Callanan         FileSpec m_lldb_clang_resource_dir;
67673b6e4fSZachary Turner         FileSpec m_lldb_system_plugin_dir;
68673b6e4fSZachary Turner         FileSpec m_lldb_user_plugin_dir;
6963acdfdeSOleksiy Vyalov         FileSpec m_lldb_process_tmp_dir;
7063acdfdeSOleksiy Vyalov         FileSpec m_lldb_global_tmp_dir;
71673b6e4fSZachary Turner     };
72673b6e4fSZachary Turner 
73673b6e4fSZachary Turner     HostInfoBaseFields *g_fields = nullptr;
7442ff0ad8SZachary Turner }
7542ff0ad8SZachary Turner 
76673b6e4fSZachary Turner void
77673b6e4fSZachary Turner HostInfoBase::Initialize()
78673b6e4fSZachary Turner {
79673b6e4fSZachary Turner     g_fields = new HostInfoBaseFields();
80673b6e4fSZachary Turner }
8142ff0ad8SZachary Turner 
82*41331afaSZachary Turner void
83*41331afaSZachary Turner HostInfoBase::Terminate()
84*41331afaSZachary Turner {
85*41331afaSZachary Turner     delete g_fields;
86*41331afaSZachary Turner     g_fields = nullptr;
87*41331afaSZachary Turner }
88*41331afaSZachary Turner 
8997a14e60SZachary Turner uint32_t
9097a14e60SZachary Turner HostInfoBase::GetNumberCPUS()
9197a14e60SZachary Turner {
92ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
93ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
94673b6e4fSZachary Turner         g_fields->m_number_cpus = std::thread::hardware_concurrency();
95ff48e4beSGreg Clayton     });
96673b6e4fSZachary Turner     return g_fields->m_number_cpus;
9797a14e60SZachary Turner }
9897a14e60SZachary Turner 
9939de3110SZachary Turner uint32_t
10039de3110SZachary Turner HostInfoBase::GetMaxThreadNameLength()
10139de3110SZachary Turner {
10239de3110SZachary Turner     return 0;
10339de3110SZachary Turner }
10439de3110SZachary Turner 
10597a14e60SZachary Turner llvm::StringRef
10697a14e60SZachary Turner HostInfoBase::GetVendorString()
10797a14e60SZachary Turner {
108ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
109ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
1103a29f8b9SPavel Labath         g_fields->m_vendor_string = HostInfo::GetArchitecture().GetTriple().getVendorName().str();
111ff48e4beSGreg Clayton     });
112673b6e4fSZachary Turner     return g_fields->m_vendor_string;
11397a14e60SZachary Turner }
11497a14e60SZachary Turner 
11597a14e60SZachary Turner llvm::StringRef
11697a14e60SZachary Turner HostInfoBase::GetOSString()
11797a14e60SZachary Turner {
118ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
119ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
120ff48e4beSGreg Clayton         g_fields->m_os_string = std::move(HostInfo::GetArchitecture().GetTriple().getOSName());
121ff48e4beSGreg Clayton     });
122673b6e4fSZachary Turner     return g_fields->m_os_string;
12397a14e60SZachary Turner }
12497a14e60SZachary Turner 
12597a14e60SZachary Turner llvm::StringRef
12697a14e60SZachary Turner HostInfoBase::GetTargetTriple()
12797a14e60SZachary Turner {
128ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
129ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
130ff48e4beSGreg Clayton         g_fields->m_host_triple = HostInfo::GetArchitecture().GetTriple().getTriple();
131ff48e4beSGreg Clayton     });
132673b6e4fSZachary Turner     return g_fields->m_host_triple;
13397a14e60SZachary Turner }
13413b18261SZachary Turner 
13513b18261SZachary Turner const ArchSpec &
13613b18261SZachary Turner HostInfoBase::GetArchitecture(ArchitectureKind arch_kind)
13713b18261SZachary Turner {
138ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
139ff48e4beSGreg Clayton     std::call_once(g_once_flag,  []() {
140673b6e4fSZachary Turner         HostInfo::ComputeHostArchitectureSupport(g_fields->m_host_arch_32, g_fields->m_host_arch_64);
141ff48e4beSGreg Clayton     });
14213b18261SZachary Turner 
14313b18261SZachary Turner     // If an explicit 32 or 64-bit architecture was requested, return that.
14413b18261SZachary Turner     if (arch_kind == eArchKind32)
145673b6e4fSZachary Turner         return g_fields->m_host_arch_32;
14613b18261SZachary Turner     if (arch_kind == eArchKind64)
147673b6e4fSZachary Turner         return g_fields->m_host_arch_64;
14813b18261SZachary Turner 
14913b18261SZachary Turner     // Otherwise prefer the 64-bit architecture if it is valid.
150673b6e4fSZachary Turner     return (g_fields->m_host_arch_64.IsValid()) ? g_fields->m_host_arch_64 : g_fields->m_host_arch_32;
15113b18261SZachary Turner }
15213b18261SZachary Turner 
15342ff0ad8SZachary Turner bool
15442ff0ad8SZachary Turner HostInfoBase::GetLLDBPath(lldb::PathType type, FileSpec &file_spec)
15542ff0ad8SZachary Turner {
15642ff0ad8SZachary Turner     file_spec.Clear();
15742ff0ad8SZachary Turner 
15842ff0ad8SZachary Turner #if defined(LLDB_DISABLE_PYTHON)
15942ff0ad8SZachary Turner     if (type == lldb::ePathTypePythonDir)
16042ff0ad8SZachary Turner         return false;
16142ff0ad8SZachary Turner #endif
16242ff0ad8SZachary Turner 
16342ff0ad8SZachary Turner     FileSpec *result = nullptr;
16442ff0ad8SZachary Turner     switch (type)
16542ff0ad8SZachary Turner     {
16642ff0ad8SZachary Turner         case lldb::ePathTypeLLDBShlibDir:
167ff48e4beSGreg Clayton             {
168ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
169ff48e4beSGreg Clayton                 static bool success = false;
170ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
171ff48e4beSGreg Clayton                     success = HostInfo::ComputeSharedLibraryDirectory (g_fields->m_lldb_so_dir);
172ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
17342ff0ad8SZachary Turner                     if (log)
174673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBShlibDir) => '%s'", g_fields->m_lldb_so_dir.GetPath().c_str());
175ff48e4beSGreg Clayton                 });
176ff48e4beSGreg Clayton                 if (success)
177ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_so_dir;
178ff48e4beSGreg Clayton             }
17942ff0ad8SZachary Turner             break;
18042ff0ad8SZachary Turner         case lldb::ePathTypeSupportExecutableDir:
181ff48e4beSGreg Clayton             {
182ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
183ff48e4beSGreg Clayton                 static bool success = false;
184ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
185ff48e4beSGreg Clayton                     success = HostInfo::ComputeSupportExeDirectory (g_fields->m_lldb_support_exe_dir);
186ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
18742ff0ad8SZachary Turner                     if (log)
188673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeSupportExecutableDir) => '%s'",
189673b6e4fSZachary Turner                                     g_fields->m_lldb_support_exe_dir.GetPath().c_str());
190ff48e4beSGreg Clayton                 });
191ff48e4beSGreg Clayton                 if (success)
192ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_support_exe_dir;
193ff48e4beSGreg Clayton             }
19442ff0ad8SZachary Turner             break;
19542ff0ad8SZachary Turner         case lldb::ePathTypeHeaderDir:
196ff48e4beSGreg Clayton             {
197ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
198ff48e4beSGreg Clayton                 static bool success = false;
199ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
200ff48e4beSGreg Clayton                     success = HostInfo::ComputeHeaderDirectory (g_fields->m_lldb_headers_dir);
201ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
20242ff0ad8SZachary Turner                     if (log)
203673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeHeaderDir) => '%s'", g_fields->m_lldb_headers_dir.GetPath().c_str());
204ff48e4beSGreg Clayton                 });
205ff48e4beSGreg Clayton                 if (success)
206ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_headers_dir;
207ff48e4beSGreg Clayton             }
20842ff0ad8SZachary Turner             break;
20942ff0ad8SZachary Turner         case lldb::ePathTypePythonDir:
210ff48e4beSGreg Clayton             {
211ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
212ff48e4beSGreg Clayton                 static bool success = false;
213ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
214ff48e4beSGreg Clayton                     success = HostInfo::ComputePythonDirectory (g_fields->m_lldb_python_dir);
215ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
21642ff0ad8SZachary Turner                     if (log)
217673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypePythonDir) => '%s'", g_fields->m_lldb_python_dir.GetPath().c_str());
218ff48e4beSGreg Clayton                 });
219ff48e4beSGreg Clayton                 if (success)
220ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_python_dir;
221ff48e4beSGreg Clayton             }
22242ff0ad8SZachary Turner             break;
223b1e1c62fSSean Callanan         case lldb::ePathTypeClangDir:
224ff48e4beSGreg Clayton             {
225ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
226ff48e4beSGreg Clayton                 static bool success = false;
227ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
228ff48e4beSGreg Clayton                     success = HostInfo::ComputeClangDirectory (g_fields->m_lldb_clang_resource_dir);
229ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
230b1e1c62fSSean Callanan                     if (log)
231b1e1c62fSSean Callanan                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeClangResourceDir) => '%s'", g_fields->m_lldb_clang_resource_dir.GetPath().c_str());
232ff48e4beSGreg Clayton                 });
233ff48e4beSGreg Clayton                 if (success)
234ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_clang_resource_dir;
235ff48e4beSGreg Clayton             }
236b1e1c62fSSean Callanan             break;
23742ff0ad8SZachary Turner         case lldb::ePathTypeLLDBSystemPlugins:
238ff48e4beSGreg Clayton             {
239ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
240ff48e4beSGreg Clayton                 static bool success = false;
241ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
242ff48e4beSGreg Clayton                     success = HostInfo::ComputeSystemPluginsDirectory (g_fields->m_lldb_system_plugin_dir);
243ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
24442ff0ad8SZachary Turner                     if (log)
245673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBSystemPlugins) => '%s'",
246673b6e4fSZachary Turner                                     g_fields->m_lldb_system_plugin_dir.GetPath().c_str());
247ff48e4beSGreg Clayton                 });
248ff48e4beSGreg Clayton                 if (success)
249ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_system_plugin_dir;
250ff48e4beSGreg Clayton             }
25142ff0ad8SZachary Turner             break;
25242ff0ad8SZachary Turner         case lldb::ePathTypeLLDBUserPlugins:
253ff48e4beSGreg Clayton             {
254ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
255ff48e4beSGreg Clayton                 static bool success = false;
256ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
257ff48e4beSGreg Clayton                     success = HostInfo::ComputeUserPluginsDirectory (g_fields->m_lldb_user_plugin_dir);
258ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
25942ff0ad8SZachary Turner                     if (log)
260673b6e4fSZachary Turner                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBUserPlugins) => '%s'",
261673b6e4fSZachary Turner                                     g_fields->m_lldb_user_plugin_dir.GetPath().c_str());
262ff48e4beSGreg Clayton                 });
263ff48e4beSGreg Clayton                 if (success)
264ff48e4beSGreg Clayton                     result = &g_fields->m_lldb_user_plugin_dir;
265ff48e4beSGreg Clayton             }
26642ff0ad8SZachary Turner             break;
26742ff0ad8SZachary Turner         case lldb::ePathTypeLLDBTempSystemDir:
268ff48e4beSGreg Clayton             {
269ff48e4beSGreg Clayton                 static std::once_flag g_once_flag;
270ff48e4beSGreg Clayton                 static bool success = false;
271ff48e4beSGreg Clayton                 std::call_once(g_once_flag,  []() {
27263acdfdeSOleksiy Vyalov                     success = HostInfo::ComputeProcessTempFileDirectory (g_fields->m_lldb_process_tmp_dir);
273ff48e4beSGreg Clayton                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
27442ff0ad8SZachary Turner                     if (log)
27563acdfdeSOleksiy Vyalov                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'", g_fields->m_lldb_process_tmp_dir.GetPath().c_str());
276ff48e4beSGreg Clayton                 });
277ff48e4beSGreg Clayton                 if (success)
27863acdfdeSOleksiy Vyalov                     result = &g_fields->m_lldb_process_tmp_dir;
27963acdfdeSOleksiy Vyalov             }
28063acdfdeSOleksiy Vyalov             break;
28163acdfdeSOleksiy Vyalov         case lldb::ePathTypeGlobalLLDBTempSystemDir:
28263acdfdeSOleksiy Vyalov             {
28363acdfdeSOleksiy Vyalov                 static std::once_flag g_once_flag;
28463acdfdeSOleksiy Vyalov                 static bool success = false;
28563acdfdeSOleksiy Vyalov                 std::call_once(g_once_flag,  []() {
28663acdfdeSOleksiy Vyalov                     success = HostInfo::ComputeGlobalTempFileDirectory (g_fields->m_lldb_global_tmp_dir);
28763acdfdeSOleksiy Vyalov                     Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
28863acdfdeSOleksiy Vyalov                     if (log)
28963acdfdeSOleksiy Vyalov                         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeGlobalLLDBTempSystemDir) => '%s'", g_fields->m_lldb_global_tmp_dir.GetPath().c_str());
29063acdfdeSOleksiy Vyalov                 });
29163acdfdeSOleksiy Vyalov                 if (success)
29263acdfdeSOleksiy Vyalov                     result = &g_fields->m_lldb_global_tmp_dir;
293ff48e4beSGreg Clayton             }
29442ff0ad8SZachary Turner             break;
29542ff0ad8SZachary Turner     }
29642ff0ad8SZachary Turner 
29742ff0ad8SZachary Turner     if (!result)
29842ff0ad8SZachary Turner         return false;
29942ff0ad8SZachary Turner     file_spec = *result;
30042ff0ad8SZachary Turner     return true;
30142ff0ad8SZachary Turner }
30242ff0ad8SZachary Turner 
30342ff0ad8SZachary Turner bool
30442ff0ad8SZachary Turner HostInfoBase::ComputeSharedLibraryDirectory(FileSpec &file_spec)
30542ff0ad8SZachary Turner {
30642ff0ad8SZachary Turner     // To get paths related to LLDB we get the path to the executable that
30742ff0ad8SZachary Turner     // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB",
30842ff0ad8SZachary Turner     // on linux this is assumed to be the "lldb" main executable. If LLDB on
30942ff0ad8SZachary Turner     // linux is actually in a shared library (liblldb.so) then this function will
31042ff0ad8SZachary Turner     // need to be modified to "do the right thing".
31142ff0ad8SZachary Turner 
31242ff0ad8SZachary Turner     FileSpec lldb_file_spec(
31342ff0ad8SZachary Turner         Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>(reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath))));
31442ff0ad8SZachary Turner 
315db7d8083SSean Callanan     // This is necessary because when running the testsuite the shlib might be a symbolic link inside the Python resource dir.
3169077e9f8SSean Callanan     FileSystem::ResolveSymbolicLink(lldb_file_spec, lldb_file_spec);
317db7d8083SSean Callanan 
31842ff0ad8SZachary Turner     // Remove the filename so that this FileSpec only represents the directory.
3190d8400c8SGreg Clayton     file_spec.GetDirectory() = lldb_file_spec.GetDirectory();
32042ff0ad8SZachary Turner 
32142ff0ad8SZachary Turner     return (bool)file_spec.GetDirectory();
32242ff0ad8SZachary Turner }
32342ff0ad8SZachary Turner 
32442ff0ad8SZachary Turner bool
32542ff0ad8SZachary Turner HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec)
32642ff0ad8SZachary Turner {
32742ff0ad8SZachary Turner     return GetLLDBPath(lldb::ePathTypeLLDBShlibDir, file_spec);
32842ff0ad8SZachary Turner }
32942ff0ad8SZachary Turner 
33042ff0ad8SZachary Turner bool
33163acdfdeSOleksiy Vyalov HostInfoBase::ComputeProcessTempFileDirectory(FileSpec &file_spec)
33242ff0ad8SZachary Turner {
33363acdfdeSOleksiy Vyalov     FileSpec temp_file_spec;
334f3a24329STamas Berghammer     if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec))
33563acdfdeSOleksiy Vyalov         return false;
33663acdfdeSOleksiy Vyalov 
337d3173f34SChaoren Lin     std::string pid_str{std::to_string(Host::GetCurrentProcessID())};
338d3173f34SChaoren Lin     temp_file_spec.AppendPathComponent(pid_str);
339d3173f34SChaoren Lin     if (!FileSystem::MakeDirectory(temp_file_spec, eFilePermissionsDirectoryDefault).Success())
34063acdfdeSOleksiy Vyalov         return false;
34163acdfdeSOleksiy Vyalov 
342b79863c2SChaoren Lin     file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
34363acdfdeSOleksiy Vyalov     return true;
34463acdfdeSOleksiy Vyalov }
34563acdfdeSOleksiy Vyalov 
34663acdfdeSOleksiy Vyalov bool
347f3a24329STamas Berghammer HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec)
34863acdfdeSOleksiy Vyalov {
34933183147SPavel Labath     llvm::SmallVector<char, 16> tmpdir;
35033183147SPavel Labath     llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir);
35133183147SPavel Labath     file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()), true);
352f3a24329STamas Berghammer     return true;
353f3a24329STamas Berghammer }
354f3a24329STamas Berghammer 
355f3a24329STamas Berghammer bool
356f3a24329STamas Berghammer HostInfoBase::ComputeGlobalTempFileDirectory(FileSpec &file_spec)
357f3a24329STamas Berghammer {
358f3a24329STamas Berghammer     file_spec.Clear();
359f3a24329STamas Berghammer 
360f3a24329STamas Berghammer     FileSpec temp_file_spec;
361f3a24329STamas Berghammer     if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec))
362f3a24329STamas Berghammer         return false;
363f3a24329STamas Berghammer 
364270e99abSZachary Turner     temp_file_spec.AppendPathComponent("lldb");
365d3173f34SChaoren Lin     if (!FileSystem::MakeDirectory(temp_file_spec, eFilePermissionsDirectoryDefault).Success())
36642ff0ad8SZachary Turner         return false;
36742ff0ad8SZachary Turner 
368b79863c2SChaoren Lin     file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
36942ff0ad8SZachary Turner     return true;
37042ff0ad8SZachary Turner }
37142ff0ad8SZachary Turner 
37242ff0ad8SZachary Turner bool
37342ff0ad8SZachary Turner HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec)
37442ff0ad8SZachary Turner {
37542ff0ad8SZachary Turner     // TODO(zturner): Figure out how to compute the header directory for all platforms.
37642ff0ad8SZachary Turner     return false;
37742ff0ad8SZachary Turner }
37842ff0ad8SZachary Turner 
37942ff0ad8SZachary Turner bool
38042ff0ad8SZachary Turner HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec)
38142ff0ad8SZachary Turner {
38242ff0ad8SZachary Turner     // TODO(zturner): Figure out how to compute the system plugins directory for all platforms.
38342ff0ad8SZachary Turner     return false;
38442ff0ad8SZachary Turner }
38542ff0ad8SZachary Turner 
38642ff0ad8SZachary Turner bool
387b1e1c62fSSean Callanan HostInfoBase::ComputeClangDirectory(FileSpec &file_spec)
388b1e1c62fSSean Callanan {
389b1e1c62fSSean Callanan     return false;
390b1e1c62fSSean Callanan }
391b1e1c62fSSean Callanan 
392b1e1c62fSSean Callanan bool
39342ff0ad8SZachary Turner HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec)
39442ff0ad8SZachary Turner {
39542ff0ad8SZachary Turner     // TODO(zturner): Figure out how to compute the user plugins directory for all platforms.
39642ff0ad8SZachary Turner     return false;
39742ff0ad8SZachary Turner }
39842ff0ad8SZachary Turner 
39913b18261SZachary Turner void
40013b18261SZachary Turner HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32, ArchSpec &arch_64)
40113b18261SZachary Turner {
402b071bee2SOleksiy Vyalov     llvm::Triple triple(llvm::sys::getProcessTriple());
40313b18261SZachary Turner 
40413b18261SZachary Turner     arch_32.Clear();
40513b18261SZachary Turner     arch_64.Clear();
40613b18261SZachary Turner 
40713b18261SZachary Turner     switch (triple.getArch())
40813b18261SZachary Turner     {
40913b18261SZachary Turner         default:
41013b18261SZachary Turner             arch_32.SetTriple(triple);
41113b18261SZachary Turner             break;
41213b18261SZachary Turner 
413e85e6021STamas Berghammer         case llvm::Triple::aarch64:
4142559abdaSJustin Hibbits         case llvm::Triple::ppc64:
415f9ee7e4cSJustin Hibbits         case llvm::Triple::x86_64:
41613b18261SZachary Turner             arch_64.SetTriple(triple);
41713b18261SZachary Turner             arch_32.SetTriple(triple.get32BitArchVariant());
41813b18261SZachary Turner             break;
41913b18261SZachary Turner 
42013b18261SZachary Turner         case llvm::Triple::mips64:
4213df471c3SMohit K. Bhakkad         case llvm::Triple::mips64el:
42213b18261SZachary Turner         case llvm::Triple::sparcv9:
42313b18261SZachary Turner             arch_64.SetTriple(triple);
42413b18261SZachary Turner             break;
42513b18261SZachary Turner     }
42613b18261SZachary Turner }
427