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 20270e99abSZachary Turner #include "llvm/ADT/StringExtras.h" 21*1eb0d42aSPavel Labath #include "llvm/ADT/Triple.h" 2213b18261SZachary Turner #include "llvm/Support/Host.h" 2333183147SPavel Labath #include "llvm/Support/Path.h" 24*1eb0d42aSPavel Labath #include "llvm/Support/ScopedPrinter.h" 25270e99abSZachary Turner #include "llvm/Support/raw_ostream.h" 2697a14e60SZachary Turner 2797a14e60SZachary Turner #include <thread> 28ff48e4beSGreg Clayton #include <mutex> // std::once 2997a14e60SZachary Turner 3097a14e60SZachary Turner using namespace lldb; 3197a14e60SZachary Turner using namespace lldb_private; 3297a14e60SZachary Turner 3342ff0ad8SZachary Turner namespace 3442ff0ad8SZachary Turner { 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 43673b6e4fSZachary Turner struct HostInfoBaseFields 44673b6e4fSZachary Turner { 4541331afaSZachary Turner ~HostInfoBaseFields() 4641331afaSZachary Turner { 4741331afaSZachary Turner if (m_lldb_process_tmp_dir.Exists()) 4841331afaSZachary Turner { 4941331afaSZachary Turner // Remove the LLDB temporary directory if we have one. Set "recurse" to 5041331afaSZachary Turner // true to all files that were created for the LLDB process can be cleaned up. 5141331afaSZachary Turner FileSystem::DeleteDirectory(m_lldb_process_tmp_dir, true); 5241331afaSZachary Turner } 5341331afaSZachary Turner } 5441331afaSZachary Turner 55673b6e4fSZachary Turner uint32_t m_number_cpus; 56673b6e4fSZachary Turner std::string m_vendor_string; 57673b6e4fSZachary Turner std::string m_os_string; 58673b6e4fSZachary Turner std::string m_host_triple; 59673b6e4fSZachary Turner 60673b6e4fSZachary Turner ArchSpec m_host_arch_32; 61673b6e4fSZachary Turner ArchSpec m_host_arch_64; 62673b6e4fSZachary Turner 63673b6e4fSZachary Turner FileSpec m_lldb_so_dir; 64673b6e4fSZachary Turner FileSpec m_lldb_support_exe_dir; 65673b6e4fSZachary Turner FileSpec m_lldb_headers_dir; 66673b6e4fSZachary Turner FileSpec m_lldb_python_dir; 67b1e1c62fSSean Callanan FileSpec m_lldb_clang_resource_dir; 68673b6e4fSZachary Turner FileSpec m_lldb_system_plugin_dir; 69673b6e4fSZachary Turner FileSpec m_lldb_user_plugin_dir; 7063acdfdeSOleksiy Vyalov FileSpec m_lldb_process_tmp_dir; 7163acdfdeSOleksiy Vyalov FileSpec m_lldb_global_tmp_dir; 72673b6e4fSZachary Turner }; 73673b6e4fSZachary Turner 74673b6e4fSZachary Turner HostInfoBaseFields *g_fields = nullptr; 7542ff0ad8SZachary Turner } 7642ff0ad8SZachary Turner 77673b6e4fSZachary Turner void 78673b6e4fSZachary Turner HostInfoBase::Initialize() 79673b6e4fSZachary Turner { 80673b6e4fSZachary Turner g_fields = new HostInfoBaseFields(); 81673b6e4fSZachary Turner } 8242ff0ad8SZachary Turner 8341331afaSZachary Turner void 8441331afaSZachary Turner HostInfoBase::Terminate() 8541331afaSZachary Turner { 8641331afaSZachary Turner delete g_fields; 8741331afaSZachary Turner g_fields = nullptr; 8841331afaSZachary Turner } 8941331afaSZachary Turner 9097a14e60SZachary Turner uint32_t 9197a14e60SZachary Turner HostInfoBase::GetNumberCPUS() 9297a14e60SZachary Turner { 93ff48e4beSGreg Clayton static std::once_flag g_once_flag; 94ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 95673b6e4fSZachary Turner g_fields->m_number_cpus = std::thread::hardware_concurrency(); 96ff48e4beSGreg Clayton }); 97673b6e4fSZachary Turner return g_fields->m_number_cpus; 9897a14e60SZachary Turner } 9997a14e60SZachary Turner 10039de3110SZachary Turner uint32_t 10139de3110SZachary Turner HostInfoBase::GetMaxThreadNameLength() 10239de3110SZachary Turner { 10339de3110SZachary Turner return 0; 10439de3110SZachary Turner } 10539de3110SZachary Turner 10697a14e60SZachary Turner llvm::StringRef 10797a14e60SZachary Turner HostInfoBase::GetVendorString() 10897a14e60SZachary Turner { 109ff48e4beSGreg Clayton static std::once_flag g_once_flag; 110ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 1113a29f8b9SPavel Labath g_fields->m_vendor_string = HostInfo::GetArchitecture().GetTriple().getVendorName().str(); 112ff48e4beSGreg Clayton }); 113673b6e4fSZachary Turner return g_fields->m_vendor_string; 11497a14e60SZachary Turner } 11597a14e60SZachary Turner 11697a14e60SZachary Turner llvm::StringRef 11797a14e60SZachary Turner HostInfoBase::GetOSString() 11897a14e60SZachary Turner { 119ff48e4beSGreg Clayton static std::once_flag g_once_flag; 120ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 121ff48e4beSGreg Clayton g_fields->m_os_string = std::move(HostInfo::GetArchitecture().GetTriple().getOSName()); 122ff48e4beSGreg Clayton }); 123673b6e4fSZachary Turner return g_fields->m_os_string; 12497a14e60SZachary Turner } 12597a14e60SZachary Turner 12697a14e60SZachary Turner llvm::StringRef 12797a14e60SZachary Turner HostInfoBase::GetTargetTriple() 12897a14e60SZachary Turner { 129ff48e4beSGreg Clayton static std::once_flag g_once_flag; 130ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 131ff48e4beSGreg Clayton g_fields->m_host_triple = HostInfo::GetArchitecture().GetTriple().getTriple(); 132ff48e4beSGreg Clayton }); 133673b6e4fSZachary Turner return g_fields->m_host_triple; 13497a14e60SZachary Turner } 13513b18261SZachary Turner 13613b18261SZachary Turner const ArchSpec & 13713b18261SZachary Turner HostInfoBase::GetArchitecture(ArchitectureKind arch_kind) 13813b18261SZachary Turner { 139ff48e4beSGreg Clayton static std::once_flag g_once_flag; 140ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 141673b6e4fSZachary Turner HostInfo::ComputeHostArchitectureSupport(g_fields->m_host_arch_32, g_fields->m_host_arch_64); 142ff48e4beSGreg Clayton }); 14313b18261SZachary Turner 14413b18261SZachary Turner // If an explicit 32 or 64-bit architecture was requested, return that. 14513b18261SZachary Turner if (arch_kind == eArchKind32) 146673b6e4fSZachary Turner return g_fields->m_host_arch_32; 14713b18261SZachary Turner if (arch_kind == eArchKind64) 148673b6e4fSZachary Turner return g_fields->m_host_arch_64; 14913b18261SZachary Turner 15013b18261SZachary Turner // Otherwise prefer the 64-bit architecture if it is valid. 151673b6e4fSZachary Turner return (g_fields->m_host_arch_64.IsValid()) ? g_fields->m_host_arch_64 : g_fields->m_host_arch_32; 15213b18261SZachary Turner } 15313b18261SZachary Turner 15442ff0ad8SZachary Turner bool 15542ff0ad8SZachary Turner HostInfoBase::GetLLDBPath(lldb::PathType type, FileSpec &file_spec) 15642ff0ad8SZachary Turner { 15742ff0ad8SZachary Turner file_spec.Clear(); 15842ff0ad8SZachary Turner 15942ff0ad8SZachary Turner #if defined(LLDB_DISABLE_PYTHON) 16042ff0ad8SZachary Turner if (type == lldb::ePathTypePythonDir) 16142ff0ad8SZachary Turner return false; 16242ff0ad8SZachary Turner #endif 16342ff0ad8SZachary Turner 16442ff0ad8SZachary Turner FileSpec *result = nullptr; 16542ff0ad8SZachary Turner switch (type) 16642ff0ad8SZachary Turner { 16742ff0ad8SZachary Turner case lldb::ePathTypeLLDBShlibDir: 168ff48e4beSGreg Clayton { 169ff48e4beSGreg Clayton static std::once_flag g_once_flag; 170ff48e4beSGreg Clayton static bool success = false; 171ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 172ff48e4beSGreg Clayton success = HostInfo::ComputeSharedLibraryDirectory (g_fields->m_lldb_so_dir); 173ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 17442ff0ad8SZachary Turner if (log) 175673b6e4fSZachary Turner log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBShlibDir) => '%s'", g_fields->m_lldb_so_dir.GetPath().c_str()); 176ff48e4beSGreg Clayton }); 177ff48e4beSGreg Clayton if (success) 178ff48e4beSGreg Clayton result = &g_fields->m_lldb_so_dir; 179ff48e4beSGreg Clayton } 18042ff0ad8SZachary Turner break; 18142ff0ad8SZachary Turner case lldb::ePathTypeSupportExecutableDir: 182ff48e4beSGreg Clayton { 183ff48e4beSGreg Clayton static std::once_flag g_once_flag; 184ff48e4beSGreg Clayton static bool success = false; 185ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 186ff48e4beSGreg Clayton success = HostInfo::ComputeSupportExeDirectory (g_fields->m_lldb_support_exe_dir); 187ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 18842ff0ad8SZachary Turner if (log) 189673b6e4fSZachary Turner log->Printf("HostInfoBase::GetLLDBPath(ePathTypeSupportExecutableDir) => '%s'", 190673b6e4fSZachary Turner g_fields->m_lldb_support_exe_dir.GetPath().c_str()); 191ff48e4beSGreg Clayton }); 192ff48e4beSGreg Clayton if (success) 193ff48e4beSGreg Clayton result = &g_fields->m_lldb_support_exe_dir; 194ff48e4beSGreg Clayton } 19542ff0ad8SZachary Turner break; 19642ff0ad8SZachary Turner case lldb::ePathTypeHeaderDir: 197ff48e4beSGreg Clayton { 198ff48e4beSGreg Clayton static std::once_flag g_once_flag; 199ff48e4beSGreg Clayton static bool success = false; 200ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 201ff48e4beSGreg Clayton success = HostInfo::ComputeHeaderDirectory (g_fields->m_lldb_headers_dir); 202ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 20342ff0ad8SZachary Turner if (log) 204673b6e4fSZachary Turner log->Printf("HostInfoBase::GetLLDBPath(ePathTypeHeaderDir) => '%s'", g_fields->m_lldb_headers_dir.GetPath().c_str()); 205ff48e4beSGreg Clayton }); 206ff48e4beSGreg Clayton if (success) 207ff48e4beSGreg Clayton result = &g_fields->m_lldb_headers_dir; 208ff48e4beSGreg Clayton } 20942ff0ad8SZachary Turner break; 21042ff0ad8SZachary Turner case lldb::ePathTypePythonDir: 211ff48e4beSGreg Clayton { 212ff48e4beSGreg Clayton static std::once_flag g_once_flag; 213ff48e4beSGreg Clayton static bool success = false; 214ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 215ff48e4beSGreg Clayton success = HostInfo::ComputePythonDirectory (g_fields->m_lldb_python_dir); 216ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 21742ff0ad8SZachary Turner if (log) 218673b6e4fSZachary Turner log->Printf("HostInfoBase::GetLLDBPath(ePathTypePythonDir) => '%s'", g_fields->m_lldb_python_dir.GetPath().c_str()); 219ff48e4beSGreg Clayton }); 220ff48e4beSGreg Clayton if (success) 221ff48e4beSGreg Clayton result = &g_fields->m_lldb_python_dir; 222ff48e4beSGreg Clayton } 22342ff0ad8SZachary Turner break; 224b1e1c62fSSean Callanan case lldb::ePathTypeClangDir: 225ff48e4beSGreg Clayton { 226ff48e4beSGreg Clayton static std::once_flag g_once_flag; 227ff48e4beSGreg Clayton static bool success = false; 228ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 229ff48e4beSGreg Clayton success = HostInfo::ComputeClangDirectory (g_fields->m_lldb_clang_resource_dir); 230ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 231b1e1c62fSSean Callanan if (log) 232b1e1c62fSSean Callanan log->Printf("HostInfoBase::GetLLDBPath(ePathTypeClangResourceDir) => '%s'", g_fields->m_lldb_clang_resource_dir.GetPath().c_str()); 233ff48e4beSGreg Clayton }); 234ff48e4beSGreg Clayton if (success) 235ff48e4beSGreg Clayton result = &g_fields->m_lldb_clang_resource_dir; 236ff48e4beSGreg Clayton } 237b1e1c62fSSean Callanan break; 23842ff0ad8SZachary Turner case lldb::ePathTypeLLDBSystemPlugins: 239ff48e4beSGreg Clayton { 240ff48e4beSGreg Clayton static std::once_flag g_once_flag; 241ff48e4beSGreg Clayton static bool success = false; 242ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 243ff48e4beSGreg Clayton success = HostInfo::ComputeSystemPluginsDirectory (g_fields->m_lldb_system_plugin_dir); 244ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 24542ff0ad8SZachary Turner if (log) 246673b6e4fSZachary Turner log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBSystemPlugins) => '%s'", 247673b6e4fSZachary Turner g_fields->m_lldb_system_plugin_dir.GetPath().c_str()); 248ff48e4beSGreg Clayton }); 249ff48e4beSGreg Clayton if (success) 250ff48e4beSGreg Clayton result = &g_fields->m_lldb_system_plugin_dir; 251ff48e4beSGreg Clayton } 25242ff0ad8SZachary Turner break; 25342ff0ad8SZachary Turner case lldb::ePathTypeLLDBUserPlugins: 254ff48e4beSGreg Clayton { 255ff48e4beSGreg Clayton static std::once_flag g_once_flag; 256ff48e4beSGreg Clayton static bool success = false; 257ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 258ff48e4beSGreg Clayton success = HostInfo::ComputeUserPluginsDirectory (g_fields->m_lldb_user_plugin_dir); 259ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 26042ff0ad8SZachary Turner if (log) 261673b6e4fSZachary Turner log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBUserPlugins) => '%s'", 262673b6e4fSZachary Turner g_fields->m_lldb_user_plugin_dir.GetPath().c_str()); 263ff48e4beSGreg Clayton }); 264ff48e4beSGreg Clayton if (success) 265ff48e4beSGreg Clayton result = &g_fields->m_lldb_user_plugin_dir; 266ff48e4beSGreg Clayton } 26742ff0ad8SZachary Turner break; 26842ff0ad8SZachary Turner case lldb::ePathTypeLLDBTempSystemDir: 269ff48e4beSGreg Clayton { 270ff48e4beSGreg Clayton static std::once_flag g_once_flag; 271ff48e4beSGreg Clayton static bool success = false; 272ff48e4beSGreg Clayton std::call_once(g_once_flag, []() { 27363acdfdeSOleksiy Vyalov success = HostInfo::ComputeProcessTempFileDirectory (g_fields->m_lldb_process_tmp_dir); 274ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 27542ff0ad8SZachary Turner if (log) 27663acdfdeSOleksiy Vyalov log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'", g_fields->m_lldb_process_tmp_dir.GetPath().c_str()); 277ff48e4beSGreg Clayton }); 278ff48e4beSGreg Clayton if (success) 27963acdfdeSOleksiy Vyalov result = &g_fields->m_lldb_process_tmp_dir; 28063acdfdeSOleksiy Vyalov } 28163acdfdeSOleksiy Vyalov break; 28263acdfdeSOleksiy Vyalov case lldb::ePathTypeGlobalLLDBTempSystemDir: 28363acdfdeSOleksiy Vyalov { 28463acdfdeSOleksiy Vyalov static std::once_flag g_once_flag; 28563acdfdeSOleksiy Vyalov static bool success = false; 28663acdfdeSOleksiy Vyalov std::call_once(g_once_flag, []() { 28763acdfdeSOleksiy Vyalov success = HostInfo::ComputeGlobalTempFileDirectory (g_fields->m_lldb_global_tmp_dir); 28863acdfdeSOleksiy Vyalov Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 28963acdfdeSOleksiy Vyalov if (log) 29063acdfdeSOleksiy Vyalov log->Printf("HostInfoBase::GetLLDBPath(ePathTypeGlobalLLDBTempSystemDir) => '%s'", g_fields->m_lldb_global_tmp_dir.GetPath().c_str()); 29163acdfdeSOleksiy Vyalov }); 29263acdfdeSOleksiy Vyalov if (success) 29363acdfdeSOleksiy Vyalov result = &g_fields->m_lldb_global_tmp_dir; 294ff48e4beSGreg Clayton } 29542ff0ad8SZachary Turner break; 29642ff0ad8SZachary Turner } 29742ff0ad8SZachary Turner 29842ff0ad8SZachary Turner if (!result) 29942ff0ad8SZachary Turner return false; 30042ff0ad8SZachary Turner file_spec = *result; 30142ff0ad8SZachary Turner return true; 30242ff0ad8SZachary Turner } 30342ff0ad8SZachary Turner 30442ff0ad8SZachary Turner bool 30542ff0ad8SZachary Turner HostInfoBase::ComputeSharedLibraryDirectory(FileSpec &file_spec) 30642ff0ad8SZachary Turner { 30742ff0ad8SZachary Turner // To get paths related to LLDB we get the path to the executable that 30842ff0ad8SZachary Turner // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB", 30942ff0ad8SZachary Turner // on linux this is assumed to be the "lldb" main executable. If LLDB on 31042ff0ad8SZachary Turner // linux is actually in a shared library (liblldb.so) then this function will 31142ff0ad8SZachary Turner // need to be modified to "do the right thing". 31242ff0ad8SZachary Turner 31342ff0ad8SZachary Turner FileSpec lldb_file_spec( 31442ff0ad8SZachary Turner Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>(reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath)))); 31542ff0ad8SZachary Turner 316db7d8083SSean Callanan // This is necessary because when running the testsuite the shlib might be a symbolic link inside the Python resource dir. 3179077e9f8SSean Callanan FileSystem::ResolveSymbolicLink(lldb_file_spec, lldb_file_spec); 318db7d8083SSean Callanan 31942ff0ad8SZachary Turner // Remove the filename so that this FileSpec only represents the directory. 3200d8400c8SGreg Clayton file_spec.GetDirectory() = lldb_file_spec.GetDirectory(); 32142ff0ad8SZachary Turner 32242ff0ad8SZachary Turner return (bool)file_spec.GetDirectory(); 32342ff0ad8SZachary Turner } 32442ff0ad8SZachary Turner 32542ff0ad8SZachary Turner bool 32642ff0ad8SZachary Turner HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec) 32742ff0ad8SZachary Turner { 32842ff0ad8SZachary Turner return GetLLDBPath(lldb::ePathTypeLLDBShlibDir, file_spec); 32942ff0ad8SZachary Turner } 33042ff0ad8SZachary Turner 33142ff0ad8SZachary Turner bool 33263acdfdeSOleksiy Vyalov HostInfoBase::ComputeProcessTempFileDirectory(FileSpec &file_spec) 33342ff0ad8SZachary Turner { 33463acdfdeSOleksiy Vyalov FileSpec temp_file_spec; 335f3a24329STamas Berghammer if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec)) 33663acdfdeSOleksiy Vyalov return false; 33763acdfdeSOleksiy Vyalov 338*1eb0d42aSPavel Labath std::string pid_str{llvm::to_string(Host::GetCurrentProcessID())}; 339d3173f34SChaoren Lin temp_file_spec.AppendPathComponent(pid_str); 340d3173f34SChaoren Lin if (!FileSystem::MakeDirectory(temp_file_spec, eFilePermissionsDirectoryDefault).Success()) 34163acdfdeSOleksiy Vyalov return false; 34263acdfdeSOleksiy Vyalov 343b79863c2SChaoren Lin file_spec.GetDirectory().SetCString(temp_file_spec.GetCString()); 34463acdfdeSOleksiy Vyalov return true; 34563acdfdeSOleksiy Vyalov } 34663acdfdeSOleksiy Vyalov 34763acdfdeSOleksiy Vyalov bool 348f3a24329STamas Berghammer HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec) 34963acdfdeSOleksiy Vyalov { 35033183147SPavel Labath llvm::SmallVector<char, 16> tmpdir; 35133183147SPavel Labath llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir); 35233183147SPavel Labath file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()), true); 353f3a24329STamas Berghammer return true; 354f3a24329STamas Berghammer } 355f3a24329STamas Berghammer 356f3a24329STamas Berghammer bool 357f3a24329STamas Berghammer HostInfoBase::ComputeGlobalTempFileDirectory(FileSpec &file_spec) 358f3a24329STamas Berghammer { 359f3a24329STamas Berghammer file_spec.Clear(); 360f3a24329STamas Berghammer 361f3a24329STamas Berghammer FileSpec temp_file_spec; 362f3a24329STamas Berghammer if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec)) 363f3a24329STamas Berghammer return false; 364f3a24329STamas Berghammer 365270e99abSZachary Turner temp_file_spec.AppendPathComponent("lldb"); 366d3173f34SChaoren Lin if (!FileSystem::MakeDirectory(temp_file_spec, eFilePermissionsDirectoryDefault).Success()) 36742ff0ad8SZachary Turner return false; 36842ff0ad8SZachary Turner 369b79863c2SChaoren Lin file_spec.GetDirectory().SetCString(temp_file_spec.GetCString()); 37042ff0ad8SZachary Turner return true; 37142ff0ad8SZachary Turner } 37242ff0ad8SZachary Turner 37342ff0ad8SZachary Turner bool 37442ff0ad8SZachary Turner HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec) 37542ff0ad8SZachary Turner { 37642ff0ad8SZachary Turner // TODO(zturner): Figure out how to compute the header directory for all platforms. 37742ff0ad8SZachary Turner return false; 37842ff0ad8SZachary Turner } 37942ff0ad8SZachary Turner 38042ff0ad8SZachary Turner bool 38142ff0ad8SZachary Turner HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec) 38242ff0ad8SZachary Turner { 38342ff0ad8SZachary Turner // TODO(zturner): Figure out how to compute the system plugins directory for all platforms. 38442ff0ad8SZachary Turner return false; 38542ff0ad8SZachary Turner } 38642ff0ad8SZachary Turner 38742ff0ad8SZachary Turner bool 388b1e1c62fSSean Callanan HostInfoBase::ComputeClangDirectory(FileSpec &file_spec) 389b1e1c62fSSean Callanan { 390b1e1c62fSSean Callanan return false; 391b1e1c62fSSean Callanan } 392b1e1c62fSSean Callanan 393b1e1c62fSSean Callanan bool 39442ff0ad8SZachary Turner HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec) 39542ff0ad8SZachary Turner { 39642ff0ad8SZachary Turner // TODO(zturner): Figure out how to compute the user plugins directory for all platforms. 39742ff0ad8SZachary Turner return false; 39842ff0ad8SZachary Turner } 39942ff0ad8SZachary Turner 40013b18261SZachary Turner void 40113b18261SZachary Turner HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32, ArchSpec &arch_64) 40213b18261SZachary Turner { 403b071bee2SOleksiy Vyalov llvm::Triple triple(llvm::sys::getProcessTriple()); 40413b18261SZachary Turner 40513b18261SZachary Turner arch_32.Clear(); 40613b18261SZachary Turner arch_64.Clear(); 40713b18261SZachary Turner 40813b18261SZachary Turner switch (triple.getArch()) 40913b18261SZachary Turner { 41013b18261SZachary Turner default: 41113b18261SZachary Turner arch_32.SetTriple(triple); 41213b18261SZachary Turner break; 41313b18261SZachary Turner 414e85e6021STamas Berghammer case llvm::Triple::aarch64: 4152559abdaSJustin Hibbits case llvm::Triple::ppc64: 416f9ee7e4cSJustin Hibbits case llvm::Triple::x86_64: 41713b18261SZachary Turner arch_64.SetTriple(triple); 41813b18261SZachary Turner arch_32.SetTriple(triple.get32BitArchVariant()); 41913b18261SZachary Turner break; 42013b18261SZachary Turner 42113b18261SZachary Turner case llvm::Triple::mips64: 4223df471c3SMohit K. Bhakkad case llvm::Triple::mips64el: 42313b18261SZachary Turner case llvm::Triple::sparcv9: 424bb00d0b6SUlrich Weigand case llvm::Triple::systemz: 42513b18261SZachary Turner arch_64.SetTriple(triple); 42613b18261SZachary Turner break; 42713b18261SZachary Turner } 42813b18261SZachary Turner } 429