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"
211eb0d42aSPavel Labath #include "llvm/ADT/Triple.h"
2213b18261SZachary Turner #include "llvm/Support/Host.h"
2333183147SPavel Labath #include "llvm/Support/Path.h"
241eb0d42aSPavel Labath #include "llvm/Support/ScopedPrinter.h"
25270e99abSZachary Turner #include "llvm/Support/raw_ostream.h"
2697a14e60SZachary Turner 
27ff48e4beSGreg Clayton #include <mutex> // std::once
28*b9c1b51eSKate Stone #include <thread>
2997a14e60SZachary Turner 
3097a14e60SZachary Turner using namespace lldb;
3197a14e60SZachary Turner using namespace lldb_private;
3297a14e60SZachary Turner 
33*b9c1b51eSKate Stone namespace {
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 
42*b9c1b51eSKate Stone struct HostInfoBaseFields {
43*b9c1b51eSKate Stone   ~HostInfoBaseFields() {
44*b9c1b51eSKate Stone     if (m_lldb_process_tmp_dir.Exists()) {
4541331afaSZachary Turner       // Remove the LLDB temporary directory if we have one. Set "recurse" to
46*b9c1b51eSKate Stone       // true to all files that were created for the LLDB process can be cleaned
47*b9c1b51eSKate Stone       // up.
4841331afaSZachary Turner       FileSystem::DeleteDirectory(m_lldb_process_tmp_dir, true);
4941331afaSZachary Turner     }
5041331afaSZachary Turner   }
5141331afaSZachary Turner 
52673b6e4fSZachary Turner   uint32_t m_number_cpus;
53673b6e4fSZachary Turner   std::string m_vendor_string;
54673b6e4fSZachary Turner   std::string m_os_string;
55673b6e4fSZachary Turner   std::string m_host_triple;
56673b6e4fSZachary Turner 
57673b6e4fSZachary Turner   ArchSpec m_host_arch_32;
58673b6e4fSZachary Turner   ArchSpec m_host_arch_64;
59673b6e4fSZachary Turner 
60673b6e4fSZachary Turner   FileSpec m_lldb_so_dir;
61673b6e4fSZachary Turner   FileSpec m_lldb_support_exe_dir;
62673b6e4fSZachary Turner   FileSpec m_lldb_headers_dir;
63673b6e4fSZachary Turner   FileSpec m_lldb_python_dir;
64b1e1c62fSSean Callanan   FileSpec m_lldb_clang_resource_dir;
65673b6e4fSZachary Turner   FileSpec m_lldb_system_plugin_dir;
66673b6e4fSZachary Turner   FileSpec m_lldb_user_plugin_dir;
6763acdfdeSOleksiy Vyalov   FileSpec m_lldb_process_tmp_dir;
6863acdfdeSOleksiy Vyalov   FileSpec m_lldb_global_tmp_dir;
69673b6e4fSZachary Turner };
70673b6e4fSZachary Turner 
71673b6e4fSZachary Turner HostInfoBaseFields *g_fields = nullptr;
7242ff0ad8SZachary Turner }
7342ff0ad8SZachary Turner 
74*b9c1b51eSKate Stone void HostInfoBase::Initialize() { g_fields = new HostInfoBaseFields(); }
7542ff0ad8SZachary Turner 
76*b9c1b51eSKate Stone void HostInfoBase::Terminate() {
7741331afaSZachary Turner   delete g_fields;
7841331afaSZachary Turner   g_fields = nullptr;
7941331afaSZachary Turner }
8041331afaSZachary Turner 
81*b9c1b51eSKate Stone uint32_t HostInfoBase::GetNumberCPUS() {
82ff48e4beSGreg Clayton   static std::once_flag g_once_flag;
83ff48e4beSGreg Clayton   std::call_once(g_once_flag, []() {
84673b6e4fSZachary Turner     g_fields->m_number_cpus = std::thread::hardware_concurrency();
85ff48e4beSGreg Clayton   });
86673b6e4fSZachary Turner   return g_fields->m_number_cpus;
8797a14e60SZachary Turner }
8897a14e60SZachary Turner 
89*b9c1b51eSKate Stone uint32_t HostInfoBase::GetMaxThreadNameLength() { return 0; }
9039de3110SZachary Turner 
91*b9c1b51eSKate Stone llvm::StringRef HostInfoBase::GetVendorString() {
92ff48e4beSGreg Clayton   static std::once_flag g_once_flag;
93ff48e4beSGreg Clayton   std::call_once(g_once_flag, []() {
94*b9c1b51eSKate Stone     g_fields->m_vendor_string =
95*b9c1b51eSKate Stone         HostInfo::GetArchitecture().GetTriple().getVendorName().str();
96ff48e4beSGreg Clayton   });
97673b6e4fSZachary Turner   return g_fields->m_vendor_string;
9897a14e60SZachary Turner }
9997a14e60SZachary Turner 
100*b9c1b51eSKate Stone llvm::StringRef HostInfoBase::GetOSString() {
101ff48e4beSGreg Clayton   static std::once_flag g_once_flag;
102ff48e4beSGreg Clayton   std::call_once(g_once_flag, []() {
103*b9c1b51eSKate Stone     g_fields->m_os_string =
104*b9c1b51eSKate Stone         std::move(HostInfo::GetArchitecture().GetTriple().getOSName());
105ff48e4beSGreg Clayton   });
106673b6e4fSZachary Turner   return g_fields->m_os_string;
10797a14e60SZachary Turner }
10897a14e60SZachary Turner 
109*b9c1b51eSKate Stone llvm::StringRef HostInfoBase::GetTargetTriple() {
110ff48e4beSGreg Clayton   static std::once_flag g_once_flag;
111ff48e4beSGreg Clayton   std::call_once(g_once_flag, []() {
112*b9c1b51eSKate Stone     g_fields->m_host_triple =
113*b9c1b51eSKate Stone         HostInfo::GetArchitecture().GetTriple().getTriple();
114ff48e4beSGreg Clayton   });
115673b6e4fSZachary Turner   return g_fields->m_host_triple;
11697a14e60SZachary Turner }
11713b18261SZachary Turner 
118*b9c1b51eSKate Stone const ArchSpec &HostInfoBase::GetArchitecture(ArchitectureKind arch_kind) {
119ff48e4beSGreg Clayton   static std::once_flag g_once_flag;
120ff48e4beSGreg Clayton   std::call_once(g_once_flag, []() {
121*b9c1b51eSKate Stone     HostInfo::ComputeHostArchitectureSupport(g_fields->m_host_arch_32,
122*b9c1b51eSKate Stone                                              g_fields->m_host_arch_64);
123ff48e4beSGreg Clayton   });
12413b18261SZachary Turner 
12513b18261SZachary Turner   // If an explicit 32 or 64-bit architecture was requested, return that.
12613b18261SZachary Turner   if (arch_kind == eArchKind32)
127673b6e4fSZachary Turner     return g_fields->m_host_arch_32;
12813b18261SZachary Turner   if (arch_kind == eArchKind64)
129673b6e4fSZachary Turner     return g_fields->m_host_arch_64;
13013b18261SZachary Turner 
13113b18261SZachary Turner   // Otherwise prefer the 64-bit architecture if it is valid.
132*b9c1b51eSKate Stone   return (g_fields->m_host_arch_64.IsValid()) ? g_fields->m_host_arch_64
133*b9c1b51eSKate Stone                                               : g_fields->m_host_arch_32;
13413b18261SZachary Turner }
13513b18261SZachary Turner 
136*b9c1b51eSKate Stone bool HostInfoBase::GetLLDBPath(lldb::PathType type, FileSpec &file_spec) {
13742ff0ad8SZachary Turner   file_spec.Clear();
13842ff0ad8SZachary Turner 
13942ff0ad8SZachary Turner #if defined(LLDB_DISABLE_PYTHON)
14042ff0ad8SZachary Turner   if (type == lldb::ePathTypePythonDir)
14142ff0ad8SZachary Turner     return false;
14242ff0ad8SZachary Turner #endif
14342ff0ad8SZachary Turner 
14442ff0ad8SZachary Turner   FileSpec *result = nullptr;
145*b9c1b51eSKate Stone   switch (type) {
146*b9c1b51eSKate Stone   case lldb::ePathTypeLLDBShlibDir: {
147ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
148ff48e4beSGreg Clayton     static bool success = false;
149ff48e4beSGreg Clayton     std::call_once(g_once_flag, []() {
150*b9c1b51eSKate Stone       success =
151*b9c1b51eSKate Stone           HostInfo::ComputeSharedLibraryDirectory(g_fields->m_lldb_so_dir);
152ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
15342ff0ad8SZachary Turner       if (log)
154*b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBShlibDir) => '%s'",
155*b9c1b51eSKate Stone                     g_fields->m_lldb_so_dir.GetPath().c_str());
156ff48e4beSGreg Clayton     });
157ff48e4beSGreg Clayton     if (success)
158ff48e4beSGreg Clayton       result = &g_fields->m_lldb_so_dir;
159*b9c1b51eSKate Stone   } break;
160*b9c1b51eSKate Stone   case lldb::ePathTypeSupportExecutableDir: {
161ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
162ff48e4beSGreg Clayton     static bool success = false;
163ff48e4beSGreg Clayton     std::call_once(g_once_flag, []() {
164*b9c1b51eSKate Stone       success = HostInfo::ComputeSupportExeDirectory(
165*b9c1b51eSKate Stone           g_fields->m_lldb_support_exe_dir);
166ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
16742ff0ad8SZachary Turner       if (log)
168*b9c1b51eSKate Stone         log->Printf(
169*b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeSupportExecutableDir) => '%s'",
170673b6e4fSZachary Turner             g_fields->m_lldb_support_exe_dir.GetPath().c_str());
171ff48e4beSGreg Clayton     });
172ff48e4beSGreg Clayton     if (success)
173ff48e4beSGreg Clayton       result = &g_fields->m_lldb_support_exe_dir;
174*b9c1b51eSKate Stone   } break;
175*b9c1b51eSKate Stone   case lldb::ePathTypeHeaderDir: {
176ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
177ff48e4beSGreg Clayton     static bool success = false;
178ff48e4beSGreg Clayton     std::call_once(g_once_flag, []() {
179ff48e4beSGreg Clayton       success = HostInfo::ComputeHeaderDirectory(g_fields->m_lldb_headers_dir);
180ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
18142ff0ad8SZachary Turner       if (log)
182*b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeHeaderDir) => '%s'",
183*b9c1b51eSKate Stone                     g_fields->m_lldb_headers_dir.GetPath().c_str());
184ff48e4beSGreg Clayton     });
185ff48e4beSGreg Clayton     if (success)
186ff48e4beSGreg Clayton       result = &g_fields->m_lldb_headers_dir;
187*b9c1b51eSKate Stone   } break;
188*b9c1b51eSKate Stone   case lldb::ePathTypePythonDir: {
189ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
190ff48e4beSGreg Clayton     static bool success = false;
191ff48e4beSGreg Clayton     std::call_once(g_once_flag, []() {
192ff48e4beSGreg Clayton       success = HostInfo::ComputePythonDirectory(g_fields->m_lldb_python_dir);
193ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
19442ff0ad8SZachary Turner       if (log)
195*b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath(ePathTypePythonDir) => '%s'",
196*b9c1b51eSKate Stone                     g_fields->m_lldb_python_dir.GetPath().c_str());
197ff48e4beSGreg Clayton     });
198ff48e4beSGreg Clayton     if (success)
199ff48e4beSGreg Clayton       result = &g_fields->m_lldb_python_dir;
200*b9c1b51eSKate Stone   } break;
201*b9c1b51eSKate Stone   case lldb::ePathTypeClangDir: {
202ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
203ff48e4beSGreg Clayton     static bool success = false;
204ff48e4beSGreg Clayton     std::call_once(g_once_flag, []() {
205*b9c1b51eSKate Stone       success =
206*b9c1b51eSKate Stone           HostInfo::ComputeClangDirectory(g_fields->m_lldb_clang_resource_dir);
207ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
208b1e1c62fSSean Callanan       if (log)
209*b9c1b51eSKate Stone         log->Printf(
210*b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeClangResourceDir) => '%s'",
211*b9c1b51eSKate Stone             g_fields->m_lldb_clang_resource_dir.GetPath().c_str());
212ff48e4beSGreg Clayton     });
213ff48e4beSGreg Clayton     if (success)
214ff48e4beSGreg Clayton       result = &g_fields->m_lldb_clang_resource_dir;
215*b9c1b51eSKate Stone   } break;
216*b9c1b51eSKate Stone   case lldb::ePathTypeLLDBSystemPlugins: {
217ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
218ff48e4beSGreg Clayton     static bool success = false;
219ff48e4beSGreg Clayton     std::call_once(g_once_flag, []() {
220*b9c1b51eSKate Stone       success = HostInfo::ComputeSystemPluginsDirectory(
221*b9c1b51eSKate Stone           g_fields->m_lldb_system_plugin_dir);
222ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
22342ff0ad8SZachary Turner       if (log)
224*b9c1b51eSKate Stone         log->Printf(
225*b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeLLDBSystemPlugins) => '%s'",
226673b6e4fSZachary Turner             g_fields->m_lldb_system_plugin_dir.GetPath().c_str());
227ff48e4beSGreg Clayton     });
228ff48e4beSGreg Clayton     if (success)
229ff48e4beSGreg Clayton       result = &g_fields->m_lldb_system_plugin_dir;
230*b9c1b51eSKate Stone   } break;
231*b9c1b51eSKate Stone   case lldb::ePathTypeLLDBUserPlugins: {
232ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
233ff48e4beSGreg Clayton     static bool success = false;
234ff48e4beSGreg Clayton     std::call_once(g_once_flag, []() {
235*b9c1b51eSKate Stone       success = HostInfo::ComputeUserPluginsDirectory(
236*b9c1b51eSKate Stone           g_fields->m_lldb_user_plugin_dir);
237ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
23842ff0ad8SZachary Turner       if (log)
239*b9c1b51eSKate Stone         log->Printf(
240*b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeLLDBUserPlugins) => '%s'",
241673b6e4fSZachary Turner             g_fields->m_lldb_user_plugin_dir.GetPath().c_str());
242ff48e4beSGreg Clayton     });
243ff48e4beSGreg Clayton     if (success)
244ff48e4beSGreg Clayton       result = &g_fields->m_lldb_user_plugin_dir;
245*b9c1b51eSKate Stone   } break;
246*b9c1b51eSKate Stone   case lldb::ePathTypeLLDBTempSystemDir: {
247ff48e4beSGreg Clayton     static std::once_flag g_once_flag;
248ff48e4beSGreg Clayton     static bool success = false;
249ff48e4beSGreg Clayton     std::call_once(g_once_flag, []() {
250*b9c1b51eSKate Stone       success = HostInfo::ComputeProcessTempFileDirectory(
251*b9c1b51eSKate Stone           g_fields->m_lldb_process_tmp_dir);
252ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
25342ff0ad8SZachary Turner       if (log)
254*b9c1b51eSKate Stone         log->Printf(
255*b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'",
256*b9c1b51eSKate Stone             g_fields->m_lldb_process_tmp_dir.GetPath().c_str());
257ff48e4beSGreg Clayton     });
258ff48e4beSGreg Clayton     if (success)
25963acdfdeSOleksiy Vyalov       result = &g_fields->m_lldb_process_tmp_dir;
260*b9c1b51eSKate Stone   } break;
261*b9c1b51eSKate Stone   case lldb::ePathTypeGlobalLLDBTempSystemDir: {
26263acdfdeSOleksiy Vyalov     static std::once_flag g_once_flag;
26363acdfdeSOleksiy Vyalov     static bool success = false;
26463acdfdeSOleksiy Vyalov     std::call_once(g_once_flag, []() {
265*b9c1b51eSKate Stone       success = HostInfo::ComputeGlobalTempFileDirectory(
266*b9c1b51eSKate Stone           g_fields->m_lldb_global_tmp_dir);
26763acdfdeSOleksiy Vyalov       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
26863acdfdeSOleksiy Vyalov       if (log)
269*b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath("
270*b9c1b51eSKate Stone                     "ePathTypeGlobalLLDBTempSystemDir) => '%s'",
271*b9c1b51eSKate Stone                     g_fields->m_lldb_global_tmp_dir.GetPath().c_str());
27263acdfdeSOleksiy Vyalov     });
27363acdfdeSOleksiy Vyalov     if (success)
27463acdfdeSOleksiy Vyalov       result = &g_fields->m_lldb_global_tmp_dir;
275*b9c1b51eSKate Stone   } break;
27642ff0ad8SZachary Turner   }
27742ff0ad8SZachary Turner 
27842ff0ad8SZachary Turner   if (!result)
27942ff0ad8SZachary Turner     return false;
28042ff0ad8SZachary Turner   file_spec = *result;
28142ff0ad8SZachary Turner   return true;
28242ff0ad8SZachary Turner }
28342ff0ad8SZachary Turner 
284*b9c1b51eSKate Stone bool HostInfoBase::ComputeSharedLibraryDirectory(FileSpec &file_spec) {
28542ff0ad8SZachary Turner   // To get paths related to LLDB we get the path to the executable that
28642ff0ad8SZachary Turner   // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB",
28742ff0ad8SZachary Turner   // on linux this is assumed to be the "lldb" main executable. If LLDB on
28842ff0ad8SZachary Turner   // linux is actually in a shared library (liblldb.so) then this function will
28942ff0ad8SZachary Turner   // need to be modified to "do the right thing".
29042ff0ad8SZachary Turner 
29142ff0ad8SZachary Turner   FileSpec lldb_file_spec(
292*b9c1b51eSKate Stone       Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>(
293*b9c1b51eSKate Stone           reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath))));
29442ff0ad8SZachary Turner 
295*b9c1b51eSKate Stone   // This is necessary because when running the testsuite the shlib might be a
296*b9c1b51eSKate Stone   // symbolic link inside the Python resource dir.
2979077e9f8SSean Callanan   FileSystem::ResolveSymbolicLink(lldb_file_spec, lldb_file_spec);
298db7d8083SSean Callanan 
29942ff0ad8SZachary Turner   // Remove the filename so that this FileSpec only represents the directory.
3000d8400c8SGreg Clayton   file_spec.GetDirectory() = lldb_file_spec.GetDirectory();
30142ff0ad8SZachary Turner 
30242ff0ad8SZachary Turner   return (bool)file_spec.GetDirectory();
30342ff0ad8SZachary Turner }
30442ff0ad8SZachary Turner 
305*b9c1b51eSKate Stone bool HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec) {
30642ff0ad8SZachary Turner   return GetLLDBPath(lldb::ePathTypeLLDBShlibDir, file_spec);
30742ff0ad8SZachary Turner }
30842ff0ad8SZachary Turner 
309*b9c1b51eSKate Stone bool HostInfoBase::ComputeProcessTempFileDirectory(FileSpec &file_spec) {
31063acdfdeSOleksiy Vyalov   FileSpec temp_file_spec;
311f3a24329STamas Berghammer   if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec))
31263acdfdeSOleksiy Vyalov     return false;
31363acdfdeSOleksiy Vyalov 
3141eb0d42aSPavel Labath   std::string pid_str{llvm::to_string(Host::GetCurrentProcessID())};
315d3173f34SChaoren Lin   temp_file_spec.AppendPathComponent(pid_str);
316*b9c1b51eSKate Stone   if (!FileSystem::MakeDirectory(temp_file_spec,
317*b9c1b51eSKate Stone                                  eFilePermissionsDirectoryDefault)
318*b9c1b51eSKate Stone            .Success())
31963acdfdeSOleksiy Vyalov     return false;
32063acdfdeSOleksiy Vyalov 
321b79863c2SChaoren Lin   file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
32263acdfdeSOleksiy Vyalov   return true;
32363acdfdeSOleksiy Vyalov }
32463acdfdeSOleksiy Vyalov 
325*b9c1b51eSKate Stone bool HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec) {
32633183147SPavel Labath   llvm::SmallVector<char, 16> tmpdir;
32733183147SPavel Labath   llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir);
32833183147SPavel Labath   file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()), true);
329f3a24329STamas Berghammer   return true;
330f3a24329STamas Berghammer }
331f3a24329STamas Berghammer 
332*b9c1b51eSKate Stone bool HostInfoBase::ComputeGlobalTempFileDirectory(FileSpec &file_spec) {
333f3a24329STamas Berghammer   file_spec.Clear();
334f3a24329STamas Berghammer 
335f3a24329STamas Berghammer   FileSpec temp_file_spec;
336f3a24329STamas Berghammer   if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec))
337f3a24329STamas Berghammer     return false;
338f3a24329STamas Berghammer 
339270e99abSZachary Turner   temp_file_spec.AppendPathComponent("lldb");
340*b9c1b51eSKate Stone   if (!FileSystem::MakeDirectory(temp_file_spec,
341*b9c1b51eSKate Stone                                  eFilePermissionsDirectoryDefault)
342*b9c1b51eSKate Stone            .Success())
34342ff0ad8SZachary Turner     return false;
34442ff0ad8SZachary Turner 
345b79863c2SChaoren Lin   file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
34642ff0ad8SZachary Turner   return true;
34742ff0ad8SZachary Turner }
34842ff0ad8SZachary Turner 
349*b9c1b51eSKate Stone bool HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec) {
350*b9c1b51eSKate Stone   // TODO(zturner): Figure out how to compute the header directory for all
351*b9c1b51eSKate Stone   // platforms.
35242ff0ad8SZachary Turner   return false;
35342ff0ad8SZachary Turner }
35442ff0ad8SZachary Turner 
355*b9c1b51eSKate Stone bool HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec) {
356*b9c1b51eSKate Stone   // TODO(zturner): Figure out how to compute the system plugins directory for
357*b9c1b51eSKate Stone   // all platforms.
35842ff0ad8SZachary Turner   return false;
35942ff0ad8SZachary Turner }
36042ff0ad8SZachary Turner 
361*b9c1b51eSKate Stone bool HostInfoBase::ComputeClangDirectory(FileSpec &file_spec) { return false; }
362*b9c1b51eSKate Stone 
363*b9c1b51eSKate Stone bool HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec) {
364*b9c1b51eSKate Stone   // TODO(zturner): Figure out how to compute the user plugins directory for all
365*b9c1b51eSKate Stone   // platforms.
366b1e1c62fSSean Callanan   return false;
367b1e1c62fSSean Callanan }
368b1e1c62fSSean Callanan 
369*b9c1b51eSKate Stone void HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32,
370*b9c1b51eSKate Stone                                                   ArchSpec &arch_64) {
371b071bee2SOleksiy Vyalov   llvm::Triple triple(llvm::sys::getProcessTriple());
37213b18261SZachary Turner 
37313b18261SZachary Turner   arch_32.Clear();
37413b18261SZachary Turner   arch_64.Clear();
37513b18261SZachary Turner 
376*b9c1b51eSKate Stone   switch (triple.getArch()) {
37713b18261SZachary Turner   default:
37813b18261SZachary Turner     arch_32.SetTriple(triple);
37913b18261SZachary Turner     break;
38013b18261SZachary Turner 
381e85e6021STamas Berghammer   case llvm::Triple::aarch64:
3822559abdaSJustin Hibbits   case llvm::Triple::ppc64:
383f9ee7e4cSJustin Hibbits   case llvm::Triple::x86_64:
38413b18261SZachary Turner     arch_64.SetTriple(triple);
38513b18261SZachary Turner     arch_32.SetTriple(triple.get32BitArchVariant());
38613b18261SZachary Turner     break;
38713b18261SZachary Turner 
38813b18261SZachary Turner   case llvm::Triple::mips64:
3893df471c3SMohit K. Bhakkad   case llvm::Triple::mips64el:
39013b18261SZachary Turner   case llvm::Triple::sparcv9:
391bb00d0b6SUlrich Weigand   case llvm::Triple::systemz:
39213b18261SZachary Turner     arch_64.SetTriple(triple);
39313b18261SZachary Turner     break;
39413b18261SZachary Turner   }
39513b18261SZachary Turner }
396