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/Host/FileSystem.h" 1597a14e60SZachary Turner #include "lldb/Host/Host.h" 1613b18261SZachary Turner #include "lldb/Host/HostInfo.h" 1713b18261SZachary Turner #include "lldb/Host/HostInfoBase.h" 18*bf9a7730SZachary 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" 25270e99abSZachary Turner #include "llvm/Support/raw_ostream.h" 2697a14e60SZachary Turner 27ff48e4beSGreg Clayton #include <mutex> // std::once 28b9c1b51eSKate Stone #include <thread> 2997a14e60SZachary Turner 3097a14e60SZachary Turner using namespace lldb; 3197a14e60SZachary Turner using namespace lldb_private; 3297a14e60SZachary Turner 33b9c1b51eSKate 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 42b9c1b51eSKate Stone struct HostInfoBaseFields { 43b9c1b51eSKate Stone ~HostInfoBaseFields() { 44b9c1b51eSKate Stone if (m_lldb_process_tmp_dir.Exists()) { 4541331afaSZachary Turner // Remove the LLDB temporary directory if we have one. Set "recurse" to 46b9c1b51eSKate Stone // true to all files that were created for the LLDB process can be cleaned 47b9c1b51eSKate 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 74b9c1b51eSKate Stone void HostInfoBase::Initialize() { g_fields = new HostInfoBaseFields(); } 7542ff0ad8SZachary Turner 76b9c1b51eSKate Stone void HostInfoBase::Terminate() { 7741331afaSZachary Turner delete g_fields; 7841331afaSZachary Turner g_fields = nullptr; 7941331afaSZachary Turner } 8041331afaSZachary Turner 81b9c1b51eSKate 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 89b9c1b51eSKate Stone uint32_t HostInfoBase::GetMaxThreadNameLength() { return 0; } 9039de3110SZachary Turner 91b9c1b51eSKate Stone llvm::StringRef HostInfoBase::GetVendorString() { 92ff48e4beSGreg Clayton static std::once_flag g_once_flag; 93ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 94b9c1b51eSKate Stone g_fields->m_vendor_string = 95b9c1b51eSKate Stone HostInfo::GetArchitecture().GetTriple().getVendorName().str(); 96ff48e4beSGreg Clayton }); 97673b6e4fSZachary Turner return g_fields->m_vendor_string; 9897a14e60SZachary Turner } 9997a14e60SZachary Turner 100b9c1b51eSKate Stone llvm::StringRef HostInfoBase::GetOSString() { 101ff48e4beSGreg Clayton static std::once_flag g_once_flag; 102ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 103b9c1b51eSKate Stone g_fields->m_os_string = 104b9c1b51eSKate Stone std::move(HostInfo::GetArchitecture().GetTriple().getOSName()); 105ff48e4beSGreg Clayton }); 106673b6e4fSZachary Turner return g_fields->m_os_string; 10797a14e60SZachary Turner } 10897a14e60SZachary Turner 109b9c1b51eSKate Stone llvm::StringRef HostInfoBase::GetTargetTriple() { 110ff48e4beSGreg Clayton static std::once_flag g_once_flag; 111ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 112b9c1b51eSKate Stone g_fields->m_host_triple = 113b9c1b51eSKate Stone HostInfo::GetArchitecture().GetTriple().getTriple(); 114ff48e4beSGreg Clayton }); 115673b6e4fSZachary Turner return g_fields->m_host_triple; 11697a14e60SZachary Turner } 11713b18261SZachary Turner 118b9c1b51eSKate 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, []() { 121b9c1b51eSKate Stone HostInfo::ComputeHostArchitectureSupport(g_fields->m_host_arch_32, 122b9c1b51eSKate 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. 132b9c1b51eSKate Stone return (g_fields->m_host_arch_64.IsValid()) ? g_fields->m_host_arch_64 133b9c1b51eSKate Stone : g_fields->m_host_arch_32; 13413b18261SZachary Turner } 13513b18261SZachary Turner 136b9c1b51eSKate 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; 145b9c1b51eSKate Stone switch (type) { 146b9c1b51eSKate 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, []() { 150b9c1b51eSKate Stone success = 151b9c1b51eSKate Stone HostInfo::ComputeSharedLibraryDirectory(g_fields->m_lldb_so_dir); 152ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 15342ff0ad8SZachary Turner if (log) 154b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBShlibDir) => '%s'", 155b9c1b51eSKate 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; 159b9c1b51eSKate Stone } break; 160b9c1b51eSKate 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, []() { 164b9c1b51eSKate Stone success = HostInfo::ComputeSupportExeDirectory( 165b9c1b51eSKate Stone g_fields->m_lldb_support_exe_dir); 166ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 16742ff0ad8SZachary Turner if (log) 168b9c1b51eSKate Stone log->Printf( 169b9c1b51eSKate 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; 174b9c1b51eSKate Stone } break; 175b9c1b51eSKate 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) 182b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(ePathTypeHeaderDir) => '%s'", 183b9c1b51eSKate 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; 187b9c1b51eSKate Stone } break; 188b9c1b51eSKate 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) 195b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(ePathTypePythonDir) => '%s'", 196b9c1b51eSKate 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; 200b9c1b51eSKate Stone } break; 201b9c1b51eSKate 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, []() { 205b9c1b51eSKate Stone success = 206b9c1b51eSKate Stone HostInfo::ComputeClangDirectory(g_fields->m_lldb_clang_resource_dir); 207ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 208b1e1c62fSSean Callanan if (log) 209b9c1b51eSKate Stone log->Printf( 210b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeClangResourceDir) => '%s'", 211b9c1b51eSKate 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; 215b9c1b51eSKate Stone } break; 216b9c1b51eSKate 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, []() { 220b9c1b51eSKate Stone success = HostInfo::ComputeSystemPluginsDirectory( 221b9c1b51eSKate Stone g_fields->m_lldb_system_plugin_dir); 222ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 22342ff0ad8SZachary Turner if (log) 224b9c1b51eSKate Stone log->Printf( 225b9c1b51eSKate 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; 230b9c1b51eSKate Stone } break; 231b9c1b51eSKate 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, []() { 235b9c1b51eSKate Stone success = HostInfo::ComputeUserPluginsDirectory( 236b9c1b51eSKate Stone g_fields->m_lldb_user_plugin_dir); 237ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 23842ff0ad8SZachary Turner if (log) 239b9c1b51eSKate Stone log->Printf( 240b9c1b51eSKate 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; 245b9c1b51eSKate Stone } break; 246b9c1b51eSKate 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, []() { 250b9c1b51eSKate Stone success = HostInfo::ComputeProcessTempFileDirectory( 251b9c1b51eSKate Stone g_fields->m_lldb_process_tmp_dir); 252ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 25342ff0ad8SZachary Turner if (log) 254b9c1b51eSKate Stone log->Printf( 255b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'", 256b9c1b51eSKate 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; 260b9c1b51eSKate Stone } break; 261b9c1b51eSKate 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, []() { 265b9c1b51eSKate Stone success = HostInfo::ComputeGlobalTempFileDirectory( 266b9c1b51eSKate Stone g_fields->m_lldb_global_tmp_dir); 26763acdfdeSOleksiy Vyalov Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 26863acdfdeSOleksiy Vyalov if (log) 269b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(" 270b9c1b51eSKate Stone "ePathTypeGlobalLLDBTempSystemDir) => '%s'", 271b9c1b51eSKate 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; 275b9c1b51eSKate 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 284b9c1b51eSKate 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( 292b9c1b51eSKate Stone Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>( 293b9c1b51eSKate Stone reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath)))); 29442ff0ad8SZachary Turner 295b9c1b51eSKate Stone // This is necessary because when running the testsuite the shlib might be a 296b9c1b51eSKate 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 305b9c1b51eSKate Stone bool HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec) { 30642ff0ad8SZachary Turner return GetLLDBPath(lldb::ePathTypeLLDBShlibDir, file_spec); 30742ff0ad8SZachary Turner } 30842ff0ad8SZachary Turner 309b9c1b51eSKate 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); 316b9c1b51eSKate Stone if (!FileSystem::MakeDirectory(temp_file_spec, 317b9c1b51eSKate Stone eFilePermissionsDirectoryDefault) 318b9c1b51eSKate 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 325b9c1b51eSKate 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 332b9c1b51eSKate 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"); 340b9c1b51eSKate Stone if (!FileSystem::MakeDirectory(temp_file_spec, 341b9c1b51eSKate Stone eFilePermissionsDirectoryDefault) 342b9c1b51eSKate 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 349b9c1b51eSKate Stone bool HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec) { 350b9c1b51eSKate Stone // TODO(zturner): Figure out how to compute the header directory for all 351b9c1b51eSKate Stone // platforms. 35242ff0ad8SZachary Turner return false; 35342ff0ad8SZachary Turner } 35442ff0ad8SZachary Turner 355b9c1b51eSKate Stone bool HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec) { 356b9c1b51eSKate Stone // TODO(zturner): Figure out how to compute the system plugins directory for 357b9c1b51eSKate Stone // all platforms. 35842ff0ad8SZachary Turner return false; 35942ff0ad8SZachary Turner } 36042ff0ad8SZachary Turner 361b9c1b51eSKate Stone bool HostInfoBase::ComputeClangDirectory(FileSpec &file_spec) { return false; } 362b9c1b51eSKate Stone 363b9c1b51eSKate Stone bool HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec) { 364b9c1b51eSKate Stone // TODO(zturner): Figure out how to compute the user plugins directory for all 365b9c1b51eSKate Stone // platforms. 366b1e1c62fSSean Callanan return false; 367b1e1c62fSSean Callanan } 368b1e1c62fSSean Callanan 369b9c1b51eSKate Stone void HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32, 370b9c1b51eSKate 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 376b9c1b51eSKate 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