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 
1242ff0ad8SZachary Turner #include "lldb/Host/FileSystem.h"
1397a14e60SZachary Turner #include "lldb/Host/Host.h"
1413b18261SZachary Turner #include "lldb/Host/HostInfo.h"
1513b18261SZachary Turner #include "lldb/Host/HostInfoBase.h"
165f19b907SPavel Labath #include "lldb/Utility/ArchSpec.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 //----------------------------------------------------------------------
36*05097246SAdrian Prantl // The HostInfoBaseFields is a work around for windows not supporting static
37*05097246SAdrian Prantl // variables correctly in a thread safe way. Really each of the variables in
38*05097246SAdrian Prantl // HostInfoBaseFields should live in the functions in which they are used and
39*05097246SAdrian Prantl // each one should be static, but the work around is in place to avoid this
40*05097246SAdrian Prantl // 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
47*05097246SAdrian Prantl       // true to all files that were created for the LLDB process can be
48*05097246SAdrian Prantl       // cleaned up.
49d82067f8SZachary Turner       llvm::sys::fs::remove_directories(m_lldb_process_tmp_dir.GetPath());
5041331afaSZachary Turner     }
5141331afaSZachary Turner   }
5241331afaSZachary Turner 
53673b6e4fSZachary Turner   std::string m_host_triple;
54673b6e4fSZachary Turner 
55673b6e4fSZachary Turner   ArchSpec m_host_arch_32;
56673b6e4fSZachary Turner   ArchSpec m_host_arch_64;
57673b6e4fSZachary Turner 
58673b6e4fSZachary Turner   FileSpec m_lldb_so_dir;
59673b6e4fSZachary Turner   FileSpec m_lldb_support_exe_dir;
60673b6e4fSZachary Turner   FileSpec m_lldb_headers_dir;
61673b6e4fSZachary Turner   FileSpec m_lldb_python_dir;
62b1e1c62fSSean Callanan   FileSpec m_lldb_clang_resource_dir;
63673b6e4fSZachary Turner   FileSpec m_lldb_system_plugin_dir;
64673b6e4fSZachary Turner   FileSpec m_lldb_user_plugin_dir;
6563acdfdeSOleksiy Vyalov   FileSpec m_lldb_process_tmp_dir;
6663acdfdeSOleksiy Vyalov   FileSpec m_lldb_global_tmp_dir;
67673b6e4fSZachary Turner };
68673b6e4fSZachary Turner 
69673b6e4fSZachary Turner HostInfoBaseFields *g_fields = nullptr;
7042ff0ad8SZachary Turner }
7142ff0ad8SZachary Turner 
72b9c1b51eSKate Stone void HostInfoBase::Initialize() { g_fields = new HostInfoBaseFields(); }
7342ff0ad8SZachary Turner 
74b9c1b51eSKate Stone void HostInfoBase::Terminate() {
7541331afaSZachary Turner   delete g_fields;
7641331afaSZachary Turner   g_fields = nullptr;
7741331afaSZachary Turner }
7841331afaSZachary Turner 
79b9c1b51eSKate Stone llvm::StringRef HostInfoBase::GetTargetTriple() {
80c5f28e2aSKamil Rytarowski   static llvm::once_flag g_once_flag;
81c5f28e2aSKamil Rytarowski   llvm::call_once(g_once_flag, []() {
82b9c1b51eSKate Stone     g_fields->m_host_triple =
83b9c1b51eSKate Stone         HostInfo::GetArchitecture().GetTriple().getTriple();
84ff48e4beSGreg Clayton   });
85673b6e4fSZachary Turner   return g_fields->m_host_triple;
8697a14e60SZachary Turner }
8713b18261SZachary Turner 
88b9c1b51eSKate Stone const ArchSpec &HostInfoBase::GetArchitecture(ArchitectureKind arch_kind) {
89c5f28e2aSKamil Rytarowski   static llvm::once_flag g_once_flag;
90c5f28e2aSKamil Rytarowski   llvm::call_once(g_once_flag, []() {
91b9c1b51eSKate Stone     HostInfo::ComputeHostArchitectureSupport(g_fields->m_host_arch_32,
92b9c1b51eSKate Stone                                              g_fields->m_host_arch_64);
93ff48e4beSGreg Clayton   });
9413b18261SZachary Turner 
9513b18261SZachary Turner   // If an explicit 32 or 64-bit architecture was requested, return that.
9613b18261SZachary Turner   if (arch_kind == eArchKind32)
97673b6e4fSZachary Turner     return g_fields->m_host_arch_32;
9813b18261SZachary Turner   if (arch_kind == eArchKind64)
99673b6e4fSZachary Turner     return g_fields->m_host_arch_64;
10013b18261SZachary Turner 
10113b18261SZachary Turner   // Otherwise prefer the 64-bit architecture if it is valid.
102b9c1b51eSKate Stone   return (g_fields->m_host_arch_64.IsValid()) ? g_fields->m_host_arch_64
103b9c1b51eSKate Stone                                               : g_fields->m_host_arch_32;
10413b18261SZachary Turner }
10513b18261SZachary Turner 
1064ebb64b9SPavel Labath llvm::Optional<HostInfoBase::ArchitectureKind> HostInfoBase::ParseArchitectureKind(llvm::StringRef kind) {
1074ebb64b9SPavel Labath   return llvm::StringSwitch<llvm::Optional<ArchitectureKind>>(kind)
1084ebb64b9SPavel Labath       .Case(LLDB_ARCH_DEFAULT, eArchKindDefault)
1094ebb64b9SPavel Labath       .Case(LLDB_ARCH_DEFAULT_32BIT, eArchKind32)
1104ebb64b9SPavel Labath       .Case(LLDB_ARCH_DEFAULT_64BIT, eArchKind64)
1114ebb64b9SPavel Labath       .Default(llvm::None);
1124ebb64b9SPavel Labath }
1134ebb64b9SPavel Labath 
114b9c1b51eSKate Stone bool HostInfoBase::GetLLDBPath(lldb::PathType type, FileSpec &file_spec) {
11542ff0ad8SZachary Turner   file_spec.Clear();
11642ff0ad8SZachary Turner 
11742ff0ad8SZachary Turner #if defined(LLDB_DISABLE_PYTHON)
11842ff0ad8SZachary Turner   if (type == lldb::ePathTypePythonDir)
11942ff0ad8SZachary Turner     return false;
12042ff0ad8SZachary Turner #endif
12142ff0ad8SZachary Turner 
12242ff0ad8SZachary Turner   FileSpec *result = nullptr;
123b9c1b51eSKate Stone   switch (type) {
124b9c1b51eSKate Stone   case lldb::ePathTypeLLDBShlibDir: {
125c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
126ff48e4beSGreg Clayton     static bool success = false;
127c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
128b9c1b51eSKate Stone       success =
129b9c1b51eSKate Stone           HostInfo::ComputeSharedLibraryDirectory(g_fields->m_lldb_so_dir);
130ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
13142ff0ad8SZachary Turner       if (log)
132b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBShlibDir) => '%s'",
133b9c1b51eSKate Stone                     g_fields->m_lldb_so_dir.GetPath().c_str());
134ff48e4beSGreg Clayton     });
135ff48e4beSGreg Clayton     if (success)
136ff48e4beSGreg Clayton       result = &g_fields->m_lldb_so_dir;
137b9c1b51eSKate Stone   } break;
138b9c1b51eSKate Stone   case lldb::ePathTypeSupportExecutableDir: {
139c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
140ff48e4beSGreg Clayton     static bool success = false;
141c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
142b9c1b51eSKate Stone       success = HostInfo::ComputeSupportExeDirectory(
143b9c1b51eSKate Stone           g_fields->m_lldb_support_exe_dir);
144ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
14542ff0ad8SZachary Turner       if (log)
146b9c1b51eSKate Stone         log->Printf(
147b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeSupportExecutableDir) => '%s'",
148673b6e4fSZachary Turner             g_fields->m_lldb_support_exe_dir.GetPath().c_str());
149ff48e4beSGreg Clayton     });
150ff48e4beSGreg Clayton     if (success)
151ff48e4beSGreg Clayton       result = &g_fields->m_lldb_support_exe_dir;
152b9c1b51eSKate Stone   } break;
153b9c1b51eSKate Stone   case lldb::ePathTypeHeaderDir: {
154c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
155ff48e4beSGreg Clayton     static bool success = false;
156c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
157ff48e4beSGreg Clayton       success = HostInfo::ComputeHeaderDirectory(g_fields->m_lldb_headers_dir);
158ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
15942ff0ad8SZachary Turner       if (log)
160b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeHeaderDir) => '%s'",
161b9c1b51eSKate Stone                     g_fields->m_lldb_headers_dir.GetPath().c_str());
162ff48e4beSGreg Clayton     });
163ff48e4beSGreg Clayton     if (success)
164ff48e4beSGreg Clayton       result = &g_fields->m_lldb_headers_dir;
165b9c1b51eSKate Stone   } break;
166b9c1b51eSKate Stone   case lldb::ePathTypePythonDir: {
167c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
168ff48e4beSGreg Clayton     static bool success = false;
169c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
170ff48e4beSGreg Clayton       success = HostInfo::ComputePythonDirectory(g_fields->m_lldb_python_dir);
171ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
17242ff0ad8SZachary Turner       if (log)
173b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath(ePathTypePythonDir) => '%s'",
174b9c1b51eSKate Stone                     g_fields->m_lldb_python_dir.GetPath().c_str());
175ff48e4beSGreg Clayton     });
176ff48e4beSGreg Clayton     if (success)
177ff48e4beSGreg Clayton       result = &g_fields->m_lldb_python_dir;
178b9c1b51eSKate Stone   } break;
179b9c1b51eSKate Stone   case lldb::ePathTypeClangDir: {
180c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
181ff48e4beSGreg Clayton     static bool success = false;
182c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
183b9c1b51eSKate Stone       success =
184b9c1b51eSKate Stone           HostInfo::ComputeClangDirectory(g_fields->m_lldb_clang_resource_dir);
185ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
186b1e1c62fSSean Callanan       if (log)
187b9c1b51eSKate Stone         log->Printf(
188b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeClangResourceDir) => '%s'",
189b9c1b51eSKate Stone             g_fields->m_lldb_clang_resource_dir.GetPath().c_str());
190ff48e4beSGreg Clayton     });
191ff48e4beSGreg Clayton     if (success)
192ff48e4beSGreg Clayton       result = &g_fields->m_lldb_clang_resource_dir;
193b9c1b51eSKate Stone   } break;
194b9c1b51eSKate Stone   case lldb::ePathTypeLLDBSystemPlugins: {
195c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
196ff48e4beSGreg Clayton     static bool success = false;
197c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
198b9c1b51eSKate Stone       success = HostInfo::ComputeSystemPluginsDirectory(
199b9c1b51eSKate Stone           g_fields->m_lldb_system_plugin_dir);
200ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
20142ff0ad8SZachary Turner       if (log)
202b9c1b51eSKate Stone         log->Printf(
203b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeLLDBSystemPlugins) => '%s'",
204673b6e4fSZachary Turner             g_fields->m_lldb_system_plugin_dir.GetPath().c_str());
205ff48e4beSGreg Clayton     });
206ff48e4beSGreg Clayton     if (success)
207ff48e4beSGreg Clayton       result = &g_fields->m_lldb_system_plugin_dir;
208b9c1b51eSKate Stone   } break;
209b9c1b51eSKate Stone   case lldb::ePathTypeLLDBUserPlugins: {
210c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
211ff48e4beSGreg Clayton     static bool success = false;
212c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
213b9c1b51eSKate Stone       success = HostInfo::ComputeUserPluginsDirectory(
214b9c1b51eSKate Stone           g_fields->m_lldb_user_plugin_dir);
215ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
21642ff0ad8SZachary Turner       if (log)
217b9c1b51eSKate Stone         log->Printf(
218b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeLLDBUserPlugins) => '%s'",
219673b6e4fSZachary Turner             g_fields->m_lldb_user_plugin_dir.GetPath().c_str());
220ff48e4beSGreg Clayton     });
221ff48e4beSGreg Clayton     if (success)
222ff48e4beSGreg Clayton       result = &g_fields->m_lldb_user_plugin_dir;
223b9c1b51eSKate Stone   } break;
224b9c1b51eSKate Stone   case lldb::ePathTypeLLDBTempSystemDir: {
225c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
226ff48e4beSGreg Clayton     static bool success = false;
227c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
228b9c1b51eSKate Stone       success = HostInfo::ComputeProcessTempFileDirectory(
229b9c1b51eSKate Stone           g_fields->m_lldb_process_tmp_dir);
230ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
23142ff0ad8SZachary Turner       if (log)
232b9c1b51eSKate Stone         log->Printf(
233b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'",
234b9c1b51eSKate Stone             g_fields->m_lldb_process_tmp_dir.GetPath().c_str());
235ff48e4beSGreg Clayton     });
236ff48e4beSGreg Clayton     if (success)
23763acdfdeSOleksiy Vyalov       result = &g_fields->m_lldb_process_tmp_dir;
238b9c1b51eSKate Stone   } break;
239b9c1b51eSKate Stone   case lldb::ePathTypeGlobalLLDBTempSystemDir: {
240c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
24163acdfdeSOleksiy Vyalov     static bool success = false;
242c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
243b9c1b51eSKate Stone       success = HostInfo::ComputeGlobalTempFileDirectory(
244b9c1b51eSKate Stone           g_fields->m_lldb_global_tmp_dir);
24563acdfdeSOleksiy Vyalov       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
24663acdfdeSOleksiy Vyalov       if (log)
247b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath("
248b9c1b51eSKate Stone                     "ePathTypeGlobalLLDBTempSystemDir) => '%s'",
249b9c1b51eSKate Stone                     g_fields->m_lldb_global_tmp_dir.GetPath().c_str());
25063acdfdeSOleksiy Vyalov     });
25163acdfdeSOleksiy Vyalov     if (success)
25263acdfdeSOleksiy Vyalov       result = &g_fields->m_lldb_global_tmp_dir;
253b9c1b51eSKate Stone   } break;
25442ff0ad8SZachary Turner   }
25542ff0ad8SZachary Turner 
25642ff0ad8SZachary Turner   if (!result)
25742ff0ad8SZachary Turner     return false;
25842ff0ad8SZachary Turner   file_spec = *result;
25942ff0ad8SZachary Turner   return true;
26042ff0ad8SZachary Turner }
26142ff0ad8SZachary Turner 
2627263f1bdSPavel Labath ArchSpec HostInfoBase::GetAugmentedArchSpec(llvm::StringRef triple) {
2637263f1bdSPavel Labath   if (triple.empty())
2647263f1bdSPavel Labath     return ArchSpec();
2657263f1bdSPavel Labath   llvm::Triple normalized_triple(llvm::Triple::normalize(triple));
2667263f1bdSPavel Labath   if (!ArchSpec::ContainsOnlyArch(normalized_triple))
2677263f1bdSPavel Labath     return ArchSpec(triple);
2687263f1bdSPavel Labath 
2694ebb64b9SPavel Labath   if (auto kind = HostInfo::ParseArchitectureKind(triple))
2704ebb64b9SPavel Labath     return HostInfo::GetArchitecture(*kind);
2714ebb64b9SPavel Labath 
2727263f1bdSPavel Labath   llvm::Triple host_triple(llvm::sys::getDefaultTargetTriple());
2737263f1bdSPavel Labath 
2747263f1bdSPavel Labath   if (normalized_triple.getVendorName().empty())
2757263f1bdSPavel Labath     normalized_triple.setVendor(host_triple.getVendor());
2767263f1bdSPavel Labath   if (normalized_triple.getOSName().empty())
2777263f1bdSPavel Labath     normalized_triple.setOS(host_triple.getOS());
2787263f1bdSPavel Labath   if (normalized_triple.getEnvironmentName().empty())
2797263f1bdSPavel Labath     normalized_triple.setEnvironment(host_triple.getEnvironment());
2807263f1bdSPavel Labath   return ArchSpec(normalized_triple);
2817263f1bdSPavel Labath }
2827263f1bdSPavel Labath 
283b9c1b51eSKate Stone bool HostInfoBase::ComputeSharedLibraryDirectory(FileSpec &file_spec) {
28442ff0ad8SZachary Turner   // To get paths related to LLDB we get the path to the executable that
285cc2ba028SPavel Labath   // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB".
286cc2ba028SPavel Labath   // On other posix systems, we will get .../lib(64|32)?/liblldb.so.
28742ff0ad8SZachary Turner 
28842ff0ad8SZachary Turner   FileSpec lldb_file_spec(
289b9c1b51eSKate Stone       Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>(
290b9c1b51eSKate Stone           reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath))));
29142ff0ad8SZachary Turner 
292b9c1b51eSKate Stone   // This is necessary because when running the testsuite the shlib might be a
293b9c1b51eSKate Stone   // symbolic link inside the Python resource dir.
2949077e9f8SSean Callanan   FileSystem::ResolveSymbolicLink(lldb_file_spec, lldb_file_spec);
295db7d8083SSean Callanan 
29642ff0ad8SZachary Turner   // Remove the filename so that this FileSpec only represents the directory.
2970d8400c8SGreg Clayton   file_spec.GetDirectory() = lldb_file_spec.GetDirectory();
29842ff0ad8SZachary Turner 
29942ff0ad8SZachary Turner   return (bool)file_spec.GetDirectory();
30042ff0ad8SZachary Turner }
30142ff0ad8SZachary Turner 
302b9c1b51eSKate Stone bool HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec) {
30342ff0ad8SZachary Turner   return GetLLDBPath(lldb::ePathTypeLLDBShlibDir, file_spec);
30442ff0ad8SZachary Turner }
30542ff0ad8SZachary Turner 
306b9c1b51eSKate Stone bool HostInfoBase::ComputeProcessTempFileDirectory(FileSpec &file_spec) {
30763acdfdeSOleksiy Vyalov   FileSpec temp_file_spec;
308f3a24329STamas Berghammer   if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec))
30963acdfdeSOleksiy Vyalov     return false;
31063acdfdeSOleksiy Vyalov 
3111eb0d42aSPavel Labath   std::string pid_str{llvm::to_string(Host::GetCurrentProcessID())};
312d3173f34SChaoren Lin   temp_file_spec.AppendPathComponent(pid_str);
313d3d95fd6SZachary Turner   if (llvm::sys::fs::create_directory(temp_file_spec.GetPath()))
31463acdfdeSOleksiy Vyalov     return false;
31563acdfdeSOleksiy Vyalov 
316b79863c2SChaoren Lin   file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
31763acdfdeSOleksiy Vyalov   return true;
31863acdfdeSOleksiy Vyalov }
31963acdfdeSOleksiy Vyalov 
320b9c1b51eSKate Stone bool HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec) {
32133183147SPavel Labath   llvm::SmallVector<char, 16> tmpdir;
32233183147SPavel Labath   llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir);
32333183147SPavel Labath   file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()), true);
324f3a24329STamas Berghammer   return true;
325f3a24329STamas Berghammer }
326f3a24329STamas Berghammer 
327b9c1b51eSKate Stone bool HostInfoBase::ComputeGlobalTempFileDirectory(FileSpec &file_spec) {
328f3a24329STamas Berghammer   file_spec.Clear();
329f3a24329STamas Berghammer 
330f3a24329STamas Berghammer   FileSpec temp_file_spec;
331f3a24329STamas Berghammer   if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec))
332f3a24329STamas Berghammer     return false;
333f3a24329STamas Berghammer 
334270e99abSZachary Turner   temp_file_spec.AppendPathComponent("lldb");
335d3d95fd6SZachary Turner   if (llvm::sys::fs::create_directory(temp_file_spec.GetPath()))
33642ff0ad8SZachary Turner     return false;
33742ff0ad8SZachary Turner 
338b79863c2SChaoren Lin   file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
33942ff0ad8SZachary Turner   return true;
34042ff0ad8SZachary Turner }
34142ff0ad8SZachary Turner 
342b9c1b51eSKate Stone bool HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec) {
343b9c1b51eSKate Stone   // TODO(zturner): Figure out how to compute the header directory for all
344b9c1b51eSKate Stone   // platforms.
34542ff0ad8SZachary Turner   return false;
34642ff0ad8SZachary Turner }
34742ff0ad8SZachary Turner 
348b9c1b51eSKate Stone bool HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec) {
349b9c1b51eSKate Stone   // TODO(zturner): Figure out how to compute the system plugins directory for
350b9c1b51eSKate Stone   // all platforms.
35142ff0ad8SZachary Turner   return false;
35242ff0ad8SZachary Turner }
35342ff0ad8SZachary Turner 
354b9c1b51eSKate Stone bool HostInfoBase::ComputeClangDirectory(FileSpec &file_spec) { return false; }
355b9c1b51eSKate Stone 
356b9c1b51eSKate Stone bool HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec) {
357*05097246SAdrian Prantl   // TODO(zturner): Figure out how to compute the user plugins directory for
358*05097246SAdrian Prantl   // all platforms.
359b1e1c62fSSean Callanan   return false;
360b1e1c62fSSean Callanan }
361b1e1c62fSSean Callanan 
362b9c1b51eSKate Stone void HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32,
363b9c1b51eSKate Stone                                                   ArchSpec &arch_64) {
364b071bee2SOleksiy Vyalov   llvm::Triple triple(llvm::sys::getProcessTriple());
36513b18261SZachary Turner 
36613b18261SZachary Turner   arch_32.Clear();
36713b18261SZachary Turner   arch_64.Clear();
36813b18261SZachary Turner 
369b9c1b51eSKate Stone   switch (triple.getArch()) {
37013b18261SZachary Turner   default:
37113b18261SZachary Turner     arch_32.SetTriple(triple);
37213b18261SZachary Turner     break;
37313b18261SZachary Turner 
374e85e6021STamas Berghammer   case llvm::Triple::aarch64:
3752559abdaSJustin Hibbits   case llvm::Triple::ppc64:
376686b27b5SPavel Labath   case llvm::Triple::ppc64le:
377f9ee7e4cSJustin Hibbits   case llvm::Triple::x86_64:
37813b18261SZachary Turner     arch_64.SetTriple(triple);
37913b18261SZachary Turner     arch_32.SetTriple(triple.get32BitArchVariant());
38013b18261SZachary Turner     break;
38113b18261SZachary Turner 
38213b18261SZachary Turner   case llvm::Triple::mips64:
3833df471c3SMohit K. Bhakkad   case llvm::Triple::mips64el:
38413b18261SZachary Turner   case llvm::Triple::sparcv9:
385bb00d0b6SUlrich Weigand   case llvm::Triple::systemz:
38613b18261SZachary Turner     arch_64.SetTriple(triple);
38713b18261SZachary Turner     break;
38813b18261SZachary Turner   }
38913b18261SZachary Turner }
390