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/Host/FileSystem.h"
1497a14e60SZachary Turner #include "lldb/Host/Host.h"
1513b18261SZachary Turner #include "lldb/Host/HostInfo.h"
1613b18261SZachary Turner #include "lldb/Host/HostInfoBase.h"
176f9e6901SZachary Turner #include "lldb/Utility/Log.h"
18bf9a7730SZachary Turner #include "lldb/Utility/StreamString.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"
25c5f28e2aSKamil Rytarowski #include "llvm/Support/Threading.h"
26270e99abSZachary Turner #include "llvm/Support/raw_ostream.h"
2797a14e60SZachary Turner 
28c5f28e2aSKamil Rytarowski #include <mutex>
29b9c1b51eSKate Stone #include <thread>
3097a14e60SZachary Turner 
3197a14e60SZachary Turner using namespace lldb;
3297a14e60SZachary Turner using namespace lldb_private;
3397a14e60SZachary Turner 
34b9c1b51eSKate Stone namespace {
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 
43b9c1b51eSKate Stone struct HostInfoBaseFields {
44b9c1b51eSKate Stone   ~HostInfoBaseFields() {
45b9c1b51eSKate Stone     if (m_lldb_process_tmp_dir.Exists()) {
4641331afaSZachary Turner       // Remove the LLDB temporary directory if we have one. Set "recurse" to
47b9c1b51eSKate Stone       // true to all files that were created for the LLDB process can be cleaned
48b9c1b51eSKate Stone       // up.
49d82067f8SZachary Turner       llvm::sys::fs::remove_directories(m_lldb_process_tmp_dir.GetPath());
5041331afaSZachary Turner     }
5141331afaSZachary Turner   }
5241331afaSZachary Turner 
53673b6e4fSZachary Turner   uint32_t m_number_cpus;
54673b6e4fSZachary Turner   std::string m_vendor_string;
55673b6e4fSZachary Turner   std::string m_os_string;
56673b6e4fSZachary Turner   std::string m_host_triple;
57673b6e4fSZachary Turner 
58673b6e4fSZachary Turner   ArchSpec m_host_arch_32;
59673b6e4fSZachary Turner   ArchSpec m_host_arch_64;
60673b6e4fSZachary Turner 
61673b6e4fSZachary Turner   FileSpec m_lldb_so_dir;
62673b6e4fSZachary Turner   FileSpec m_lldb_support_exe_dir;
63673b6e4fSZachary Turner   FileSpec m_lldb_headers_dir;
64673b6e4fSZachary Turner   FileSpec m_lldb_python_dir;
65b1e1c62fSSean Callanan   FileSpec m_lldb_clang_resource_dir;
66673b6e4fSZachary Turner   FileSpec m_lldb_system_plugin_dir;
67673b6e4fSZachary Turner   FileSpec m_lldb_user_plugin_dir;
6863acdfdeSOleksiy Vyalov   FileSpec m_lldb_process_tmp_dir;
6963acdfdeSOleksiy Vyalov   FileSpec m_lldb_global_tmp_dir;
70673b6e4fSZachary Turner };
71673b6e4fSZachary Turner 
72673b6e4fSZachary Turner HostInfoBaseFields *g_fields = nullptr;
7342ff0ad8SZachary Turner }
7442ff0ad8SZachary Turner 
75b9c1b51eSKate Stone void HostInfoBase::Initialize() { g_fields = new HostInfoBaseFields(); }
7642ff0ad8SZachary Turner 
77b9c1b51eSKate Stone void HostInfoBase::Terminate() {
7841331afaSZachary Turner   delete g_fields;
7941331afaSZachary Turner   g_fields = nullptr;
8041331afaSZachary Turner }
8141331afaSZachary Turner 
82b9c1b51eSKate Stone uint32_t HostInfoBase::GetNumberCPUS() {
83c5f28e2aSKamil Rytarowski   static llvm::once_flag g_once_flag;
84c5f28e2aSKamil Rytarowski   llvm::call_once(g_once_flag, []() {
85673b6e4fSZachary Turner     g_fields->m_number_cpus = std::thread::hardware_concurrency();
86ff48e4beSGreg Clayton   });
87673b6e4fSZachary Turner   return g_fields->m_number_cpus;
8897a14e60SZachary Turner }
8997a14e60SZachary Turner 
90b9c1b51eSKate Stone uint32_t HostInfoBase::GetMaxThreadNameLength() { return 0; }
9139de3110SZachary Turner 
92b9c1b51eSKate Stone llvm::StringRef HostInfoBase::GetVendorString() {
93c5f28e2aSKamil Rytarowski   static llvm::once_flag g_once_flag;
94c5f28e2aSKamil Rytarowski   llvm::call_once(g_once_flag, []() {
95b9c1b51eSKate Stone     g_fields->m_vendor_string =
96b9c1b51eSKate Stone         HostInfo::GetArchitecture().GetTriple().getVendorName().str();
97ff48e4beSGreg Clayton   });
98673b6e4fSZachary Turner   return g_fields->m_vendor_string;
9997a14e60SZachary Turner }
10097a14e60SZachary Turner 
101b9c1b51eSKate Stone llvm::StringRef HostInfoBase::GetOSString() {
102c5f28e2aSKamil Rytarowski   static llvm::once_flag g_once_flag;
103c5f28e2aSKamil Rytarowski   llvm::call_once(g_once_flag, []() {
104b9c1b51eSKate Stone     g_fields->m_os_string =
105b9c1b51eSKate Stone         std::move(HostInfo::GetArchitecture().GetTriple().getOSName());
106ff48e4beSGreg Clayton   });
107673b6e4fSZachary Turner   return g_fields->m_os_string;
10897a14e60SZachary Turner }
10997a14e60SZachary Turner 
110b9c1b51eSKate Stone llvm::StringRef HostInfoBase::GetTargetTriple() {
111c5f28e2aSKamil Rytarowski   static llvm::once_flag g_once_flag;
112c5f28e2aSKamil Rytarowski   llvm::call_once(g_once_flag, []() {
113b9c1b51eSKate Stone     g_fields->m_host_triple =
114b9c1b51eSKate Stone         HostInfo::GetArchitecture().GetTriple().getTriple();
115ff48e4beSGreg Clayton   });
116673b6e4fSZachary Turner   return g_fields->m_host_triple;
11797a14e60SZachary Turner }
11813b18261SZachary Turner 
119b9c1b51eSKate Stone const ArchSpec &HostInfoBase::GetArchitecture(ArchitectureKind arch_kind) {
120c5f28e2aSKamil Rytarowski   static llvm::once_flag g_once_flag;
121c5f28e2aSKamil Rytarowski   llvm::call_once(g_once_flag, []() {
122b9c1b51eSKate Stone     HostInfo::ComputeHostArchitectureSupport(g_fields->m_host_arch_32,
123b9c1b51eSKate Stone                                              g_fields->m_host_arch_64);
124ff48e4beSGreg Clayton   });
12513b18261SZachary Turner 
12613b18261SZachary Turner   // If an explicit 32 or 64-bit architecture was requested, return that.
12713b18261SZachary Turner   if (arch_kind == eArchKind32)
128673b6e4fSZachary Turner     return g_fields->m_host_arch_32;
12913b18261SZachary Turner   if (arch_kind == eArchKind64)
130673b6e4fSZachary Turner     return g_fields->m_host_arch_64;
13113b18261SZachary Turner 
13213b18261SZachary Turner   // Otherwise prefer the 64-bit architecture if it is valid.
133b9c1b51eSKate Stone   return (g_fields->m_host_arch_64.IsValid()) ? g_fields->m_host_arch_64
134b9c1b51eSKate Stone                                               : g_fields->m_host_arch_32;
13513b18261SZachary Turner }
13613b18261SZachary Turner 
137b9c1b51eSKate Stone bool HostInfoBase::GetLLDBPath(lldb::PathType type, FileSpec &file_spec) {
13842ff0ad8SZachary Turner   file_spec.Clear();
13942ff0ad8SZachary Turner 
14042ff0ad8SZachary Turner #if defined(LLDB_DISABLE_PYTHON)
14142ff0ad8SZachary Turner   if (type == lldb::ePathTypePythonDir)
14242ff0ad8SZachary Turner     return false;
14342ff0ad8SZachary Turner #endif
14442ff0ad8SZachary Turner 
14542ff0ad8SZachary Turner   FileSpec *result = nullptr;
146b9c1b51eSKate Stone   switch (type) {
147b9c1b51eSKate Stone   case lldb::ePathTypeLLDBShlibDir: {
148c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
149ff48e4beSGreg Clayton     static bool success = false;
150c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
151b9c1b51eSKate Stone       success =
152b9c1b51eSKate Stone           HostInfo::ComputeSharedLibraryDirectory(g_fields->m_lldb_so_dir);
153ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
15442ff0ad8SZachary Turner       if (log)
155b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBShlibDir) => '%s'",
156b9c1b51eSKate Stone                     g_fields->m_lldb_so_dir.GetPath().c_str());
157ff48e4beSGreg Clayton     });
158ff48e4beSGreg Clayton     if (success)
159ff48e4beSGreg Clayton       result = &g_fields->m_lldb_so_dir;
160b9c1b51eSKate Stone   } break;
161b9c1b51eSKate Stone   case lldb::ePathTypeSupportExecutableDir: {
162c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
163ff48e4beSGreg Clayton     static bool success = false;
164c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
165b9c1b51eSKate Stone       success = HostInfo::ComputeSupportExeDirectory(
166b9c1b51eSKate Stone           g_fields->m_lldb_support_exe_dir);
167ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
16842ff0ad8SZachary Turner       if (log)
169b9c1b51eSKate Stone         log->Printf(
170b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeSupportExecutableDir) => '%s'",
171673b6e4fSZachary Turner             g_fields->m_lldb_support_exe_dir.GetPath().c_str());
172ff48e4beSGreg Clayton     });
173ff48e4beSGreg Clayton     if (success)
174ff48e4beSGreg Clayton       result = &g_fields->m_lldb_support_exe_dir;
175b9c1b51eSKate Stone   } break;
176b9c1b51eSKate Stone   case lldb::ePathTypeHeaderDir: {
177c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
178ff48e4beSGreg Clayton     static bool success = false;
179c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
180ff48e4beSGreg Clayton       success = HostInfo::ComputeHeaderDirectory(g_fields->m_lldb_headers_dir);
181ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
18242ff0ad8SZachary Turner       if (log)
183b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeHeaderDir) => '%s'",
184b9c1b51eSKate Stone                     g_fields->m_lldb_headers_dir.GetPath().c_str());
185ff48e4beSGreg Clayton     });
186ff48e4beSGreg Clayton     if (success)
187ff48e4beSGreg Clayton       result = &g_fields->m_lldb_headers_dir;
188b9c1b51eSKate Stone   } break;
189b9c1b51eSKate Stone   case lldb::ePathTypePythonDir: {
190c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
191ff48e4beSGreg Clayton     static bool success = false;
192c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
193ff48e4beSGreg Clayton       success = HostInfo::ComputePythonDirectory(g_fields->m_lldb_python_dir);
194ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
19542ff0ad8SZachary Turner       if (log)
196b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath(ePathTypePythonDir) => '%s'",
197b9c1b51eSKate Stone                     g_fields->m_lldb_python_dir.GetPath().c_str());
198ff48e4beSGreg Clayton     });
199ff48e4beSGreg Clayton     if (success)
200ff48e4beSGreg Clayton       result = &g_fields->m_lldb_python_dir;
201b9c1b51eSKate Stone   } break;
202b9c1b51eSKate Stone   case lldb::ePathTypeClangDir: {
203c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
204ff48e4beSGreg Clayton     static bool success = false;
205c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
206b9c1b51eSKate Stone       success =
207b9c1b51eSKate Stone           HostInfo::ComputeClangDirectory(g_fields->m_lldb_clang_resource_dir);
208ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
209b1e1c62fSSean Callanan       if (log)
210b9c1b51eSKate Stone         log->Printf(
211b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeClangResourceDir) => '%s'",
212b9c1b51eSKate Stone             g_fields->m_lldb_clang_resource_dir.GetPath().c_str());
213ff48e4beSGreg Clayton     });
214ff48e4beSGreg Clayton     if (success)
215ff48e4beSGreg Clayton       result = &g_fields->m_lldb_clang_resource_dir;
216b9c1b51eSKate Stone   } break;
217b9c1b51eSKate Stone   case lldb::ePathTypeLLDBSystemPlugins: {
218c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
219ff48e4beSGreg Clayton     static bool success = false;
220c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
221b9c1b51eSKate Stone       success = HostInfo::ComputeSystemPluginsDirectory(
222b9c1b51eSKate Stone           g_fields->m_lldb_system_plugin_dir);
223ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
22442ff0ad8SZachary Turner       if (log)
225b9c1b51eSKate Stone         log->Printf(
226b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeLLDBSystemPlugins) => '%s'",
227673b6e4fSZachary Turner             g_fields->m_lldb_system_plugin_dir.GetPath().c_str());
228ff48e4beSGreg Clayton     });
229ff48e4beSGreg Clayton     if (success)
230ff48e4beSGreg Clayton       result = &g_fields->m_lldb_system_plugin_dir;
231b9c1b51eSKate Stone   } break;
232b9c1b51eSKate Stone   case lldb::ePathTypeLLDBUserPlugins: {
233c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
234ff48e4beSGreg Clayton     static bool success = false;
235c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
236b9c1b51eSKate Stone       success = HostInfo::ComputeUserPluginsDirectory(
237b9c1b51eSKate Stone           g_fields->m_lldb_user_plugin_dir);
238ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
23942ff0ad8SZachary Turner       if (log)
240b9c1b51eSKate Stone         log->Printf(
241b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeLLDBUserPlugins) => '%s'",
242673b6e4fSZachary Turner             g_fields->m_lldb_user_plugin_dir.GetPath().c_str());
243ff48e4beSGreg Clayton     });
244ff48e4beSGreg Clayton     if (success)
245ff48e4beSGreg Clayton       result = &g_fields->m_lldb_user_plugin_dir;
246b9c1b51eSKate Stone   } break;
247b9c1b51eSKate Stone   case lldb::ePathTypeLLDBTempSystemDir: {
248c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
249ff48e4beSGreg Clayton     static bool success = false;
250c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
251b9c1b51eSKate Stone       success = HostInfo::ComputeProcessTempFileDirectory(
252b9c1b51eSKate Stone           g_fields->m_lldb_process_tmp_dir);
253ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
25442ff0ad8SZachary Turner       if (log)
255b9c1b51eSKate Stone         log->Printf(
256b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'",
257b9c1b51eSKate Stone             g_fields->m_lldb_process_tmp_dir.GetPath().c_str());
258ff48e4beSGreg Clayton     });
259ff48e4beSGreg Clayton     if (success)
26063acdfdeSOleksiy Vyalov       result = &g_fields->m_lldb_process_tmp_dir;
261b9c1b51eSKate Stone   } break;
262b9c1b51eSKate Stone   case lldb::ePathTypeGlobalLLDBTempSystemDir: {
263c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
26463acdfdeSOleksiy Vyalov     static bool success = false;
265c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
266b9c1b51eSKate Stone       success = HostInfo::ComputeGlobalTempFileDirectory(
267b9c1b51eSKate Stone           g_fields->m_lldb_global_tmp_dir);
26863acdfdeSOleksiy Vyalov       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
26963acdfdeSOleksiy Vyalov       if (log)
270b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath("
271b9c1b51eSKate Stone                     "ePathTypeGlobalLLDBTempSystemDir) => '%s'",
272b9c1b51eSKate Stone                     g_fields->m_lldb_global_tmp_dir.GetPath().c_str());
27363acdfdeSOleksiy Vyalov     });
27463acdfdeSOleksiy Vyalov     if (success)
27563acdfdeSOleksiy Vyalov       result = &g_fields->m_lldb_global_tmp_dir;
276b9c1b51eSKate Stone   } break;
27742ff0ad8SZachary Turner   }
27842ff0ad8SZachary Turner 
27942ff0ad8SZachary Turner   if (!result)
28042ff0ad8SZachary Turner     return false;
28142ff0ad8SZachary Turner   file_spec = *result;
28242ff0ad8SZachary Turner   return true;
28342ff0ad8SZachary Turner }
28442ff0ad8SZachary Turner 
285b9c1b51eSKate Stone bool HostInfoBase::ComputeSharedLibraryDirectory(FileSpec &file_spec) {
28642ff0ad8SZachary Turner   // To get paths related to LLDB we get the path to the executable that
28742ff0ad8SZachary Turner   // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB",
28842ff0ad8SZachary Turner   // on linux this is assumed to be the "lldb" main executable. If LLDB on
28942ff0ad8SZachary Turner   // linux is actually in a shared library (liblldb.so) then this function will
29042ff0ad8SZachary Turner   // need to be modified to "do the right thing".
29142ff0ad8SZachary Turner 
29242ff0ad8SZachary Turner   FileSpec lldb_file_spec(
293b9c1b51eSKate Stone       Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>(
294b9c1b51eSKate Stone           reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath))));
29542ff0ad8SZachary Turner 
296b9c1b51eSKate Stone   // This is necessary because when running the testsuite the shlib might be a
297b9c1b51eSKate Stone   // symbolic link inside the Python resource dir.
2989077e9f8SSean Callanan   FileSystem::ResolveSymbolicLink(lldb_file_spec, lldb_file_spec);
299db7d8083SSean Callanan 
30042ff0ad8SZachary Turner   // Remove the filename so that this FileSpec only represents the directory.
3010d8400c8SGreg Clayton   file_spec.GetDirectory() = lldb_file_spec.GetDirectory();
30242ff0ad8SZachary Turner 
30342ff0ad8SZachary Turner   return (bool)file_spec.GetDirectory();
30442ff0ad8SZachary Turner }
30542ff0ad8SZachary Turner 
306b9c1b51eSKate Stone bool HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec) {
30742ff0ad8SZachary Turner   return GetLLDBPath(lldb::ePathTypeLLDBShlibDir, file_spec);
30842ff0ad8SZachary Turner }
30942ff0ad8SZachary Turner 
310b9c1b51eSKate Stone bool HostInfoBase::ComputeProcessTempFileDirectory(FileSpec &file_spec) {
31163acdfdeSOleksiy Vyalov   FileSpec temp_file_spec;
312f3a24329STamas Berghammer   if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec))
31363acdfdeSOleksiy Vyalov     return false;
31463acdfdeSOleksiy Vyalov 
3151eb0d42aSPavel Labath   std::string pid_str{llvm::to_string(Host::GetCurrentProcessID())};
316d3173f34SChaoren Lin   temp_file_spec.AppendPathComponent(pid_str);
317*d3d95fd6SZachary Turner   if (llvm::sys::fs::create_directory(temp_file_spec.GetPath()))
31863acdfdeSOleksiy Vyalov     return false;
31963acdfdeSOleksiy Vyalov 
320b79863c2SChaoren Lin   file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
32163acdfdeSOleksiy Vyalov   return true;
32263acdfdeSOleksiy Vyalov }
32363acdfdeSOleksiy Vyalov 
324b9c1b51eSKate Stone bool HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec) {
32533183147SPavel Labath   llvm::SmallVector<char, 16> tmpdir;
32633183147SPavel Labath   llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir);
32733183147SPavel Labath   file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()), true);
328f3a24329STamas Berghammer   return true;
329f3a24329STamas Berghammer }
330f3a24329STamas Berghammer 
331b9c1b51eSKate Stone bool HostInfoBase::ComputeGlobalTempFileDirectory(FileSpec &file_spec) {
332f3a24329STamas Berghammer   file_spec.Clear();
333f3a24329STamas Berghammer 
334f3a24329STamas Berghammer   FileSpec temp_file_spec;
335f3a24329STamas Berghammer   if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec))
336f3a24329STamas Berghammer     return false;
337f3a24329STamas Berghammer 
338270e99abSZachary Turner   temp_file_spec.AppendPathComponent("lldb");
339*d3d95fd6SZachary Turner   if (llvm::sys::fs::create_directory(temp_file_spec.GetPath()))
34042ff0ad8SZachary Turner     return false;
34142ff0ad8SZachary Turner 
342b79863c2SChaoren Lin   file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
34342ff0ad8SZachary Turner   return true;
34442ff0ad8SZachary Turner }
34542ff0ad8SZachary Turner 
346b9c1b51eSKate Stone bool HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec) {
347b9c1b51eSKate Stone   // TODO(zturner): Figure out how to compute the header directory for all
348b9c1b51eSKate Stone   // platforms.
34942ff0ad8SZachary Turner   return false;
35042ff0ad8SZachary Turner }
35142ff0ad8SZachary Turner 
352b9c1b51eSKate Stone bool HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec) {
353b9c1b51eSKate Stone   // TODO(zturner): Figure out how to compute the system plugins directory for
354b9c1b51eSKate Stone   // all platforms.
35542ff0ad8SZachary Turner   return false;
35642ff0ad8SZachary Turner }
35742ff0ad8SZachary Turner 
358b9c1b51eSKate Stone bool HostInfoBase::ComputeClangDirectory(FileSpec &file_spec) { return false; }
359b9c1b51eSKate Stone 
360b9c1b51eSKate Stone bool HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec) {
361b9c1b51eSKate Stone   // TODO(zturner): Figure out how to compute the user plugins directory for all
362b9c1b51eSKate Stone   // platforms.
363b1e1c62fSSean Callanan   return false;
364b1e1c62fSSean Callanan }
365b1e1c62fSSean Callanan 
366b9c1b51eSKate Stone void HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32,
367b9c1b51eSKate Stone                                                   ArchSpec &arch_64) {
368b071bee2SOleksiy Vyalov   llvm::Triple triple(llvm::sys::getProcessTriple());
36913b18261SZachary Turner 
37013b18261SZachary Turner   arch_32.Clear();
37113b18261SZachary Turner   arch_64.Clear();
37213b18261SZachary Turner 
373b9c1b51eSKate Stone   switch (triple.getArch()) {
37413b18261SZachary Turner   default:
37513b18261SZachary Turner     arch_32.SetTriple(triple);
37613b18261SZachary Turner     break;
37713b18261SZachary Turner 
378e85e6021STamas Berghammer   case llvm::Triple::aarch64:
3792559abdaSJustin Hibbits   case llvm::Triple::ppc64:
380f9ee7e4cSJustin Hibbits   case llvm::Triple::x86_64:
38113b18261SZachary Turner     arch_64.SetTriple(triple);
38213b18261SZachary Turner     arch_32.SetTriple(triple.get32BitArchVariant());
38313b18261SZachary Turner     break;
38413b18261SZachary Turner 
38513b18261SZachary Turner   case llvm::Triple::mips64:
3863df471c3SMohit K. Bhakkad   case llvm::Triple::mips64el:
38713b18261SZachary Turner   case llvm::Triple::sparcv9:
388bb00d0b6SUlrich Weigand   case llvm::Triple::systemz:
38913b18261SZachary Turner     arch_64.SetTriple(triple);
39013b18261SZachary Turner     break;
39113b18261SZachary Turner   }
39213b18261SZachary Turner }
393