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 1242ff0ad8SZachary Turner #include "lldb/Host/FileSystem.h" 1397a14e60SZachary Turner #include "lldb/Host/Host.h" 1413b18261SZachary Turner #include "lldb/Host/HostInfo.h" 1513b18261SZachary Turner #include "lldb/Host/HostInfoBase.h" 16*5f19b907SPavel Labath #include "lldb/Utility/ArchSpec.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 1064ebb64b9SPavel Labath llvm::Optional<HostInfoBase::ArchitectureKind> HostInfoBase::ParseArchitectureKind(llvm::StringRef kind) { 1074ebb64b9SPavel Labath return llvm::StringSwitch<llvm::Optional<ArchitectureKind>>(kind) 1084ebb64b9SPavel Labath .Case(LLDB_ARCH_DEFAULT, eArchKindDefault) 1094ebb64b9SPavel Labath .Case(LLDB_ARCH_DEFAULT_32BIT, eArchKind32) 1104ebb64b9SPavel Labath .Case(LLDB_ARCH_DEFAULT_64BIT, eArchKind64) 1114ebb64b9SPavel Labath .Default(llvm::None); 1124ebb64b9SPavel Labath } 1134ebb64b9SPavel Labath 114b9c1b51eSKate Stone bool HostInfoBase::GetLLDBPath(lldb::PathType type, FileSpec &file_spec) { 11542ff0ad8SZachary Turner file_spec.Clear(); 11642ff0ad8SZachary Turner 11742ff0ad8SZachary Turner #if defined(LLDB_DISABLE_PYTHON) 11842ff0ad8SZachary Turner if (type == lldb::ePathTypePythonDir) 11942ff0ad8SZachary Turner return false; 12042ff0ad8SZachary Turner #endif 12142ff0ad8SZachary Turner 12242ff0ad8SZachary Turner FileSpec *result = nullptr; 123b9c1b51eSKate Stone switch (type) { 124b9c1b51eSKate Stone case lldb::ePathTypeLLDBShlibDir: { 125c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 126ff48e4beSGreg Clayton static bool success = false; 127c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 128b9c1b51eSKate Stone success = 129b9c1b51eSKate Stone HostInfo::ComputeSharedLibraryDirectory(g_fields->m_lldb_so_dir); 130ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 13142ff0ad8SZachary Turner if (log) 132b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBShlibDir) => '%s'", 133b9c1b51eSKate Stone g_fields->m_lldb_so_dir.GetPath().c_str()); 134ff48e4beSGreg Clayton }); 135ff48e4beSGreg Clayton if (success) 136ff48e4beSGreg Clayton result = &g_fields->m_lldb_so_dir; 137b9c1b51eSKate Stone } break; 138b9c1b51eSKate Stone case lldb::ePathTypeSupportExecutableDir: { 139c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 140ff48e4beSGreg Clayton static bool success = false; 141c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 142b9c1b51eSKate Stone success = HostInfo::ComputeSupportExeDirectory( 143b9c1b51eSKate Stone g_fields->m_lldb_support_exe_dir); 144ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 14542ff0ad8SZachary Turner if (log) 146b9c1b51eSKate Stone log->Printf( 147b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeSupportExecutableDir) => '%s'", 148673b6e4fSZachary Turner g_fields->m_lldb_support_exe_dir.GetPath().c_str()); 149ff48e4beSGreg Clayton }); 150ff48e4beSGreg Clayton if (success) 151ff48e4beSGreg Clayton result = &g_fields->m_lldb_support_exe_dir; 152b9c1b51eSKate Stone } break; 153b9c1b51eSKate Stone case lldb::ePathTypeHeaderDir: { 154c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 155ff48e4beSGreg Clayton static bool success = false; 156c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 157ff48e4beSGreg Clayton success = HostInfo::ComputeHeaderDirectory(g_fields->m_lldb_headers_dir); 158ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 15942ff0ad8SZachary Turner if (log) 160b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(ePathTypeHeaderDir) => '%s'", 161b9c1b51eSKate Stone g_fields->m_lldb_headers_dir.GetPath().c_str()); 162ff48e4beSGreg Clayton }); 163ff48e4beSGreg Clayton if (success) 164ff48e4beSGreg Clayton result = &g_fields->m_lldb_headers_dir; 165b9c1b51eSKate Stone } break; 166b9c1b51eSKate Stone case lldb::ePathTypePythonDir: { 167c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 168ff48e4beSGreg Clayton static bool success = false; 169c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 170ff48e4beSGreg Clayton success = HostInfo::ComputePythonDirectory(g_fields->m_lldb_python_dir); 171ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 17242ff0ad8SZachary Turner if (log) 173b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(ePathTypePythonDir) => '%s'", 174b9c1b51eSKate Stone g_fields->m_lldb_python_dir.GetPath().c_str()); 175ff48e4beSGreg Clayton }); 176ff48e4beSGreg Clayton if (success) 177ff48e4beSGreg Clayton result = &g_fields->m_lldb_python_dir; 178b9c1b51eSKate Stone } break; 179b9c1b51eSKate Stone case lldb::ePathTypeClangDir: { 180c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 181ff48e4beSGreg Clayton static bool success = false; 182c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 183b9c1b51eSKate Stone success = 184b9c1b51eSKate Stone HostInfo::ComputeClangDirectory(g_fields->m_lldb_clang_resource_dir); 185ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 186b1e1c62fSSean Callanan if (log) 187b9c1b51eSKate Stone log->Printf( 188b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeClangResourceDir) => '%s'", 189b9c1b51eSKate Stone g_fields->m_lldb_clang_resource_dir.GetPath().c_str()); 190ff48e4beSGreg Clayton }); 191ff48e4beSGreg Clayton if (success) 192ff48e4beSGreg Clayton result = &g_fields->m_lldb_clang_resource_dir; 193b9c1b51eSKate Stone } break; 194b9c1b51eSKate Stone case lldb::ePathTypeLLDBSystemPlugins: { 195c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 196ff48e4beSGreg Clayton static bool success = false; 197c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 198b9c1b51eSKate Stone success = HostInfo::ComputeSystemPluginsDirectory( 199b9c1b51eSKate Stone g_fields->m_lldb_system_plugin_dir); 200ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 20142ff0ad8SZachary Turner if (log) 202b9c1b51eSKate Stone log->Printf( 203b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeLLDBSystemPlugins) => '%s'", 204673b6e4fSZachary Turner g_fields->m_lldb_system_plugin_dir.GetPath().c_str()); 205ff48e4beSGreg Clayton }); 206ff48e4beSGreg Clayton if (success) 207ff48e4beSGreg Clayton result = &g_fields->m_lldb_system_plugin_dir; 208b9c1b51eSKate Stone } break; 209b9c1b51eSKate Stone case lldb::ePathTypeLLDBUserPlugins: { 210c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 211ff48e4beSGreg Clayton static bool success = false; 212c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 213b9c1b51eSKate Stone success = HostInfo::ComputeUserPluginsDirectory( 214b9c1b51eSKate Stone g_fields->m_lldb_user_plugin_dir); 215ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 21642ff0ad8SZachary Turner if (log) 217b9c1b51eSKate Stone log->Printf( 218b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeLLDBUserPlugins) => '%s'", 219673b6e4fSZachary Turner g_fields->m_lldb_user_plugin_dir.GetPath().c_str()); 220ff48e4beSGreg Clayton }); 221ff48e4beSGreg Clayton if (success) 222ff48e4beSGreg Clayton result = &g_fields->m_lldb_user_plugin_dir; 223b9c1b51eSKate Stone } break; 224b9c1b51eSKate Stone case lldb::ePathTypeLLDBTempSystemDir: { 225c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 226ff48e4beSGreg Clayton static bool success = false; 227c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 228b9c1b51eSKate Stone success = HostInfo::ComputeProcessTempFileDirectory( 229b9c1b51eSKate Stone g_fields->m_lldb_process_tmp_dir); 230ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 23142ff0ad8SZachary Turner if (log) 232b9c1b51eSKate Stone log->Printf( 233b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'", 234b9c1b51eSKate Stone g_fields->m_lldb_process_tmp_dir.GetPath().c_str()); 235ff48e4beSGreg Clayton }); 236ff48e4beSGreg Clayton if (success) 23763acdfdeSOleksiy Vyalov result = &g_fields->m_lldb_process_tmp_dir; 238b9c1b51eSKate Stone } break; 239b9c1b51eSKate Stone case lldb::ePathTypeGlobalLLDBTempSystemDir: { 240c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 24163acdfdeSOleksiy Vyalov static bool success = false; 242c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 243b9c1b51eSKate Stone success = HostInfo::ComputeGlobalTempFileDirectory( 244b9c1b51eSKate Stone g_fields->m_lldb_global_tmp_dir); 24563acdfdeSOleksiy Vyalov Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 24663acdfdeSOleksiy Vyalov if (log) 247b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(" 248b9c1b51eSKate Stone "ePathTypeGlobalLLDBTempSystemDir) => '%s'", 249b9c1b51eSKate Stone g_fields->m_lldb_global_tmp_dir.GetPath().c_str()); 25063acdfdeSOleksiy Vyalov }); 25163acdfdeSOleksiy Vyalov if (success) 25263acdfdeSOleksiy Vyalov result = &g_fields->m_lldb_global_tmp_dir; 253b9c1b51eSKate Stone } break; 25442ff0ad8SZachary Turner } 25542ff0ad8SZachary Turner 25642ff0ad8SZachary Turner if (!result) 25742ff0ad8SZachary Turner return false; 25842ff0ad8SZachary Turner file_spec = *result; 25942ff0ad8SZachary Turner return true; 26042ff0ad8SZachary Turner } 26142ff0ad8SZachary Turner 2627263f1bdSPavel Labath ArchSpec HostInfoBase::GetAugmentedArchSpec(llvm::StringRef triple) { 2637263f1bdSPavel Labath if (triple.empty()) 2647263f1bdSPavel Labath return ArchSpec(); 2657263f1bdSPavel Labath llvm::Triple normalized_triple(llvm::Triple::normalize(triple)); 2667263f1bdSPavel Labath if (!ArchSpec::ContainsOnlyArch(normalized_triple)) 2677263f1bdSPavel Labath return ArchSpec(triple); 2687263f1bdSPavel Labath 2694ebb64b9SPavel Labath if (auto kind = HostInfo::ParseArchitectureKind(triple)) 2704ebb64b9SPavel Labath return HostInfo::GetArchitecture(*kind); 2714ebb64b9SPavel Labath 2727263f1bdSPavel Labath llvm::Triple host_triple(llvm::sys::getDefaultTargetTriple()); 2737263f1bdSPavel Labath 2747263f1bdSPavel Labath if (normalized_triple.getVendorName().empty()) 2757263f1bdSPavel Labath normalized_triple.setVendor(host_triple.getVendor()); 2767263f1bdSPavel Labath if (normalized_triple.getOSName().empty()) 2777263f1bdSPavel Labath normalized_triple.setOS(host_triple.getOS()); 2787263f1bdSPavel Labath if (normalized_triple.getEnvironmentName().empty()) 2797263f1bdSPavel Labath normalized_triple.setEnvironment(host_triple.getEnvironment()); 2807263f1bdSPavel Labath return ArchSpec(normalized_triple); 2817263f1bdSPavel Labath } 2827263f1bdSPavel Labath 283b9c1b51eSKate Stone bool HostInfoBase::ComputeSharedLibraryDirectory(FileSpec &file_spec) { 28442ff0ad8SZachary Turner // To get paths related to LLDB we get the path to the executable that 28542ff0ad8SZachary Turner // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB", 28642ff0ad8SZachary Turner // on linux this is assumed to be the "lldb" main executable. If LLDB on 28742ff0ad8SZachary Turner // linux is actually in a shared library (liblldb.so) then this function will 28842ff0ad8SZachary Turner // need to be modified to "do the right thing". 28942ff0ad8SZachary Turner 29042ff0ad8SZachary Turner FileSpec lldb_file_spec( 291b9c1b51eSKate Stone Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>( 292b9c1b51eSKate Stone reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath)))); 29342ff0ad8SZachary Turner 294b9c1b51eSKate Stone // This is necessary because when running the testsuite the shlib might be a 295b9c1b51eSKate Stone // symbolic link inside the Python resource dir. 2969077e9f8SSean Callanan FileSystem::ResolveSymbolicLink(lldb_file_spec, lldb_file_spec); 297db7d8083SSean Callanan 29842ff0ad8SZachary Turner // Remove the filename so that this FileSpec only represents the directory. 2990d8400c8SGreg Clayton file_spec.GetDirectory() = lldb_file_spec.GetDirectory(); 30042ff0ad8SZachary Turner 30142ff0ad8SZachary Turner return (bool)file_spec.GetDirectory(); 30242ff0ad8SZachary Turner } 30342ff0ad8SZachary Turner 304b9c1b51eSKate Stone bool HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec) { 30542ff0ad8SZachary Turner return GetLLDBPath(lldb::ePathTypeLLDBShlibDir, file_spec); 30642ff0ad8SZachary Turner } 30742ff0ad8SZachary Turner 308b9c1b51eSKate Stone bool HostInfoBase::ComputeProcessTempFileDirectory(FileSpec &file_spec) { 30963acdfdeSOleksiy Vyalov FileSpec temp_file_spec; 310f3a24329STamas Berghammer if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec)) 31163acdfdeSOleksiy Vyalov return false; 31263acdfdeSOleksiy Vyalov 3131eb0d42aSPavel Labath std::string pid_str{llvm::to_string(Host::GetCurrentProcessID())}; 314d3173f34SChaoren Lin temp_file_spec.AppendPathComponent(pid_str); 315d3d95fd6SZachary Turner if (llvm::sys::fs::create_directory(temp_file_spec.GetPath())) 31663acdfdeSOleksiy Vyalov return false; 31763acdfdeSOleksiy Vyalov 318b79863c2SChaoren Lin file_spec.GetDirectory().SetCString(temp_file_spec.GetCString()); 31963acdfdeSOleksiy Vyalov return true; 32063acdfdeSOleksiy Vyalov } 32163acdfdeSOleksiy Vyalov 322b9c1b51eSKate Stone bool HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec) { 32333183147SPavel Labath llvm::SmallVector<char, 16> tmpdir; 32433183147SPavel Labath llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir); 32533183147SPavel Labath file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()), true); 326f3a24329STamas Berghammer return true; 327f3a24329STamas Berghammer } 328f3a24329STamas Berghammer 329b9c1b51eSKate Stone bool HostInfoBase::ComputeGlobalTempFileDirectory(FileSpec &file_spec) { 330f3a24329STamas Berghammer file_spec.Clear(); 331f3a24329STamas Berghammer 332f3a24329STamas Berghammer FileSpec temp_file_spec; 333f3a24329STamas Berghammer if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec)) 334f3a24329STamas Berghammer return false; 335f3a24329STamas Berghammer 336270e99abSZachary Turner temp_file_spec.AppendPathComponent("lldb"); 337d3d95fd6SZachary Turner if (llvm::sys::fs::create_directory(temp_file_spec.GetPath())) 33842ff0ad8SZachary Turner return false; 33942ff0ad8SZachary Turner 340b79863c2SChaoren Lin file_spec.GetDirectory().SetCString(temp_file_spec.GetCString()); 34142ff0ad8SZachary Turner return true; 34242ff0ad8SZachary Turner } 34342ff0ad8SZachary Turner 344b9c1b51eSKate Stone bool HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec) { 345b9c1b51eSKate Stone // TODO(zturner): Figure out how to compute the header directory for all 346b9c1b51eSKate Stone // platforms. 34742ff0ad8SZachary Turner return false; 34842ff0ad8SZachary Turner } 34942ff0ad8SZachary Turner 350b9c1b51eSKate Stone bool HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec) { 351b9c1b51eSKate Stone // TODO(zturner): Figure out how to compute the system plugins directory for 352b9c1b51eSKate Stone // all platforms. 35342ff0ad8SZachary Turner return false; 35442ff0ad8SZachary Turner } 35542ff0ad8SZachary Turner 356b9c1b51eSKate Stone bool HostInfoBase::ComputeClangDirectory(FileSpec &file_spec) { return false; } 357b9c1b51eSKate Stone 358b9c1b51eSKate Stone bool HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec) { 359b9c1b51eSKate Stone // TODO(zturner): Figure out how to compute the user plugins directory for all 360b9c1b51eSKate Stone // platforms. 361b1e1c62fSSean Callanan return false; 362b1e1c62fSSean Callanan } 363b1e1c62fSSean Callanan 364b9c1b51eSKate Stone void HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32, 365b9c1b51eSKate Stone ArchSpec &arch_64) { 366b071bee2SOleksiy Vyalov llvm::Triple triple(llvm::sys::getProcessTriple()); 36713b18261SZachary Turner 36813b18261SZachary Turner arch_32.Clear(); 36913b18261SZachary Turner arch_64.Clear(); 37013b18261SZachary Turner 371b9c1b51eSKate Stone switch (triple.getArch()) { 37213b18261SZachary Turner default: 37313b18261SZachary Turner arch_32.SetTriple(triple); 37413b18261SZachary Turner break; 37513b18261SZachary Turner 376e85e6021STamas Berghammer case llvm::Triple::aarch64: 3772559abdaSJustin Hibbits case llvm::Triple::ppc64: 378f9ee7e4cSJustin Hibbits case llvm::Triple::x86_64: 37913b18261SZachary Turner arch_64.SetTriple(triple); 38013b18261SZachary Turner arch_32.SetTriple(triple.get32BitArchVariant()); 38113b18261SZachary Turner break; 38213b18261SZachary Turner 38313b18261SZachary Turner case llvm::Triple::mips64: 3843df471c3SMohit K. Bhakkad case llvm::Triple::mips64el: 38513b18261SZachary Turner case llvm::Triple::sparcv9: 386bb00d0b6SUlrich Weigand case llvm::Triple::systemz: 38713b18261SZachary Turner arch_64.SetTriple(triple); 38813b18261SZachary Turner break; 38913b18261SZachary Turner } 39013b18261SZachary Turner } 391