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 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 106b9c1b51eSKate Stone bool HostInfoBase::GetLLDBPath(lldb::PathType type, FileSpec &file_spec) { 10742ff0ad8SZachary Turner file_spec.Clear(); 10842ff0ad8SZachary Turner 10942ff0ad8SZachary Turner #if defined(LLDB_DISABLE_PYTHON) 11042ff0ad8SZachary Turner if (type == lldb::ePathTypePythonDir) 11142ff0ad8SZachary Turner return false; 11242ff0ad8SZachary Turner #endif 11342ff0ad8SZachary Turner 11442ff0ad8SZachary Turner FileSpec *result = nullptr; 115b9c1b51eSKate Stone switch (type) { 116b9c1b51eSKate Stone case lldb::ePathTypeLLDBShlibDir: { 117c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 118ff48e4beSGreg Clayton static bool success = false; 119c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 120b9c1b51eSKate Stone success = 121b9c1b51eSKate Stone HostInfo::ComputeSharedLibraryDirectory(g_fields->m_lldb_so_dir); 122ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 12342ff0ad8SZachary Turner if (log) 124b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(ePathTypeLLDBShlibDir) => '%s'", 125b9c1b51eSKate Stone g_fields->m_lldb_so_dir.GetPath().c_str()); 126ff48e4beSGreg Clayton }); 127ff48e4beSGreg Clayton if (success) 128ff48e4beSGreg Clayton result = &g_fields->m_lldb_so_dir; 129b9c1b51eSKate Stone } break; 130b9c1b51eSKate Stone case lldb::ePathTypeSupportExecutableDir: { 131c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 132ff48e4beSGreg Clayton static bool success = false; 133c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 134b9c1b51eSKate Stone success = HostInfo::ComputeSupportExeDirectory( 135b9c1b51eSKate Stone g_fields->m_lldb_support_exe_dir); 136ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 13742ff0ad8SZachary Turner if (log) 138b9c1b51eSKate Stone log->Printf( 139b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeSupportExecutableDir) => '%s'", 140673b6e4fSZachary Turner g_fields->m_lldb_support_exe_dir.GetPath().c_str()); 141ff48e4beSGreg Clayton }); 142ff48e4beSGreg Clayton if (success) 143ff48e4beSGreg Clayton result = &g_fields->m_lldb_support_exe_dir; 144b9c1b51eSKate Stone } break; 145b9c1b51eSKate Stone case lldb::ePathTypeHeaderDir: { 146c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 147ff48e4beSGreg Clayton static bool success = false; 148c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 149ff48e4beSGreg Clayton success = HostInfo::ComputeHeaderDirectory(g_fields->m_lldb_headers_dir); 150ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 15142ff0ad8SZachary Turner if (log) 152b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(ePathTypeHeaderDir) => '%s'", 153b9c1b51eSKate Stone g_fields->m_lldb_headers_dir.GetPath().c_str()); 154ff48e4beSGreg Clayton }); 155ff48e4beSGreg Clayton if (success) 156ff48e4beSGreg Clayton result = &g_fields->m_lldb_headers_dir; 157b9c1b51eSKate Stone } break; 158b9c1b51eSKate Stone case lldb::ePathTypePythonDir: { 159c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 160ff48e4beSGreg Clayton static bool success = false; 161c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 162ff48e4beSGreg Clayton success = HostInfo::ComputePythonDirectory(g_fields->m_lldb_python_dir); 163ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 16442ff0ad8SZachary Turner if (log) 165b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(ePathTypePythonDir) => '%s'", 166b9c1b51eSKate Stone g_fields->m_lldb_python_dir.GetPath().c_str()); 167ff48e4beSGreg Clayton }); 168ff48e4beSGreg Clayton if (success) 169ff48e4beSGreg Clayton result = &g_fields->m_lldb_python_dir; 170b9c1b51eSKate Stone } break; 171b9c1b51eSKate Stone case lldb::ePathTypeClangDir: { 172c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 173ff48e4beSGreg Clayton static bool success = false; 174c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 175b9c1b51eSKate Stone success = 176b9c1b51eSKate Stone HostInfo::ComputeClangDirectory(g_fields->m_lldb_clang_resource_dir); 177ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 178b1e1c62fSSean Callanan if (log) 179b9c1b51eSKate Stone log->Printf( 180b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeClangResourceDir) => '%s'", 181b9c1b51eSKate Stone g_fields->m_lldb_clang_resource_dir.GetPath().c_str()); 182ff48e4beSGreg Clayton }); 183ff48e4beSGreg Clayton if (success) 184ff48e4beSGreg Clayton result = &g_fields->m_lldb_clang_resource_dir; 185b9c1b51eSKate Stone } break; 186b9c1b51eSKate Stone case lldb::ePathTypeLLDBSystemPlugins: { 187c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 188ff48e4beSGreg Clayton static bool success = false; 189c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 190b9c1b51eSKate Stone success = HostInfo::ComputeSystemPluginsDirectory( 191b9c1b51eSKate Stone g_fields->m_lldb_system_plugin_dir); 192ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 19342ff0ad8SZachary Turner if (log) 194b9c1b51eSKate Stone log->Printf( 195b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeLLDBSystemPlugins) => '%s'", 196673b6e4fSZachary Turner g_fields->m_lldb_system_plugin_dir.GetPath().c_str()); 197ff48e4beSGreg Clayton }); 198ff48e4beSGreg Clayton if (success) 199ff48e4beSGreg Clayton result = &g_fields->m_lldb_system_plugin_dir; 200b9c1b51eSKate Stone } break; 201b9c1b51eSKate Stone case lldb::ePathTypeLLDBUserPlugins: { 202c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 203ff48e4beSGreg Clayton static bool success = false; 204c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 205b9c1b51eSKate Stone success = HostInfo::ComputeUserPluginsDirectory( 206b9c1b51eSKate Stone g_fields->m_lldb_user_plugin_dir); 207ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 20842ff0ad8SZachary Turner if (log) 209b9c1b51eSKate Stone log->Printf( 210b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeLLDBUserPlugins) => '%s'", 211673b6e4fSZachary Turner g_fields->m_lldb_user_plugin_dir.GetPath().c_str()); 212ff48e4beSGreg Clayton }); 213ff48e4beSGreg Clayton if (success) 214ff48e4beSGreg Clayton result = &g_fields->m_lldb_user_plugin_dir; 215b9c1b51eSKate Stone } break; 216b9c1b51eSKate Stone case lldb::ePathTypeLLDBTempSystemDir: { 217c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 218ff48e4beSGreg Clayton static bool success = false; 219c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 220b9c1b51eSKate Stone success = HostInfo::ComputeProcessTempFileDirectory( 221b9c1b51eSKate Stone g_fields->m_lldb_process_tmp_dir); 222ff48e4beSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 22342ff0ad8SZachary Turner if (log) 224b9c1b51eSKate Stone log->Printf( 225b9c1b51eSKate Stone "HostInfoBase::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'", 226b9c1b51eSKate Stone g_fields->m_lldb_process_tmp_dir.GetPath().c_str()); 227ff48e4beSGreg Clayton }); 228ff48e4beSGreg Clayton if (success) 22963acdfdeSOleksiy Vyalov result = &g_fields->m_lldb_process_tmp_dir; 230b9c1b51eSKate Stone } break; 231b9c1b51eSKate Stone case lldb::ePathTypeGlobalLLDBTempSystemDir: { 232c5f28e2aSKamil Rytarowski static llvm::once_flag g_once_flag; 23363acdfdeSOleksiy Vyalov static bool success = false; 234c5f28e2aSKamil Rytarowski llvm::call_once(g_once_flag, []() { 235b9c1b51eSKate Stone success = HostInfo::ComputeGlobalTempFileDirectory( 236b9c1b51eSKate Stone g_fields->m_lldb_global_tmp_dir); 23763acdfdeSOleksiy Vyalov Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST); 23863acdfdeSOleksiy Vyalov if (log) 239b9c1b51eSKate Stone log->Printf("HostInfoBase::GetLLDBPath(" 240b9c1b51eSKate Stone "ePathTypeGlobalLLDBTempSystemDir) => '%s'", 241b9c1b51eSKate Stone g_fields->m_lldb_global_tmp_dir.GetPath().c_str()); 24263acdfdeSOleksiy Vyalov }); 24363acdfdeSOleksiy Vyalov if (success) 24463acdfdeSOleksiy Vyalov result = &g_fields->m_lldb_global_tmp_dir; 245b9c1b51eSKate Stone } break; 24642ff0ad8SZachary Turner } 24742ff0ad8SZachary Turner 24842ff0ad8SZachary Turner if (!result) 24942ff0ad8SZachary Turner return false; 25042ff0ad8SZachary Turner file_spec = *result; 25142ff0ad8SZachary Turner return true; 25242ff0ad8SZachary Turner } 25342ff0ad8SZachary Turner 254*7263f1bdSPavel Labath ArchSpec HostInfoBase::GetAugmentedArchSpec(llvm::StringRef triple) { 255*7263f1bdSPavel Labath if (triple.empty()) 256*7263f1bdSPavel Labath return ArchSpec(); 257*7263f1bdSPavel Labath llvm::Triple normalized_triple(llvm::Triple::normalize(triple)); 258*7263f1bdSPavel Labath if (!ArchSpec::ContainsOnlyArch(normalized_triple)) 259*7263f1bdSPavel Labath return ArchSpec(triple); 260*7263f1bdSPavel Labath 261*7263f1bdSPavel Labath llvm::Triple host_triple(llvm::sys::getDefaultTargetTriple()); 262*7263f1bdSPavel Labath 263*7263f1bdSPavel Labath if (normalized_triple.getVendorName().empty()) 264*7263f1bdSPavel Labath normalized_triple.setVendor(host_triple.getVendor()); 265*7263f1bdSPavel Labath if (normalized_triple.getOSName().empty()) 266*7263f1bdSPavel Labath normalized_triple.setOS(host_triple.getOS()); 267*7263f1bdSPavel Labath if (normalized_triple.getEnvironmentName().empty()) 268*7263f1bdSPavel Labath normalized_triple.setEnvironment(host_triple.getEnvironment()); 269*7263f1bdSPavel Labath return ArchSpec(normalized_triple); 270*7263f1bdSPavel Labath } 271*7263f1bdSPavel Labath 272b9c1b51eSKate Stone bool HostInfoBase::ComputeSharedLibraryDirectory(FileSpec &file_spec) { 27342ff0ad8SZachary Turner // To get paths related to LLDB we get the path to the executable that 27442ff0ad8SZachary Turner // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB", 27542ff0ad8SZachary Turner // on linux this is assumed to be the "lldb" main executable. If LLDB on 27642ff0ad8SZachary Turner // linux is actually in a shared library (liblldb.so) then this function will 27742ff0ad8SZachary Turner // need to be modified to "do the right thing". 27842ff0ad8SZachary Turner 27942ff0ad8SZachary Turner FileSpec lldb_file_spec( 280b9c1b51eSKate Stone Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>( 281b9c1b51eSKate Stone reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath)))); 28242ff0ad8SZachary Turner 283b9c1b51eSKate Stone // This is necessary because when running the testsuite the shlib might be a 284b9c1b51eSKate Stone // symbolic link inside the Python resource dir. 2859077e9f8SSean Callanan FileSystem::ResolveSymbolicLink(lldb_file_spec, lldb_file_spec); 286db7d8083SSean Callanan 28742ff0ad8SZachary Turner // Remove the filename so that this FileSpec only represents the directory. 2880d8400c8SGreg Clayton file_spec.GetDirectory() = lldb_file_spec.GetDirectory(); 28942ff0ad8SZachary Turner 29042ff0ad8SZachary Turner return (bool)file_spec.GetDirectory(); 29142ff0ad8SZachary Turner } 29242ff0ad8SZachary Turner 293b9c1b51eSKate Stone bool HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec) { 29442ff0ad8SZachary Turner return GetLLDBPath(lldb::ePathTypeLLDBShlibDir, file_spec); 29542ff0ad8SZachary Turner } 29642ff0ad8SZachary Turner 297b9c1b51eSKate Stone bool HostInfoBase::ComputeProcessTempFileDirectory(FileSpec &file_spec) { 29863acdfdeSOleksiy Vyalov FileSpec temp_file_spec; 299f3a24329STamas Berghammer if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec)) 30063acdfdeSOleksiy Vyalov return false; 30163acdfdeSOleksiy Vyalov 3021eb0d42aSPavel Labath std::string pid_str{llvm::to_string(Host::GetCurrentProcessID())}; 303d3173f34SChaoren Lin temp_file_spec.AppendPathComponent(pid_str); 304d3d95fd6SZachary Turner if (llvm::sys::fs::create_directory(temp_file_spec.GetPath())) 30563acdfdeSOleksiy Vyalov return false; 30663acdfdeSOleksiy Vyalov 307b79863c2SChaoren Lin file_spec.GetDirectory().SetCString(temp_file_spec.GetCString()); 30863acdfdeSOleksiy Vyalov return true; 30963acdfdeSOleksiy Vyalov } 31063acdfdeSOleksiy Vyalov 311b9c1b51eSKate Stone bool HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec) { 31233183147SPavel Labath llvm::SmallVector<char, 16> tmpdir; 31333183147SPavel Labath llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir); 31433183147SPavel Labath file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()), true); 315f3a24329STamas Berghammer return true; 316f3a24329STamas Berghammer } 317f3a24329STamas Berghammer 318b9c1b51eSKate Stone bool HostInfoBase::ComputeGlobalTempFileDirectory(FileSpec &file_spec) { 319f3a24329STamas Berghammer file_spec.Clear(); 320f3a24329STamas Berghammer 321f3a24329STamas Berghammer FileSpec temp_file_spec; 322f3a24329STamas Berghammer if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec)) 323f3a24329STamas Berghammer return false; 324f3a24329STamas Berghammer 325270e99abSZachary Turner temp_file_spec.AppendPathComponent("lldb"); 326d3d95fd6SZachary Turner if (llvm::sys::fs::create_directory(temp_file_spec.GetPath())) 32742ff0ad8SZachary Turner return false; 32842ff0ad8SZachary Turner 329b79863c2SChaoren Lin file_spec.GetDirectory().SetCString(temp_file_spec.GetCString()); 33042ff0ad8SZachary Turner return true; 33142ff0ad8SZachary Turner } 33242ff0ad8SZachary Turner 333b9c1b51eSKate Stone bool HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec) { 334b9c1b51eSKate Stone // TODO(zturner): Figure out how to compute the header directory for all 335b9c1b51eSKate Stone // platforms. 33642ff0ad8SZachary Turner return false; 33742ff0ad8SZachary Turner } 33842ff0ad8SZachary Turner 339b9c1b51eSKate Stone bool HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec) { 340b9c1b51eSKate Stone // TODO(zturner): Figure out how to compute the system plugins directory for 341b9c1b51eSKate Stone // all platforms. 34242ff0ad8SZachary Turner return false; 34342ff0ad8SZachary Turner } 34442ff0ad8SZachary Turner 345b9c1b51eSKate Stone bool HostInfoBase::ComputeClangDirectory(FileSpec &file_spec) { return false; } 346b9c1b51eSKate Stone 347b9c1b51eSKate Stone bool HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec) { 348b9c1b51eSKate Stone // TODO(zturner): Figure out how to compute the user plugins directory for all 349b9c1b51eSKate Stone // platforms. 350b1e1c62fSSean Callanan return false; 351b1e1c62fSSean Callanan } 352b1e1c62fSSean Callanan 353b9c1b51eSKate Stone void HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32, 354b9c1b51eSKate Stone ArchSpec &arch_64) { 355b071bee2SOleksiy Vyalov llvm::Triple triple(llvm::sys::getProcessTriple()); 35613b18261SZachary Turner 35713b18261SZachary Turner arch_32.Clear(); 35813b18261SZachary Turner arch_64.Clear(); 35913b18261SZachary Turner 360b9c1b51eSKate Stone switch (triple.getArch()) { 36113b18261SZachary Turner default: 36213b18261SZachary Turner arch_32.SetTriple(triple); 36313b18261SZachary Turner break; 36413b18261SZachary Turner 365e85e6021STamas Berghammer case llvm::Triple::aarch64: 3662559abdaSJustin Hibbits case llvm::Triple::ppc64: 367f9ee7e4cSJustin Hibbits case llvm::Triple::x86_64: 36813b18261SZachary Turner arch_64.SetTriple(triple); 36913b18261SZachary Turner arch_32.SetTriple(triple.get32BitArchVariant()); 37013b18261SZachary Turner break; 37113b18261SZachary Turner 37213b18261SZachary Turner case llvm::Triple::mips64: 3733df471c3SMohit K. Bhakkad case llvm::Triple::mips64el: 37413b18261SZachary Turner case llvm::Triple::sparcv9: 375bb00d0b6SUlrich Weigand case llvm::Triple::systemz: 37613b18261SZachary Turner arch_64.SetTriple(triple); 37713b18261SZachary Turner break; 37813b18261SZachary Turner } 37913b18261SZachary Turner } 380