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   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 
106b9c1b51eSKate Stone bool HostInfoBase::GetLLDBPath(lldb::PathType type, FileSpec &file_spec) {
10742ff0ad8SZachary Turner   file_spec.Clear();
10842ff0ad8SZachary Turner 
10942ff0ad8SZachary Turner #if defined(LLDB_DISABLE_PYTHON)
11042ff0ad8SZachary Turner   if (type == lldb::ePathTypePythonDir)
11142ff0ad8SZachary Turner     return false;
11242ff0ad8SZachary Turner #endif
11342ff0ad8SZachary Turner 
11442ff0ad8SZachary Turner   FileSpec *result = nullptr;
115b9c1b51eSKate Stone   switch (type) {
116b9c1b51eSKate Stone   case lldb::ePathTypeLLDBShlibDir: {
117c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
118ff48e4beSGreg Clayton     static bool success = false;
119c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
120b9c1b51eSKate Stone       success =
121b9c1b51eSKate Stone           HostInfo::ComputeSharedLibraryDirectory(g_fields->m_lldb_so_dir);
122ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
12342ff0ad8SZachary Turner       if (log)
124b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBShlibDir) => '%s'",
125b9c1b51eSKate Stone                     g_fields->m_lldb_so_dir.GetPath().c_str());
126ff48e4beSGreg Clayton     });
127ff48e4beSGreg Clayton     if (success)
128ff48e4beSGreg Clayton       result = &g_fields->m_lldb_so_dir;
129b9c1b51eSKate Stone   } break;
130b9c1b51eSKate Stone   case lldb::ePathTypeSupportExecutableDir: {
131c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
132ff48e4beSGreg Clayton     static bool success = false;
133c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
134b9c1b51eSKate Stone       success = HostInfo::ComputeSupportExeDirectory(
135b9c1b51eSKate Stone           g_fields->m_lldb_support_exe_dir);
136ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
13742ff0ad8SZachary Turner       if (log)
138b9c1b51eSKate Stone         log->Printf(
139b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeSupportExecutableDir) => '%s'",
140673b6e4fSZachary Turner             g_fields->m_lldb_support_exe_dir.GetPath().c_str());
141ff48e4beSGreg Clayton     });
142ff48e4beSGreg Clayton     if (success)
143ff48e4beSGreg Clayton       result = &g_fields->m_lldb_support_exe_dir;
144b9c1b51eSKate Stone   } break;
145b9c1b51eSKate Stone   case lldb::ePathTypeHeaderDir: {
146c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
147ff48e4beSGreg Clayton     static bool success = false;
148c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
149ff48e4beSGreg Clayton       success = HostInfo::ComputeHeaderDirectory(g_fields->m_lldb_headers_dir);
150ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
15142ff0ad8SZachary Turner       if (log)
152b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath(ePathTypeHeaderDir) => '%s'",
153b9c1b51eSKate Stone                     g_fields->m_lldb_headers_dir.GetPath().c_str());
154ff48e4beSGreg Clayton     });
155ff48e4beSGreg Clayton     if (success)
156ff48e4beSGreg Clayton       result = &g_fields->m_lldb_headers_dir;
157b9c1b51eSKate Stone   } break;
158b9c1b51eSKate Stone   case lldb::ePathTypePythonDir: {
159c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
160ff48e4beSGreg Clayton     static bool success = false;
161c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
162ff48e4beSGreg Clayton       success = HostInfo::ComputePythonDirectory(g_fields->m_lldb_python_dir);
163ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
16442ff0ad8SZachary Turner       if (log)
165b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath(ePathTypePythonDir) => '%s'",
166b9c1b51eSKate Stone                     g_fields->m_lldb_python_dir.GetPath().c_str());
167ff48e4beSGreg Clayton     });
168ff48e4beSGreg Clayton     if (success)
169ff48e4beSGreg Clayton       result = &g_fields->m_lldb_python_dir;
170b9c1b51eSKate Stone   } break;
171b9c1b51eSKate Stone   case lldb::ePathTypeClangDir: {
172c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
173ff48e4beSGreg Clayton     static bool success = false;
174c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
175b9c1b51eSKate Stone       success =
176b9c1b51eSKate Stone           HostInfo::ComputeClangDirectory(g_fields->m_lldb_clang_resource_dir);
177ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
178b1e1c62fSSean Callanan       if (log)
179b9c1b51eSKate Stone         log->Printf(
180b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeClangResourceDir) => '%s'",
181b9c1b51eSKate Stone             g_fields->m_lldb_clang_resource_dir.GetPath().c_str());
182ff48e4beSGreg Clayton     });
183ff48e4beSGreg Clayton     if (success)
184ff48e4beSGreg Clayton       result = &g_fields->m_lldb_clang_resource_dir;
185b9c1b51eSKate Stone   } break;
186b9c1b51eSKate Stone   case lldb::ePathTypeLLDBSystemPlugins: {
187c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
188ff48e4beSGreg Clayton     static bool success = false;
189c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
190b9c1b51eSKate Stone       success = HostInfo::ComputeSystemPluginsDirectory(
191b9c1b51eSKate Stone           g_fields->m_lldb_system_plugin_dir);
192ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
19342ff0ad8SZachary Turner       if (log)
194b9c1b51eSKate Stone         log->Printf(
195b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeLLDBSystemPlugins) => '%s'",
196673b6e4fSZachary Turner             g_fields->m_lldb_system_plugin_dir.GetPath().c_str());
197ff48e4beSGreg Clayton     });
198ff48e4beSGreg Clayton     if (success)
199ff48e4beSGreg Clayton       result = &g_fields->m_lldb_system_plugin_dir;
200b9c1b51eSKate Stone   } break;
201b9c1b51eSKate Stone   case lldb::ePathTypeLLDBUserPlugins: {
202c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
203ff48e4beSGreg Clayton     static bool success = false;
204c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
205b9c1b51eSKate Stone       success = HostInfo::ComputeUserPluginsDirectory(
206b9c1b51eSKate Stone           g_fields->m_lldb_user_plugin_dir);
207ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
20842ff0ad8SZachary Turner       if (log)
209b9c1b51eSKate Stone         log->Printf(
210b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeLLDBUserPlugins) => '%s'",
211673b6e4fSZachary Turner             g_fields->m_lldb_user_plugin_dir.GetPath().c_str());
212ff48e4beSGreg Clayton     });
213ff48e4beSGreg Clayton     if (success)
214ff48e4beSGreg Clayton       result = &g_fields->m_lldb_user_plugin_dir;
215b9c1b51eSKate Stone   } break;
216b9c1b51eSKate Stone   case lldb::ePathTypeLLDBTempSystemDir: {
217c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
218ff48e4beSGreg Clayton     static bool success = false;
219c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
220b9c1b51eSKate Stone       success = HostInfo::ComputeProcessTempFileDirectory(
221b9c1b51eSKate Stone           g_fields->m_lldb_process_tmp_dir);
222ff48e4beSGreg Clayton       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
22342ff0ad8SZachary Turner       if (log)
224b9c1b51eSKate Stone         log->Printf(
225b9c1b51eSKate Stone             "HostInfoBase::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'",
226b9c1b51eSKate Stone             g_fields->m_lldb_process_tmp_dir.GetPath().c_str());
227ff48e4beSGreg Clayton     });
228ff48e4beSGreg Clayton     if (success)
22963acdfdeSOleksiy Vyalov       result = &g_fields->m_lldb_process_tmp_dir;
230b9c1b51eSKate Stone   } break;
231b9c1b51eSKate Stone   case lldb::ePathTypeGlobalLLDBTempSystemDir: {
232c5f28e2aSKamil Rytarowski     static llvm::once_flag g_once_flag;
23363acdfdeSOleksiy Vyalov     static bool success = false;
234c5f28e2aSKamil Rytarowski     llvm::call_once(g_once_flag, []() {
235b9c1b51eSKate Stone       success = HostInfo::ComputeGlobalTempFileDirectory(
236b9c1b51eSKate Stone           g_fields->m_lldb_global_tmp_dir);
23763acdfdeSOleksiy Vyalov       Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
23863acdfdeSOleksiy Vyalov       if (log)
239b9c1b51eSKate Stone         log->Printf("HostInfoBase::GetLLDBPath("
240b9c1b51eSKate Stone                     "ePathTypeGlobalLLDBTempSystemDir) => '%s'",
241b9c1b51eSKate Stone                     g_fields->m_lldb_global_tmp_dir.GetPath().c_str());
24263acdfdeSOleksiy Vyalov     });
24363acdfdeSOleksiy Vyalov     if (success)
24463acdfdeSOleksiy Vyalov       result = &g_fields->m_lldb_global_tmp_dir;
245b9c1b51eSKate Stone   } break;
24642ff0ad8SZachary Turner   }
24742ff0ad8SZachary Turner 
24842ff0ad8SZachary Turner   if (!result)
24942ff0ad8SZachary Turner     return false;
25042ff0ad8SZachary Turner   file_spec = *result;
25142ff0ad8SZachary Turner   return true;
25242ff0ad8SZachary Turner }
25342ff0ad8SZachary Turner 
254*7263f1bdSPavel Labath ArchSpec HostInfoBase::GetAugmentedArchSpec(llvm::StringRef triple) {
255*7263f1bdSPavel Labath   if (triple.empty())
256*7263f1bdSPavel Labath     return ArchSpec();
257*7263f1bdSPavel Labath   llvm::Triple normalized_triple(llvm::Triple::normalize(triple));
258*7263f1bdSPavel Labath   if (!ArchSpec::ContainsOnlyArch(normalized_triple))
259*7263f1bdSPavel Labath     return ArchSpec(triple);
260*7263f1bdSPavel Labath 
261*7263f1bdSPavel Labath   llvm::Triple host_triple(llvm::sys::getDefaultTargetTriple());
262*7263f1bdSPavel Labath 
263*7263f1bdSPavel Labath   if (normalized_triple.getVendorName().empty())
264*7263f1bdSPavel Labath     normalized_triple.setVendor(host_triple.getVendor());
265*7263f1bdSPavel Labath   if (normalized_triple.getOSName().empty())
266*7263f1bdSPavel Labath     normalized_triple.setOS(host_triple.getOS());
267*7263f1bdSPavel Labath   if (normalized_triple.getEnvironmentName().empty())
268*7263f1bdSPavel Labath     normalized_triple.setEnvironment(host_triple.getEnvironment());
269*7263f1bdSPavel Labath   return ArchSpec(normalized_triple);
270*7263f1bdSPavel Labath }
271*7263f1bdSPavel Labath 
272b9c1b51eSKate Stone bool HostInfoBase::ComputeSharedLibraryDirectory(FileSpec &file_spec) {
27342ff0ad8SZachary Turner   // To get paths related to LLDB we get the path to the executable that
27442ff0ad8SZachary Turner   // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB",
27542ff0ad8SZachary Turner   // on linux this is assumed to be the "lldb" main executable. If LLDB on
27642ff0ad8SZachary Turner   // linux is actually in a shared library (liblldb.so) then this function will
27742ff0ad8SZachary Turner   // need to be modified to "do the right thing".
27842ff0ad8SZachary Turner 
27942ff0ad8SZachary Turner   FileSpec lldb_file_spec(
280b9c1b51eSKate Stone       Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>(
281b9c1b51eSKate Stone           reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath))));
28242ff0ad8SZachary Turner 
283b9c1b51eSKate Stone   // This is necessary because when running the testsuite the shlib might be a
284b9c1b51eSKate Stone   // symbolic link inside the Python resource dir.
2859077e9f8SSean Callanan   FileSystem::ResolveSymbolicLink(lldb_file_spec, lldb_file_spec);
286db7d8083SSean Callanan 
28742ff0ad8SZachary Turner   // Remove the filename so that this FileSpec only represents the directory.
2880d8400c8SGreg Clayton   file_spec.GetDirectory() = lldb_file_spec.GetDirectory();
28942ff0ad8SZachary Turner 
29042ff0ad8SZachary Turner   return (bool)file_spec.GetDirectory();
29142ff0ad8SZachary Turner }
29242ff0ad8SZachary Turner 
293b9c1b51eSKate Stone bool HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec) {
29442ff0ad8SZachary Turner   return GetLLDBPath(lldb::ePathTypeLLDBShlibDir, file_spec);
29542ff0ad8SZachary Turner }
29642ff0ad8SZachary Turner 
297b9c1b51eSKate Stone bool HostInfoBase::ComputeProcessTempFileDirectory(FileSpec &file_spec) {
29863acdfdeSOleksiy Vyalov   FileSpec temp_file_spec;
299f3a24329STamas Berghammer   if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec))
30063acdfdeSOleksiy Vyalov     return false;
30163acdfdeSOleksiy Vyalov 
3021eb0d42aSPavel Labath   std::string pid_str{llvm::to_string(Host::GetCurrentProcessID())};
303d3173f34SChaoren Lin   temp_file_spec.AppendPathComponent(pid_str);
304d3d95fd6SZachary Turner   if (llvm::sys::fs::create_directory(temp_file_spec.GetPath()))
30563acdfdeSOleksiy Vyalov     return false;
30663acdfdeSOleksiy Vyalov 
307b79863c2SChaoren Lin   file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
30863acdfdeSOleksiy Vyalov   return true;
30963acdfdeSOleksiy Vyalov }
31063acdfdeSOleksiy Vyalov 
311b9c1b51eSKate Stone bool HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec) {
31233183147SPavel Labath   llvm::SmallVector<char, 16> tmpdir;
31333183147SPavel Labath   llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir);
31433183147SPavel Labath   file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()), true);
315f3a24329STamas Berghammer   return true;
316f3a24329STamas Berghammer }
317f3a24329STamas Berghammer 
318b9c1b51eSKate Stone bool HostInfoBase::ComputeGlobalTempFileDirectory(FileSpec &file_spec) {
319f3a24329STamas Berghammer   file_spec.Clear();
320f3a24329STamas Berghammer 
321f3a24329STamas Berghammer   FileSpec temp_file_spec;
322f3a24329STamas Berghammer   if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec))
323f3a24329STamas Berghammer     return false;
324f3a24329STamas Berghammer 
325270e99abSZachary Turner   temp_file_spec.AppendPathComponent("lldb");
326d3d95fd6SZachary Turner   if (llvm::sys::fs::create_directory(temp_file_spec.GetPath()))
32742ff0ad8SZachary Turner     return false;
32842ff0ad8SZachary Turner 
329b79863c2SChaoren Lin   file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
33042ff0ad8SZachary Turner   return true;
33142ff0ad8SZachary Turner }
33242ff0ad8SZachary Turner 
333b9c1b51eSKate Stone bool HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec) {
334b9c1b51eSKate Stone   // TODO(zturner): Figure out how to compute the header directory for all
335b9c1b51eSKate Stone   // platforms.
33642ff0ad8SZachary Turner   return false;
33742ff0ad8SZachary Turner }
33842ff0ad8SZachary Turner 
339b9c1b51eSKate Stone bool HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec) {
340b9c1b51eSKate Stone   // TODO(zturner): Figure out how to compute the system plugins directory for
341b9c1b51eSKate Stone   // all platforms.
34242ff0ad8SZachary Turner   return false;
34342ff0ad8SZachary Turner }
34442ff0ad8SZachary Turner 
345b9c1b51eSKate Stone bool HostInfoBase::ComputeClangDirectory(FileSpec &file_spec) { return false; }
346b9c1b51eSKate Stone 
347b9c1b51eSKate Stone bool HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec) {
348b9c1b51eSKate Stone   // TODO(zturner): Figure out how to compute the user plugins directory for all
349b9c1b51eSKate Stone   // platforms.
350b1e1c62fSSean Callanan   return false;
351b1e1c62fSSean Callanan }
352b1e1c62fSSean Callanan 
353b9c1b51eSKate Stone void HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32,
354b9c1b51eSKate Stone                                                   ArchSpec &arch_64) {
355b071bee2SOleksiy Vyalov   llvm::Triple triple(llvm::sys::getProcessTriple());
35613b18261SZachary Turner 
35713b18261SZachary Turner   arch_32.Clear();
35813b18261SZachary Turner   arch_64.Clear();
35913b18261SZachary Turner 
360b9c1b51eSKate Stone   switch (triple.getArch()) {
36113b18261SZachary Turner   default:
36213b18261SZachary Turner     arch_32.SetTriple(triple);
36313b18261SZachary Turner     break;
36413b18261SZachary Turner 
365e85e6021STamas Berghammer   case llvm::Triple::aarch64:
3662559abdaSJustin Hibbits   case llvm::Triple::ppc64:
367f9ee7e4cSJustin Hibbits   case llvm::Triple::x86_64:
36813b18261SZachary Turner     arch_64.SetTriple(triple);
36913b18261SZachary Turner     arch_32.SetTriple(triple.get32BitArchVariant());
37013b18261SZachary Turner     break;
37113b18261SZachary Turner 
37213b18261SZachary Turner   case llvm::Triple::mips64:
3733df471c3SMohit K. Bhakkad   case llvm::Triple::mips64el:
37413b18261SZachary Turner   case llvm::Triple::sparcv9:
375bb00d0b6SUlrich Weigand   case llvm::Triple::systemz:
37613b18261SZachary Turner     arch_64.SetTriple(triple);
37713b18261SZachary Turner     break;
37813b18261SZachary Turner   }
37913b18261SZachary Turner }
380