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 2013b18261SZachary Turner #include "llvm/ADT/Triple.h" 21270e99abSZachary Turner #include "llvm/ADT/StringExtras.h" 2213b18261SZachary Turner #include "llvm/Support/Host.h" 23*33183147SPavel Labath #include "llvm/Support/Path.h" 24270e99abSZachary Turner #include "llvm/Support/raw_ostream.h" 2597a14e60SZachary Turner 2697a14e60SZachary Turner #include <thread> 27ff48e4beSGreg Clayton #include <mutex> // std::once 2897a14e60SZachary Turner 2997a14e60SZachary Turner using namespace lldb; 3097a14e60SZachary Turner using namespace lldb_private; 3197a14e60SZachary Turner 3242ff0ad8SZachary Turner namespace 3342ff0ad8SZachary Turner { 3442ff0ad8SZachary Turner void 3542ff0ad8SZachary Turner CleanupProcessSpecificLLDBTempDir() 3642ff0ad8SZachary Turner { 3742ff0ad8SZachary Turner // Get the process specific LLDB temporary directory and delete it. 3842ff0ad8SZachary Turner FileSpec tmpdir_file_spec; 3942ff0ad8SZachary Turner if (!HostInfo::GetLLDBPath(ePathTypeLLDBTempSystemDir, tmpdir_file_spec)) 4042ff0ad8SZachary Turner return; 4142ff0ad8SZachary Turner 4242ff0ad8SZachary Turner // Remove the LLDB temporary directory if we have one. Set "recurse" to 4342ff0ad8SZachary Turner // true to all files that were created for the LLDB process can be cleaned up. 44d3173f34SChaoren Lin FileSystem::DeleteDirectory(tmpdir_file_spec, true); 4542ff0ad8SZachary Turner } 46673b6e4fSZachary Turner 47ff48e4beSGreg Clayton //---------------------------------------------------------------------- 48ff48e4beSGreg Clayton // The HostInfoBaseFields is a work around for windows not supporting 49ff48e4beSGreg Clayton // static variables correctly in a thread safe way. Really each of the 50ff48e4beSGreg Clayton // variables in HostInfoBaseFields should live in the functions in which 51ff48e4beSGreg Clayton // they are used and each one should be static, but the work around is 52ff48e4beSGreg Clayton // in place to avoid this restriction. Ick. 53ff48e4beSGreg Clayton //---------------------------------------------------------------------- 54ff48e4beSGreg Clayton 55673b6e4fSZachary Turner struct HostInfoBaseFields 56673b6e4fSZachary Turner { 57673b6e4fSZachary Turner uint32_t m_number_cpus; 58673b6e4fSZachary Turner std::string m_vendor_string; 59673b6e4fSZachary Turner std::string m_os_string; 60673b6e4fSZachary Turner std::string m_host_triple; 61673b6e4fSZachary Turner 62673b6e4fSZachary Turner ArchSpec m_host_arch_32; 63673b6e4fSZachary Turner ArchSpec m_host_arch_64; 64673b6e4fSZachary Turner 65673b6e4fSZachary Turner FileSpec m_lldb_so_dir; 66673b6e4fSZachary Turner FileSpec m_lldb_support_exe_dir; 67673b6e4fSZachary Turner FileSpec m_lldb_headers_dir; 68673b6e4fSZachary Turner FileSpec m_lldb_python_dir; 69b1e1c62fSSean Callanan FileSpec m_lldb_clang_resource_dir; 70673b6e4fSZachary Turner FileSpec m_lldb_system_plugin_dir; 71673b6e4fSZachary Turner FileSpec m_lldb_user_plugin_dir; 7263acdfdeSOleksiy Vyalov FileSpec m_lldb_process_tmp_dir; 7363acdfdeSOleksiy Vyalov FileSpec m_lldb_global_tmp_dir; 74673b6e4fSZachary Turner }; 75673b6e4fSZachary Turner 76673b6e4fSZachary Turner HostInfoBaseFields *g_fields = nullptr; 7742ff0ad8SZachary Turner } 7842ff0ad8SZachary Turner 79673b6e4fSZachary Turner void 80673b6e4fSZachary Turner HostInfoBase::Initialize() 81673b6e4fSZachary Turner { 82673b6e4fSZachary Turner g_fields = new HostInfoBaseFields(); 83673b6e4fSZachary Turner } 8442ff0ad8SZachary Turner 8597a14e60SZachary Turner uint32_t 8697a14e60SZachary Turner HostInfoBase::GetNumberCPUS() 8797a14e60SZachary Turner { 88ff48e4beSGreg Clayton static std::once_flag g_once_flag; 89ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 90673b6e4fSZachary Turner g_fields->m_number_cpus = std::thread::hardware_concurrency(); 91ff48e4beSGreg Clayton }); 92673b6e4fSZachary Turner return g_fields->m_number_cpus; 9397a14e60SZachary Turner } 9497a14e60SZachary Turner 9539de3110SZachary Turner uint32_t 9639de3110SZachary Turner HostInfoBase::GetMaxThreadNameLength() 9739de3110SZachary Turner { 9839de3110SZachary Turner return 0; 9939de3110SZachary Turner } 10039de3110SZachary Turner 10197a14e60SZachary Turner llvm::StringRef 10297a14e60SZachary Turner HostInfoBase::GetVendorString() 10397a14e60SZachary Turner { 104ff48e4beSGreg Clayton static std::once_flag g_once_flag; 105ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 1063a29f8b9SPavel Labath g_fields->m_vendor_string = HostInfo::GetArchitecture().GetTriple().getVendorName().str(); 107ff48e4beSGreg Clayton }); 108673b6e4fSZachary Turner return g_fields->m_vendor_string; 10997a14e60SZachary Turner } 11097a14e60SZachary Turner 11197a14e60SZachary Turner llvm::StringRef 11297a14e60SZachary Turner HostInfoBase::GetOSString() 11397a14e60SZachary Turner { 114ff48e4beSGreg Clayton static std::once_flag g_once_flag; 115ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 116ff48e4beSGreg Clayton g_fields->m_os_string = std::move(HostInfo::GetArchitecture().GetTriple().getOSName()); 117ff48e4beSGreg Clayton }); 118673b6e4fSZachary Turner return g_fields->m_os_string; 11997a14e60SZachary Turner } 12097a14e60SZachary Turner 12197a14e60SZachary Turner llvm::StringRef 12297a14e60SZachary Turner HostInfoBase::GetTargetTriple() 12397a14e60SZachary Turner { 124ff48e4beSGreg Clayton static std::once_flag g_once_flag; 125ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 126ff48e4beSGreg Clayton g_fields->m_host_triple = HostInfo::GetArchitecture().GetTriple().getTriple(); 127ff48e4beSGreg Clayton }); 128673b6e4fSZachary Turner return g_fields->m_host_triple; 12997a14e60SZachary Turner } 13013b18261SZachary Turner 13113b18261SZachary Turner const ArchSpec & 13213b18261SZachary Turner HostInfoBase::GetArchitecture(ArchitectureKind arch_kind) 13313b18261SZachary Turner { 134ff48e4beSGreg Clayton static std::once_flag g_once_flag; 135ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 136673b6e4fSZachary Turner HostInfo::ComputeHostArchitectureSupport(g_fields->m_host_arch_32, g_fields->m_host_arch_64); 137ff48e4beSGreg Clayton }); 13813b18261SZachary Turner 13913b18261SZachary Turner // If an explicit 32 or 64-bit architecture was requested, return that. 14013b18261SZachary Turner if (arch_kind == eArchKind32) 141673b6e4fSZachary Turner return g_fields->m_host_arch_32; 14213b18261SZachary Turner if (arch_kind == eArchKind64) 143673b6e4fSZachary Turner return g_fields->m_host_arch_64; 14413b18261SZachary Turner 14513b18261SZachary Turner // Otherwise prefer the 64-bit architecture if it is valid. 146673b6e4fSZachary Turner return (g_fields->m_host_arch_64.IsValid()) ? g_fields->m_host_arch_64 : g_fields->m_host_arch_32; 14713b18261SZachary Turner } 14813b18261SZachary Turner 14942ff0ad8SZachary Turner bool 15042ff0ad8SZachary Turner HostInfoBase::GetLLDBPath(lldb::PathType type, FileSpec &file_spec) 15142ff0ad8SZachary Turner { 15242ff0ad8SZachary Turner file_spec.Clear(); 15342ff0ad8SZachary Turner 15442ff0ad8SZachary Turner #if defined(LLDB_DISABLE_PYTHON) 15542ff0ad8SZachary Turner if (type == lldb::ePathTypePythonDir) 15642ff0ad8SZachary Turner return false; 15742ff0ad8SZachary Turner #endif 15842ff0ad8SZachary Turner 15942ff0ad8SZachary Turner FileSpec *result = nullptr; 16042ff0ad8SZachary Turner switch (type) 16142ff0ad8SZachary Turner { 16242ff0ad8SZachary Turner case lldb::ePathTypeLLDBShlibDir: 163ff48e4beSGreg Clayton { 164ff48e4beSGreg Clayton static std::once_flag g_once_flag; 165ff48e4beSGreg Clayton static bool success = false; 166ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 167ff48e4beSGreg Clayton success = HostInfo::ComputeSharedLibraryDirectory (g_fields->m_lldb_so_dir); 168ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 16942ff0ad8SZachary Turner if (log) 170673b6e4fSZachary Turner log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBShlibDir) => '%s'", g_fields->m_lldb_so_dir.GetPath().c_str()); 171ff48e4beSGreg Clayton }); 172ff48e4beSGreg Clayton if (success) 173ff48e4beSGreg Clayton result = &g_fields->m_lldb_so_dir; 174ff48e4beSGreg Clayton } 17542ff0ad8SZachary Turner break; 17642ff0ad8SZachary Turner case lldb::ePathTypeSupportExecutableDir: 177ff48e4beSGreg Clayton { 178ff48e4beSGreg Clayton static std::once_flag g_once_flag; 179ff48e4beSGreg Clayton static bool success = false; 180ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 181ff48e4beSGreg Clayton success = HostInfo::ComputeSupportExeDirectory (g_fields->m_lldb_support_exe_dir); 182ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 18342ff0ad8SZachary Turner if (log) 184673b6e4fSZachary Turner log->Printf("HostInfoBase::GetLLDBPath(ePathTypeSupportExecutableDir) => '%s'", 185673b6e4fSZachary Turner g_fields->m_lldb_support_exe_dir.GetPath().c_str()); 186ff48e4beSGreg Clayton }); 187ff48e4beSGreg Clayton if (success) 188ff48e4beSGreg Clayton result = &g_fields->m_lldb_support_exe_dir; 189ff48e4beSGreg Clayton } 19042ff0ad8SZachary Turner break; 19142ff0ad8SZachary Turner case lldb::ePathTypeHeaderDir: 192ff48e4beSGreg Clayton { 193ff48e4beSGreg Clayton static std::once_flag g_once_flag; 194ff48e4beSGreg Clayton static bool success = false; 195ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 196ff48e4beSGreg Clayton success = HostInfo::ComputeHeaderDirectory (g_fields->m_lldb_headers_dir); 197ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 19842ff0ad8SZachary Turner if (log) 199673b6e4fSZachary Turner log->Printf("HostInfoBase::GetLLDBPath(ePathTypeHeaderDir) => '%s'", g_fields->m_lldb_headers_dir.GetPath().c_str()); 200ff48e4beSGreg Clayton }); 201ff48e4beSGreg Clayton if (success) 202ff48e4beSGreg Clayton result = &g_fields->m_lldb_headers_dir; 203ff48e4beSGreg Clayton } 20442ff0ad8SZachary Turner break; 20542ff0ad8SZachary Turner case lldb::ePathTypePythonDir: 206ff48e4beSGreg Clayton { 207ff48e4beSGreg Clayton static std::once_flag g_once_flag; 208ff48e4beSGreg Clayton static bool success = false; 209ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 210ff48e4beSGreg Clayton success = HostInfo::ComputePythonDirectory (g_fields->m_lldb_python_dir); 211ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 21242ff0ad8SZachary Turner if (log) 213673b6e4fSZachary Turner log->Printf("HostInfoBase::GetLLDBPath(ePathTypePythonDir) => '%s'", g_fields->m_lldb_python_dir.GetPath().c_str()); 214ff48e4beSGreg Clayton }); 215ff48e4beSGreg Clayton if (success) 216ff48e4beSGreg Clayton result = &g_fields->m_lldb_python_dir; 217ff48e4beSGreg Clayton } 21842ff0ad8SZachary Turner break; 219b1e1c62fSSean Callanan case lldb::ePathTypeClangDir: 220ff48e4beSGreg Clayton { 221ff48e4beSGreg Clayton static std::once_flag g_once_flag; 222ff48e4beSGreg Clayton static bool success = false; 223ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 224ff48e4beSGreg Clayton success = HostInfo::ComputeClangDirectory (g_fields->m_lldb_clang_resource_dir); 225ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 226b1e1c62fSSean Callanan if (log) 227b1e1c62fSSean Callanan log->Printf("HostInfoBase::GetLLDBPath(ePathTypeClangResourceDir) => '%s'", g_fields->m_lldb_clang_resource_dir.GetPath().c_str()); 228ff48e4beSGreg Clayton }); 229ff48e4beSGreg Clayton if (success) 230ff48e4beSGreg Clayton result = &g_fields->m_lldb_clang_resource_dir; 231ff48e4beSGreg Clayton } 232b1e1c62fSSean Callanan break; 23342ff0ad8SZachary Turner case lldb::ePathTypeLLDBSystemPlugins: 234ff48e4beSGreg Clayton { 235ff48e4beSGreg Clayton static std::once_flag g_once_flag; 236ff48e4beSGreg Clayton static bool success = false; 237ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 238ff48e4beSGreg Clayton success = HostInfo::ComputeSystemPluginsDirectory (g_fields->m_lldb_system_plugin_dir); 239ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 24042ff0ad8SZachary Turner if (log) 241673b6e4fSZachary Turner log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBSystemPlugins) => '%s'", 242673b6e4fSZachary Turner g_fields->m_lldb_system_plugin_dir.GetPath().c_str()); 243ff48e4beSGreg Clayton }); 244ff48e4beSGreg Clayton if (success) 245ff48e4beSGreg Clayton result = &g_fields->m_lldb_system_plugin_dir; 246ff48e4beSGreg Clayton } 24742ff0ad8SZachary Turner break; 24842ff0ad8SZachary Turner case lldb::ePathTypeLLDBUserPlugins: 249ff48e4beSGreg Clayton { 250ff48e4beSGreg Clayton static std::once_flag g_once_flag; 251ff48e4beSGreg Clayton static bool success = false; 252ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 253ff48e4beSGreg Clayton success = HostInfo::ComputeUserPluginsDirectory (g_fields->m_lldb_user_plugin_dir); 254ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 25542ff0ad8SZachary Turner if (log) 256673b6e4fSZachary Turner log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBUserPlugins) => '%s'", 257673b6e4fSZachary Turner g_fields->m_lldb_user_plugin_dir.GetPath().c_str()); 258ff48e4beSGreg Clayton }); 259ff48e4beSGreg Clayton if (success) 260ff48e4beSGreg Clayton result = &g_fields->m_lldb_user_plugin_dir; 261ff48e4beSGreg Clayton } 26242ff0ad8SZachary Turner break; 26342ff0ad8SZachary Turner case lldb::ePathTypeLLDBTempSystemDir: 264ff48e4beSGreg Clayton { 265ff48e4beSGreg Clayton static std::once_flag g_once_flag; 266ff48e4beSGreg Clayton static bool success = false; 267ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 26863acdfdeSOleksiy Vyalov success = HostInfo::ComputeProcessTempFileDirectory (g_fields->m_lldb_process_tmp_dir); 269ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 27042ff0ad8SZachary Turner if (log) 27163acdfdeSOleksiy Vyalov log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'", g_fields->m_lldb_process_tmp_dir.GetPath().c_str()); 272ff48e4beSGreg Clayton }); 273ff48e4beSGreg Clayton if (success) 27463acdfdeSOleksiy Vyalov result = &g_fields->m_lldb_process_tmp_dir; 27563acdfdeSOleksiy Vyalov } 27663acdfdeSOleksiy Vyalov break; 27763acdfdeSOleksiy Vyalov case lldb::ePathTypeGlobalLLDBTempSystemDir: 27863acdfdeSOleksiy Vyalov { 27963acdfdeSOleksiy Vyalov static std::once_flag g_once_flag; 28063acdfdeSOleksiy Vyalov static bool success = false; 28163acdfdeSOleksiy Vyalov std::call_once(g_once_flag, []() { 28263acdfdeSOleksiy Vyalov success = HostInfo::ComputeGlobalTempFileDirectory (g_fields->m_lldb_global_tmp_dir); 28363acdfdeSOleksiy Vyalov Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 28463acdfdeSOleksiy Vyalov if (log) 28563acdfdeSOleksiy Vyalov log->Printf("HostInfoBase::GetLLDBPath(ePathTypeGlobalLLDBTempSystemDir) => '%s'", g_fields->m_lldb_global_tmp_dir.GetPath().c_str()); 28663acdfdeSOleksiy Vyalov }); 28763acdfdeSOleksiy Vyalov if (success) 28863acdfdeSOleksiy Vyalov result = &g_fields->m_lldb_global_tmp_dir; 289ff48e4beSGreg Clayton } 29042ff0ad8SZachary Turner break; 29142ff0ad8SZachary Turner } 29242ff0ad8SZachary Turner 29342ff0ad8SZachary Turner if (!result) 29442ff0ad8SZachary Turner return false; 29542ff0ad8SZachary Turner file_spec = *result; 29642ff0ad8SZachary Turner return true; 29742ff0ad8SZachary Turner } 29842ff0ad8SZachary Turner 29942ff0ad8SZachary Turner bool 30042ff0ad8SZachary Turner HostInfoBase::ComputeSharedLibraryDirectory(FileSpec &file_spec) 30142ff0ad8SZachary Turner { 30242ff0ad8SZachary Turner // To get paths related to LLDB we get the path to the executable that 30342ff0ad8SZachary Turner // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB", 30442ff0ad8SZachary Turner // on linux this is assumed to be the "lldb" main executable. If LLDB on 30542ff0ad8SZachary Turner // linux is actually in a shared library (liblldb.so) then this function will 30642ff0ad8SZachary Turner // need to be modified to "do the right thing". 30742ff0ad8SZachary Turner 30842ff0ad8SZachary Turner FileSpec lldb_file_spec( 30942ff0ad8SZachary Turner Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>(reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath)))); 31042ff0ad8SZachary Turner 311db7d8083SSean Callanan // This is necessary because when running the testsuite the shlib might be a symbolic link inside the Python resource dir. 3129077e9f8SSean Callanan FileSystem::ResolveSymbolicLink(lldb_file_spec, lldb_file_spec); 313db7d8083SSean Callanan 31442ff0ad8SZachary Turner // Remove the filename so that this FileSpec only represents the directory. 3150d8400c8SGreg Clayton file_spec.GetDirectory() = lldb_file_spec.GetDirectory(); 31642ff0ad8SZachary Turner 31742ff0ad8SZachary Turner return (bool)file_spec.GetDirectory(); 31842ff0ad8SZachary Turner } 31942ff0ad8SZachary Turner 32042ff0ad8SZachary Turner bool 32142ff0ad8SZachary Turner HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec) 32242ff0ad8SZachary Turner { 32342ff0ad8SZachary Turner return GetLLDBPath(lldb::ePathTypeLLDBShlibDir, file_spec); 32442ff0ad8SZachary Turner } 32542ff0ad8SZachary Turner 32642ff0ad8SZachary Turner bool 32763acdfdeSOleksiy Vyalov HostInfoBase::ComputeProcessTempFileDirectory(FileSpec &file_spec) 32842ff0ad8SZachary Turner { 32963acdfdeSOleksiy Vyalov FileSpec temp_file_spec; 330f3a24329STamas Berghammer if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec)) 33163acdfdeSOleksiy Vyalov return false; 33263acdfdeSOleksiy Vyalov 333d3173f34SChaoren Lin std::string pid_str{std::to_string(Host::GetCurrentProcessID())}; 334d3173f34SChaoren Lin temp_file_spec.AppendPathComponent(pid_str); 335d3173f34SChaoren Lin if (!FileSystem::MakeDirectory(temp_file_spec, eFilePermissionsDirectoryDefault).Success()) 33663acdfdeSOleksiy Vyalov return false; 33763acdfdeSOleksiy Vyalov 33863acdfdeSOleksiy Vyalov // Make an atexit handler to clean up the process specify LLDB temp dir 33963acdfdeSOleksiy Vyalov // and all of its contents. 34063acdfdeSOleksiy Vyalov ::atexit(CleanupProcessSpecificLLDBTempDir); 341b79863c2SChaoren Lin file_spec.GetDirectory().SetCString(temp_file_spec.GetCString()); 34263acdfdeSOleksiy Vyalov return true; 34363acdfdeSOleksiy Vyalov } 34463acdfdeSOleksiy Vyalov 34563acdfdeSOleksiy Vyalov bool 346f3a24329STamas Berghammer HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec) 34763acdfdeSOleksiy Vyalov { 348*33183147SPavel Labath llvm::SmallVector<char, 16> tmpdir; 349*33183147SPavel Labath llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir); 350*33183147SPavel Labath file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()), true); 351f3a24329STamas Berghammer return true; 352f3a24329STamas Berghammer } 353f3a24329STamas Berghammer 354f3a24329STamas Berghammer bool 355f3a24329STamas Berghammer HostInfoBase::ComputeGlobalTempFileDirectory(FileSpec &file_spec) 356f3a24329STamas Berghammer { 357f3a24329STamas Berghammer file_spec.Clear(); 358f3a24329STamas Berghammer 359f3a24329STamas Berghammer FileSpec temp_file_spec; 360f3a24329STamas Berghammer if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec)) 361f3a24329STamas Berghammer return false; 362f3a24329STamas Berghammer 363270e99abSZachary Turner temp_file_spec.AppendPathComponent("lldb"); 364d3173f34SChaoren Lin if (!FileSystem::MakeDirectory(temp_file_spec, eFilePermissionsDirectoryDefault).Success()) 36542ff0ad8SZachary Turner return false; 36642ff0ad8SZachary Turner 367b79863c2SChaoren Lin file_spec.GetDirectory().SetCString(temp_file_spec.GetCString()); 36842ff0ad8SZachary Turner return true; 36942ff0ad8SZachary Turner } 37042ff0ad8SZachary Turner 37142ff0ad8SZachary Turner bool 37242ff0ad8SZachary Turner HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec) 37342ff0ad8SZachary Turner { 37442ff0ad8SZachary Turner // TODO(zturner): Figure out how to compute the header directory for all platforms. 37542ff0ad8SZachary Turner return false; 37642ff0ad8SZachary Turner } 37742ff0ad8SZachary Turner 37842ff0ad8SZachary Turner bool 37942ff0ad8SZachary Turner HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec) 38042ff0ad8SZachary Turner { 38142ff0ad8SZachary Turner // TODO(zturner): Figure out how to compute the system plugins directory for all platforms. 38242ff0ad8SZachary Turner return false; 38342ff0ad8SZachary Turner } 38442ff0ad8SZachary Turner 38542ff0ad8SZachary Turner bool 386b1e1c62fSSean Callanan HostInfoBase::ComputeClangDirectory(FileSpec &file_spec) 387b1e1c62fSSean Callanan { 388b1e1c62fSSean Callanan return false; 389b1e1c62fSSean Callanan } 390b1e1c62fSSean Callanan 391b1e1c62fSSean Callanan bool 39242ff0ad8SZachary Turner HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec) 39342ff0ad8SZachary Turner { 39442ff0ad8SZachary Turner // TODO(zturner): Figure out how to compute the user plugins directory for all platforms. 39542ff0ad8SZachary Turner return false; 39642ff0ad8SZachary Turner } 39742ff0ad8SZachary Turner 39813b18261SZachary Turner void 39913b18261SZachary Turner HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32, ArchSpec &arch_64) 40013b18261SZachary Turner { 401b071bee2SOleksiy Vyalov llvm::Triple triple(llvm::sys::getProcessTriple()); 40213b18261SZachary Turner 40313b18261SZachary Turner arch_32.Clear(); 40413b18261SZachary Turner arch_64.Clear(); 40513b18261SZachary Turner 40613b18261SZachary Turner switch (triple.getArch()) 40713b18261SZachary Turner { 40813b18261SZachary Turner default: 40913b18261SZachary Turner arch_32.SetTriple(triple); 41013b18261SZachary Turner break; 41113b18261SZachary Turner 4122559abdaSJustin Hibbits case llvm::Triple::ppc64: 413f9ee7e4cSJustin Hibbits case llvm::Triple::x86_64: 41413b18261SZachary Turner arch_64.SetTriple(triple); 41513b18261SZachary Turner arch_32.SetTriple(triple.get32BitArchVariant()); 41613b18261SZachary Turner break; 41713b18261SZachary Turner 418e4d6922cSTodd Fiala case llvm::Triple::aarch64: 41913b18261SZachary Turner case llvm::Triple::mips64: 4203df471c3SMohit K. Bhakkad case llvm::Triple::mips64el: 42113b18261SZachary Turner case llvm::Triple::sparcv9: 42213b18261SZachary Turner arch_64.SetTriple(triple); 42313b18261SZachary Turner break; 42413b18261SZachary Turner } 42513b18261SZachary Turner } 426