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 uint32_t m_number_cpus; 54673b6e4fSZachary Turner std::string m_vendor_string; 55673b6e4fSZachary Turner std::string m_os_string; 56673b6e4fSZachary Turner std::string m_host_triple; 57673b6e4fSZachary Turner 58673b6e4fSZachary Turner ArchSpec m_host_arch_32; 59673b6e4fSZachary Turner ArchSpec m_host_arch_64; 60673b6e4fSZachary Turner 61673b6e4fSZachary Turner FileSpec m_lldb_so_dir; 62673b6e4fSZachary Turner FileSpec m_lldb_support_exe_dir; 63673b6e4fSZachary Turner FileSpec m_lldb_headers_dir; 64673b6e4fSZachary Turner FileSpec m_lldb_python_dir; 65b1e1c62fSSean Callanan FileSpec m_lldb_clang_resource_dir; 66673b6e4fSZachary Turner FileSpec m_lldb_system_plugin_dir; 67673b6e4fSZachary Turner FileSpec m_lldb_user_plugin_dir; 6863acdfdeSOleksiy Vyalov FileSpec m_lldb_process_tmp_dir; 6963acdfdeSOleksiy Vyalov FileSpec m_lldb_global_tmp_dir; 70673b6e4fSZachary Turner }; 71673b6e4fSZachary Turner 72673b6e4fSZachary Turner HostInfoBaseFields *g_fields = nullptr; 7342ff0ad8SZachary Turner } 7442ff0ad8SZachary Turner 75b9c1b51eSKate Stone void HostInfoBase::Initialize() { g_fields = new HostInfoBaseFields(); } 7642ff0ad8SZachary Turner 77b9c1b51eSKate Stone void HostInfoBase::Terminate() { 7841331afaSZachary Turner delete g_fields; 7941331afaSZachary Turner g_fields = nullptr; 8041331afaSZachary Turner } 8141331afaSZachary Turner 82b9c1b51eSKate Stone uint32_t HostInfoBase::GetNumberCPUS() { 83c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 84c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 85673b6e4fSZachary Turner g_fields->m_number_cpus = std::thread::hardware_concurrency(); 86ff48e4beSGreg Clayton }); 87673b6e4fSZachary Turner return g_fields->m_number_cpus; 8897a14e60SZachary Turner } 8997a14e60SZachary Turner 90b9c1b51eSKate Stone uint32_t HostInfoBase::GetMaxThreadNameLength() { return 0; } 9139de3110SZachary Turner 92b9c1b51eSKate Stone llvm::StringRef HostInfoBase::GetVendorString() { 93c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 94c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 95b9c1b51eSKate Stone g_fields->m_vendor_string = 96b9c1b51eSKate Stone HostInfo::GetArchitecture().GetTriple().getVendorName().str(); 97ff48e4beSGreg Clayton }); 98673b6e4fSZachary Turner return g_fields->m_vendor_string; 9997a14e60SZachary Turner } 10097a14e60SZachary Turner 101b9c1b51eSKate Stone llvm::StringRef HostInfoBase::GetOSString() { 102c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 103c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 104b9c1b51eSKate Stone g_fields->m_os_string = 105b9c1b51eSKate Stone std::move(HostInfo::GetArchitecture().GetTriple().getOSName()); 106ff48e4beSGreg Clayton }); 107673b6e4fSZachary Turner return g_fields->m_os_string; 10897a14e60SZachary Turner } 10997a14e60SZachary Turner 110b9c1b51eSKate Stone llvm::StringRef HostInfoBase::GetTargetTriple() { 111c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 112c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 113b9c1b51eSKate Stone g_fields->m_host_triple = 114b9c1b51eSKate Stone HostInfo::GetArchitecture().GetTriple().getTriple(); 115ff48e4beSGreg Clayton }); 116673b6e4fSZachary Turner return g_fields->m_host_triple; 11797a14e60SZachary Turner } 11813b18261SZachary Turner 119b9c1b51eSKate Stone const ArchSpec &HostInfoBase::GetArchitecture(ArchitectureKind arch_kind) { 120c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 121c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 122b9c1b51eSKate Stone HostInfo::ComputeHostArchitectureSupport(g_fields->m_host_arch_32, 123b9c1b51eSKate Stone g_fields->m_host_arch_64); 124ff48e4beSGreg Clayton }); 12513b18261SZachary Turner 12613b18261SZachary Turner // If an explicit 32 or 64-bit architecture was requested, return that. 12713b18261SZachary Turner if (arch_kind == eArchKind32) 128673b6e4fSZachary Turner return g_fields->m_host_arch_32; 12913b18261SZachary Turner if (arch_kind == eArchKind64) 130673b6e4fSZachary Turner return g_fields->m_host_arch_64; 13113b18261SZachary Turner 13213b18261SZachary Turner // Otherwise prefer the 64-bit architecture if it is valid. 133b9c1b51eSKate Stone return (g_fields->m_host_arch_64.IsValid()) ? g_fields->m_host_arch_64 134b9c1b51eSKate Stone : g_fields->m_host_arch_32; 13513b18261SZachary Turner } 13613b18261SZachary Turner 137b9c1b51eSKate Stone bool HostInfoBase::GetLLDBPath(lldb::PathType type, FileSpec &file_spec) { 13842ff0ad8SZachary Turner file_spec.Clear(); 13942ff0ad8SZachary Turner 14042ff0ad8SZachary Turner #if defined(LLDB_DISABLE_PYTHON) 14142ff0ad8SZachary Turner if (type == lldb::ePathTypePythonDir) 14242ff0ad8SZachary Turner return false; 14342ff0ad8SZachary Turner #endif 14442ff0ad8SZachary Turner 14542ff0ad8SZachary Turner FileSpec *result = nullptr; 146b9c1b51eSKate Stone switch (type) { 147b9c1b51eSKate Stone case lldb::ePathTypeLLDBShlibDir: { 148c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 149ff48e4beSGreg Clayton static bool success = false; 150c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 151b9c1b51eSKate Stone success = 152b9c1b51eSKate Stone HostInfo::ComputeSharedLibraryDirectory(g_fields->m_lldb_so_dir); 153ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 15442ff0ad8SZachary Turner if (log) 155b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBShlibDir) => '%s'", 156b9c1b51eSKate Stone g_fields->m_lldb_so_dir.GetPath().c_str()); 157ff48e4beSGreg Clayton }); 158ff48e4beSGreg Clayton if (success) 159ff48e4beSGreg Clayton result = &g_fields->m_lldb_so_dir; 160b9c1b51eSKate Stone } break; 161b9c1b51eSKate Stone case lldb::ePathTypeSupportExecutableDir: { 162c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 163ff48e4beSGreg Clayton static bool success = false; 164c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 165b9c1b51eSKate Stone success = HostInfo::ComputeSupportExeDirectory( 166b9c1b51eSKate Stone g_fields->m_lldb_support_exe_dir); 167ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 16842ff0ad8SZachary Turner if (log) 169b9c1b51eSKate Stone log->Printf( 170b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeSupportExecutableDir) => '%s'", 171673b6e4fSZachary Turner g_fields->m_lldb_support_exe_dir.GetPath().c_str()); 172ff48e4beSGreg Clayton }); 173ff48e4beSGreg Clayton if (success) 174ff48e4beSGreg Clayton result = &g_fields->m_lldb_support_exe_dir; 175b9c1b51eSKate Stone } break; 176b9c1b51eSKate Stone case lldb::ePathTypeHeaderDir: { 177c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 178ff48e4beSGreg Clayton static bool success = false; 179c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 180ff48e4beSGreg Clayton success = HostInfo::ComputeHeaderDirectory(g_fields->m_lldb_headers_dir); 181ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 18242ff0ad8SZachary Turner if (log) 183b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(ePathTypeHeaderDir) => '%s'", 184b9c1b51eSKate Stone g_fields->m_lldb_headers_dir.GetPath().c_str()); 185ff48e4beSGreg Clayton }); 186ff48e4beSGreg Clayton if (success) 187ff48e4beSGreg Clayton result = &g_fields->m_lldb_headers_dir; 188b9c1b51eSKate Stone } break; 189b9c1b51eSKate Stone case lldb::ePathTypePythonDir: { 190c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 191ff48e4beSGreg Clayton static bool success = false; 192c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 193ff48e4beSGreg Clayton success = HostInfo::ComputePythonDirectory(g_fields->m_lldb_python_dir); 194ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 19542ff0ad8SZachary Turner if (log) 196b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(ePathTypePythonDir) => '%s'", 197b9c1b51eSKate Stone g_fields->m_lldb_python_dir.GetPath().c_str()); 198ff48e4beSGreg Clayton }); 199ff48e4beSGreg Clayton if (success) 200ff48e4beSGreg Clayton result = &g_fields->m_lldb_python_dir; 201b9c1b51eSKate Stone } break; 202b9c1b51eSKate Stone case lldb::ePathTypeClangDir: { 203c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 204ff48e4beSGreg Clayton static bool success = false; 205c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 206b9c1b51eSKate Stone success = 207b9c1b51eSKate Stone HostInfo::ComputeClangDirectory(g_fields->m_lldb_clang_resource_dir); 208ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 209b1e1c62fSSean Callanan if (log) 210b9c1b51eSKate Stone log->Printf( 211b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeClangResourceDir) => '%s'", 212b9c1b51eSKate Stone g_fields->m_lldb_clang_resource_dir.GetPath().c_str()); 213ff48e4beSGreg Clayton }); 214ff48e4beSGreg Clayton if (success) 215ff48e4beSGreg Clayton result = &g_fields->m_lldb_clang_resource_dir; 216b9c1b51eSKate Stone } break; 217b9c1b51eSKate Stone case lldb::ePathTypeLLDBSystemPlugins: { 218c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 219ff48e4beSGreg Clayton static bool success = false; 220c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 221b9c1b51eSKate Stone success = HostInfo::ComputeSystemPluginsDirectory( 222b9c1b51eSKate Stone g_fields->m_lldb_system_plugin_dir); 223ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 22442ff0ad8SZachary Turner if (log) 225b9c1b51eSKate Stone log->Printf( 226b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeLLDBSystemPlugins) => '%s'", 227673b6e4fSZachary Turner g_fields->m_lldb_system_plugin_dir.GetPath().c_str()); 228ff48e4beSGreg Clayton }); 229ff48e4beSGreg Clayton if (success) 230ff48e4beSGreg Clayton result = &g_fields->m_lldb_system_plugin_dir; 231b9c1b51eSKate Stone } break; 232b9c1b51eSKate Stone case lldb::ePathTypeLLDBUserPlugins: { 233c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 234ff48e4beSGreg Clayton static bool success = false; 235c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 236b9c1b51eSKate Stone success = HostInfo::ComputeUserPluginsDirectory( 237b9c1b51eSKate Stone g_fields->m_lldb_user_plugin_dir); 238ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 23942ff0ad8SZachary Turner if (log) 240b9c1b51eSKate Stone log->Printf( 241b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeLLDBUserPlugins) => '%s'", 242673b6e4fSZachary Turner g_fields->m_lldb_user_plugin_dir.GetPath().c_str()); 243ff48e4beSGreg Clayton }); 244ff48e4beSGreg Clayton if (success) 245ff48e4beSGreg Clayton result = &g_fields->m_lldb_user_plugin_dir; 246b9c1b51eSKate Stone } break; 247b9c1b51eSKate Stone case lldb::ePathTypeLLDBTempSystemDir: { 248c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 249ff48e4beSGreg Clayton static bool success = false; 250c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 251b9c1b51eSKate Stone success = HostInfo::ComputeProcessTempFileDirectory( 252b9c1b51eSKate Stone g_fields->m_lldb_process_tmp_dir); 253ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 25442ff0ad8SZachary Turner if (log) 255b9c1b51eSKate Stone log->Printf( 256b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'", 257b9c1b51eSKate Stone g_fields->m_lldb_process_tmp_dir.GetPath().c_str()); 258ff48e4beSGreg Clayton }); 259ff48e4beSGreg Clayton if (success) 26063acdfdeSOleksiy Vyalov result = &g_fields->m_lldb_process_tmp_dir; 261b9c1b51eSKate Stone } break; 262b9c1b51eSKate Stone case lldb::ePathTypeGlobalLLDBTempSystemDir: { 263c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 26463acdfdeSOleksiy Vyalov static bool success = false; 265c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 266b9c1b51eSKate Stone success = HostInfo::ComputeGlobalTempFileDirectory( 267b9c1b51eSKate Stone g_fields->m_lldb_global_tmp_dir); 26863acdfdeSOleksiy Vyalov Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 26963acdfdeSOleksiy Vyalov if (log) 270b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(" 271b9c1b51eSKate Stone "ePathTypeGlobalLLDBTempSystemDir) => '%s'", 272b9c1b51eSKate Stone g_fields->m_lldb_global_tmp_dir.GetPath().c_str()); 27363acdfdeSOleksiy Vyalov }); 27463acdfdeSOleksiy Vyalov if (success) 27563acdfdeSOleksiy Vyalov result = &g_fields->m_lldb_global_tmp_dir; 276b9c1b51eSKate Stone } break; 27742ff0ad8SZachary Turner } 27842ff0ad8SZachary Turner 27942ff0ad8SZachary Turner if (!result) 28042ff0ad8SZachary Turner return false; 28142ff0ad8SZachary Turner file_spec = *result; 28242ff0ad8SZachary Turner return true; 28342ff0ad8SZachary Turner } 28442ff0ad8SZachary Turner 285b9c1b51eSKate Stone bool HostInfoBase::ComputeSharedLibraryDirectory(FileSpec &file_spec) { 28642ff0ad8SZachary Turner // To get paths related to LLDB we get the path to the executable that 28742ff0ad8SZachary Turner // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB", 28842ff0ad8SZachary Turner // on linux this is assumed to be the "lldb" main executable. If LLDB on 28942ff0ad8SZachary Turner // linux is actually in a shared library (liblldb.so) then this function will 29042ff0ad8SZachary Turner // need to be modified to "do the right thing". 29142ff0ad8SZachary Turner 29242ff0ad8SZachary Turner FileSpec lldb_file_spec( 293b9c1b51eSKate Stone Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>( 294b9c1b51eSKate Stone reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath)))); 29542ff0ad8SZachary Turner 296b9c1b51eSKate Stone // This is necessary because when running the testsuite the shlib might be a 297b9c1b51eSKate Stone // symbolic link inside the Python resource dir. 2989077e9f8SSean Callanan FileSystem::ResolveSymbolicLink(lldb_file_spec, lldb_file_spec); 299db7d8083SSean Callanan 30042ff0ad8SZachary Turner // Remove the filename so that this FileSpec only represents the directory. 3010d8400c8SGreg Clayton file_spec.GetDirectory() = lldb_file_spec.GetDirectory(); 30242ff0ad8SZachary Turner 30342ff0ad8SZachary Turner return (bool)file_spec.GetDirectory(); 30442ff0ad8SZachary Turner } 30542ff0ad8SZachary Turner 306b9c1b51eSKate Stone bool HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec) { 30742ff0ad8SZachary Turner return GetLLDBPath(lldb::ePathTypeLLDBShlibDir, file_spec); 30842ff0ad8SZachary Turner } 30942ff0ad8SZachary Turner 310b9c1b51eSKate Stone bool HostInfoBase::ComputeProcessTempFileDirectory(FileSpec &file_spec) { 31163acdfdeSOleksiy Vyalov FileSpec temp_file_spec; 312f3a24329STamas Berghammer if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec)) 31363acdfdeSOleksiy Vyalov return false; 31463acdfdeSOleksiy Vyalov 3151eb0d42aSPavel Labath std::string pid_str{llvm::to_string(Host::GetCurrentProcessID())}; 316d3173f34SChaoren Lin temp_file_spec.AppendPathComponent(pid_str); 317*d3d95fd6SZachary Turner if (llvm::sys::fs::create_directory(temp_file_spec.GetPath())) 31863acdfdeSOleksiy Vyalov return false; 31963acdfdeSOleksiy Vyalov 320b79863c2SChaoren Lin file_spec.GetDirectory().SetCString(temp_file_spec.GetCString()); 32163acdfdeSOleksiy Vyalov return true; 32263acdfdeSOleksiy Vyalov } 32363acdfdeSOleksiy Vyalov 324b9c1b51eSKate Stone bool HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec) { 32533183147SPavel Labath llvm::SmallVector<char, 16> tmpdir; 32633183147SPavel Labath llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir); 32733183147SPavel Labath file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()), true); 328f3a24329STamas Berghammer return true; 329f3a24329STamas Berghammer } 330f3a24329STamas Berghammer 331b9c1b51eSKate Stone bool HostInfoBase::ComputeGlobalTempFileDirectory(FileSpec &file_spec) { 332f3a24329STamas Berghammer file_spec.Clear(); 333f3a24329STamas Berghammer 334f3a24329STamas Berghammer FileSpec temp_file_spec; 335f3a24329STamas Berghammer if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec)) 336f3a24329STamas Berghammer return false; 337f3a24329STamas Berghammer 338270e99abSZachary Turner temp_file_spec.AppendPathComponent("lldb"); 339*d3d95fd6SZachary Turner if (llvm::sys::fs::create_directory(temp_file_spec.GetPath())) 34042ff0ad8SZachary Turner return false; 34142ff0ad8SZachary Turner 342b79863c2SChaoren Lin file_spec.GetDirectory().SetCString(temp_file_spec.GetCString()); 34342ff0ad8SZachary Turner return true; 34442ff0ad8SZachary Turner } 34542ff0ad8SZachary Turner 346b9c1b51eSKate Stone bool HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec) { 347b9c1b51eSKate Stone // TODO(zturner): Figure out how to compute the header directory for all 348b9c1b51eSKate Stone // platforms. 34942ff0ad8SZachary Turner return false; 35042ff0ad8SZachary Turner } 35142ff0ad8SZachary Turner 352b9c1b51eSKate Stone bool HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec) { 353b9c1b51eSKate Stone // TODO(zturner): Figure out how to compute the system plugins directory for 354b9c1b51eSKate Stone // all platforms. 35542ff0ad8SZachary Turner return false; 35642ff0ad8SZachary Turner } 35742ff0ad8SZachary Turner 358b9c1b51eSKate Stone bool HostInfoBase::ComputeClangDirectory(FileSpec &file_spec) { return false; } 359b9c1b51eSKate Stone 360b9c1b51eSKate Stone bool HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec) { 361b9c1b51eSKate Stone // TODO(zturner): Figure out how to compute the user plugins directory for all 362b9c1b51eSKate Stone // platforms. 363b1e1c62fSSean Callanan return false; 364b1e1c62fSSean Callanan } 365b1e1c62fSSean Callanan 366b9c1b51eSKate Stone void HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32, 367b9c1b51eSKate Stone ArchSpec &arch_64) { 368b071bee2SOleksiy Vyalov llvm::Triple triple(llvm::sys::getProcessTriple()); 36913b18261SZachary Turner 37013b18261SZachary Turner arch_32.Clear(); 37113b18261SZachary Turner arch_64.Clear(); 37213b18261SZachary Turner 373b9c1b51eSKate Stone switch (triple.getArch()) { 37413b18261SZachary Turner default: 37513b18261SZachary Turner arch_32.SetTriple(triple); 37613b18261SZachary Turner break; 37713b18261SZachary Turner 378e85e6021STamas Berghammer case llvm::Triple::aarch64: 3792559abdaSJustin Hibbits case llvm::Triple::ppc64: 380f9ee7e4cSJustin Hibbits case llvm::Triple::x86_64: 38113b18261SZachary Turner arch_64.SetTriple(triple); 38213b18261SZachary Turner arch_32.SetTriple(triple.get32BitArchVariant()); 38313b18261SZachary Turner break; 38413b18261SZachary Turner 38513b18261SZachary Turner case llvm::Triple::mips64: 3863df471c3SMohit K. Bhakkad case llvm::Triple::mips64el: 38713b18261SZachary Turner case llvm::Triple::sparcv9: 388bb00d0b6SUlrich Weigand case llvm::Triple::systemz: 38913b18261SZachary Turner arch_64.SetTriple(triple); 39013b18261SZachary Turner break; 39113b18261SZachary Turner } 39213b18261SZachary Turner } 393