15ffd83dbSDimitry Andric //===-- HostInfoBase.cpp --------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/Host/Config.h"
100b57cec5SDimitry Andric 
110b57cec5SDimitry Andric #include "lldb/Host/FileSystem.h"
120b57cec5SDimitry Andric #include "lldb/Host/Host.h"
130b57cec5SDimitry Andric #include "lldb/Host/HostInfo.h"
140b57cec5SDimitry Andric #include "lldb/Host/HostInfoBase.h"
150b57cec5SDimitry Andric #include "lldb/Utility/ArchSpec.h"
1681ad6265SDimitry Andric #include "lldb/Utility/LLDBLog.h"
170b57cec5SDimitry Andric #include "lldb/Utility/Log.h"
180b57cec5SDimitry Andric #include "lldb/Utility/StreamString.h"
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric #include "llvm/ADT/StringExtras.h"
210b57cec5SDimitry Andric #include "llvm/Support/Path.h"
220b57cec5SDimitry Andric #include "llvm/Support/ScopedPrinter.h"
230b57cec5SDimitry Andric #include "llvm/Support/Threading.h"
240b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
2506c3fb27SDimitry Andric #include "llvm/TargetParser/Host.h"
2606c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h"
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric #include <mutex>
29bdd1243dSDimitry Andric #include <optional>
300b57cec5SDimitry Andric #include <thread>
310b57cec5SDimitry Andric 
320b57cec5SDimitry Andric using namespace lldb;
330b57cec5SDimitry Andric using namespace lldb_private;
340b57cec5SDimitry Andric 
350b57cec5SDimitry Andric namespace {
36fe6060f1SDimitry Andric /// Contains the state of the HostInfoBase plugin.
370b57cec5SDimitry Andric struct HostInfoBaseFields {
~HostInfoBaseFields__anone8cabf5f0111::HostInfoBaseFields380b57cec5SDimitry Andric   ~HostInfoBaseFields() {
390b57cec5SDimitry Andric     if (FileSystem::Instance().Exists(m_lldb_process_tmp_dir)) {
400b57cec5SDimitry Andric       // Remove the LLDB temporary directory if we have one. Set "recurse" to
410b57cec5SDimitry Andric       // true to all files that were created for the LLDB process can be
420b57cec5SDimitry Andric       // cleaned up.
430b57cec5SDimitry Andric       llvm::sys::fs::remove_directories(m_lldb_process_tmp_dir.GetPath());
440b57cec5SDimitry Andric     }
450b57cec5SDimitry Andric   }
460b57cec5SDimitry Andric 
47480093f4SDimitry Andric   llvm::once_flag m_host_triple_once;
48480093f4SDimitry Andric   llvm::Triple m_host_triple;
490b57cec5SDimitry Andric 
50480093f4SDimitry Andric   llvm::once_flag m_host_arch_once;
510b57cec5SDimitry Andric   ArchSpec m_host_arch_32;
520b57cec5SDimitry Andric   ArchSpec m_host_arch_64;
530b57cec5SDimitry Andric 
54480093f4SDimitry Andric   llvm::once_flag m_lldb_so_dir_once;
550b57cec5SDimitry Andric   FileSpec m_lldb_so_dir;
56480093f4SDimitry Andric   llvm::once_flag m_lldb_support_exe_dir_once;
570b57cec5SDimitry Andric   FileSpec m_lldb_support_exe_dir;
58480093f4SDimitry Andric   llvm::once_flag m_lldb_headers_dir_once;
590b57cec5SDimitry Andric   FileSpec m_lldb_headers_dir;
60480093f4SDimitry Andric   llvm::once_flag m_lldb_clang_resource_dir_once;
610b57cec5SDimitry Andric   FileSpec m_lldb_clang_resource_dir;
62480093f4SDimitry Andric   llvm::once_flag m_lldb_system_plugin_dir_once;
630b57cec5SDimitry Andric   FileSpec m_lldb_system_plugin_dir;
64480093f4SDimitry Andric   llvm::once_flag m_lldb_user_plugin_dir_once;
650b57cec5SDimitry Andric   FileSpec m_lldb_user_plugin_dir;
66480093f4SDimitry Andric   llvm::once_flag m_lldb_process_tmp_dir_once;
670b57cec5SDimitry Andric   FileSpec m_lldb_process_tmp_dir;
68480093f4SDimitry Andric   llvm::once_flag m_lldb_global_tmp_dir_once;
690b57cec5SDimitry Andric   FileSpec m_lldb_global_tmp_dir;
700b57cec5SDimitry Andric };
71fe6060f1SDimitry Andric } // namespace
720b57cec5SDimitry Andric 
73fe6060f1SDimitry Andric static HostInfoBaseFields *g_fields = nullptr;
74fe6060f1SDimitry Andric static HostInfoBase::SharedLibraryDirectoryHelper *g_shlib_dir_helper = nullptr;
75fe6060f1SDimitry Andric 
Initialize(SharedLibraryDirectoryHelper * helper)76fe6060f1SDimitry Andric void HostInfoBase::Initialize(SharedLibraryDirectoryHelper *helper) {
77fe6060f1SDimitry Andric   g_shlib_dir_helper = helper;
78fe6060f1SDimitry Andric   g_fields = new HostInfoBaseFields();
790b57cec5SDimitry Andric }
800b57cec5SDimitry Andric 
Terminate()810b57cec5SDimitry Andric void HostInfoBase::Terminate() {
82fe6060f1SDimitry Andric   g_shlib_dir_helper = nullptr;
830b57cec5SDimitry Andric   delete g_fields;
840b57cec5SDimitry Andric   g_fields = nullptr;
850b57cec5SDimitry Andric }
860b57cec5SDimitry Andric 
GetTargetTriple()87480093f4SDimitry Andric llvm::Triple HostInfoBase::GetTargetTriple() {
88480093f4SDimitry Andric   llvm::call_once(g_fields->m_host_triple_once, []() {
8981ad6265SDimitry Andric     g_fields->m_host_triple = HostInfo::GetArchitecture().GetTriple();
900b57cec5SDimitry Andric   });
910b57cec5SDimitry Andric   return g_fields->m_host_triple;
920b57cec5SDimitry Andric }
930b57cec5SDimitry Andric 
GetArchitecture(ArchitectureKind arch_kind)940b57cec5SDimitry Andric const ArchSpec &HostInfoBase::GetArchitecture(ArchitectureKind arch_kind) {
95480093f4SDimitry Andric   llvm::call_once(g_fields->m_host_arch_once, []() {
960b57cec5SDimitry Andric     HostInfo::ComputeHostArchitectureSupport(g_fields->m_host_arch_32,
970b57cec5SDimitry Andric                                              g_fields->m_host_arch_64);
980b57cec5SDimitry Andric   });
990b57cec5SDimitry Andric 
1000b57cec5SDimitry Andric   // If an explicit 32 or 64-bit architecture was requested, return that.
1010b57cec5SDimitry Andric   if (arch_kind == eArchKind32)
1020b57cec5SDimitry Andric     return g_fields->m_host_arch_32;
1030b57cec5SDimitry Andric   if (arch_kind == eArchKind64)
1040b57cec5SDimitry Andric     return g_fields->m_host_arch_64;
1050b57cec5SDimitry Andric 
1060b57cec5SDimitry Andric   // Otherwise prefer the 64-bit architecture if it is valid.
1070b57cec5SDimitry Andric   return (g_fields->m_host_arch_64.IsValid()) ? g_fields->m_host_arch_64
1080b57cec5SDimitry Andric                                               : g_fields->m_host_arch_32;
1090b57cec5SDimitry Andric }
1100b57cec5SDimitry Andric 
111bdd1243dSDimitry Andric std::optional<HostInfoBase::ArchitectureKind>
ParseArchitectureKind(llvm::StringRef kind)11281ad6265SDimitry Andric HostInfoBase::ParseArchitectureKind(llvm::StringRef kind) {
113bdd1243dSDimitry Andric   return llvm::StringSwitch<std::optional<ArchitectureKind>>(kind)
1140b57cec5SDimitry Andric       .Case(LLDB_ARCH_DEFAULT, eArchKindDefault)
1150b57cec5SDimitry Andric       .Case(LLDB_ARCH_DEFAULT_32BIT, eArchKind32)
1160b57cec5SDimitry Andric       .Case(LLDB_ARCH_DEFAULT_64BIT, eArchKind64)
117bdd1243dSDimitry Andric       .Default(std::nullopt);
1180b57cec5SDimitry Andric }
1190b57cec5SDimitry Andric 
GetShlibDir()1200b57cec5SDimitry Andric FileSpec HostInfoBase::GetShlibDir() {
121480093f4SDimitry Andric   llvm::call_once(g_fields->m_lldb_so_dir_once, []() {
122480093f4SDimitry Andric     if (!HostInfo::ComputeSharedLibraryDirectory(g_fields->m_lldb_so_dir))
123480093f4SDimitry Andric       g_fields->m_lldb_so_dir = FileSpec();
12481ad6265SDimitry Andric     Log *log = GetLog(LLDBLog::Host);
1250b57cec5SDimitry Andric     LLDB_LOG(log, "shlib dir -> `{0}`", g_fields->m_lldb_so_dir);
1260b57cec5SDimitry Andric   });
127480093f4SDimitry Andric   return g_fields->m_lldb_so_dir;
1280b57cec5SDimitry Andric }
1290b57cec5SDimitry Andric 
GetSupportExeDir()1300b57cec5SDimitry Andric FileSpec HostInfoBase::GetSupportExeDir() {
131480093f4SDimitry Andric   llvm::call_once(g_fields->m_lldb_support_exe_dir_once, []() {
132480093f4SDimitry Andric     if (!HostInfo::ComputeSupportExeDirectory(g_fields->m_lldb_support_exe_dir))
133480093f4SDimitry Andric       g_fields->m_lldb_support_exe_dir = FileSpec();
13481ad6265SDimitry Andric     Log *log = GetLog(LLDBLog::Host);
1350b57cec5SDimitry Andric     LLDB_LOG(log, "support exe dir -> `{0}`", g_fields->m_lldb_support_exe_dir);
1360b57cec5SDimitry Andric   });
137480093f4SDimitry Andric   return g_fields->m_lldb_support_exe_dir;
1380b57cec5SDimitry Andric }
1390b57cec5SDimitry Andric 
GetHeaderDir()1400b57cec5SDimitry Andric FileSpec HostInfoBase::GetHeaderDir() {
141480093f4SDimitry Andric   llvm::call_once(g_fields->m_lldb_headers_dir_once, []() {
142480093f4SDimitry Andric     if (!HostInfo::ComputeHeaderDirectory(g_fields->m_lldb_headers_dir))
143480093f4SDimitry Andric       g_fields->m_lldb_headers_dir = FileSpec();
14481ad6265SDimitry Andric     Log *log = GetLog(LLDBLog::Host);
1450b57cec5SDimitry Andric     LLDB_LOG(log, "header dir -> `{0}`", g_fields->m_lldb_headers_dir);
1460b57cec5SDimitry Andric   });
147480093f4SDimitry Andric   return g_fields->m_lldb_headers_dir;
1480b57cec5SDimitry Andric }
1490b57cec5SDimitry Andric 
GetSystemPluginDir()1500b57cec5SDimitry Andric FileSpec HostInfoBase::GetSystemPluginDir() {
151480093f4SDimitry Andric   llvm::call_once(g_fields->m_lldb_system_plugin_dir_once, []() {
15281ad6265SDimitry Andric     if (!HostInfo::ComputeSystemPluginsDirectory(
15381ad6265SDimitry Andric             g_fields->m_lldb_system_plugin_dir))
154480093f4SDimitry Andric       g_fields->m_lldb_system_plugin_dir = FileSpec();
15581ad6265SDimitry Andric     Log *log = GetLog(LLDBLog::Host);
1560b57cec5SDimitry Andric     LLDB_LOG(log, "system plugin dir -> `{0}`",
1570b57cec5SDimitry Andric              g_fields->m_lldb_system_plugin_dir);
1580b57cec5SDimitry Andric   });
159480093f4SDimitry Andric   return g_fields->m_lldb_system_plugin_dir;
1600b57cec5SDimitry Andric }
1610b57cec5SDimitry Andric 
GetUserPluginDir()1620b57cec5SDimitry Andric FileSpec HostInfoBase::GetUserPluginDir() {
163480093f4SDimitry Andric   llvm::call_once(g_fields->m_lldb_user_plugin_dir_once, []() {
16481ad6265SDimitry Andric     if (!HostInfo::ComputeUserPluginsDirectory(
16581ad6265SDimitry Andric             g_fields->m_lldb_user_plugin_dir))
166480093f4SDimitry Andric       g_fields->m_lldb_user_plugin_dir = FileSpec();
16781ad6265SDimitry Andric     Log *log = GetLog(LLDBLog::Host);
1680b57cec5SDimitry Andric     LLDB_LOG(log, "user plugin dir -> `{0}`", g_fields->m_lldb_user_plugin_dir);
1690b57cec5SDimitry Andric   });
170480093f4SDimitry Andric   return g_fields->m_lldb_user_plugin_dir;
1710b57cec5SDimitry Andric }
1720b57cec5SDimitry Andric 
GetProcessTempDir()1730b57cec5SDimitry Andric FileSpec HostInfoBase::GetProcessTempDir() {
174480093f4SDimitry Andric   llvm::call_once(g_fields->m_lldb_process_tmp_dir_once, []() {
17581ad6265SDimitry Andric     if (!HostInfo::ComputeProcessTempFileDirectory(
17681ad6265SDimitry Andric             g_fields->m_lldb_process_tmp_dir))
177480093f4SDimitry Andric       g_fields->m_lldb_process_tmp_dir = FileSpec();
17881ad6265SDimitry Andric     Log *log = GetLog(LLDBLog::Host);
1790b57cec5SDimitry Andric     LLDB_LOG(log, "process temp dir -> `{0}`",
1800b57cec5SDimitry Andric              g_fields->m_lldb_process_tmp_dir);
1810b57cec5SDimitry Andric   });
182480093f4SDimitry Andric   return g_fields->m_lldb_process_tmp_dir;
1830b57cec5SDimitry Andric }
1840b57cec5SDimitry Andric 
GetGlobalTempDir()1850b57cec5SDimitry Andric FileSpec HostInfoBase::GetGlobalTempDir() {
186480093f4SDimitry Andric   llvm::call_once(g_fields->m_lldb_global_tmp_dir_once, []() {
18781ad6265SDimitry Andric     if (!HostInfo::ComputeGlobalTempFileDirectory(
18881ad6265SDimitry Andric             g_fields->m_lldb_global_tmp_dir))
189480093f4SDimitry Andric       g_fields->m_lldb_global_tmp_dir = FileSpec();
190480093f4SDimitry Andric 
19181ad6265SDimitry Andric     Log *log = GetLog(LLDBLog::Host);
1920b57cec5SDimitry Andric     LLDB_LOG(log, "global temp dir -> `{0}`", g_fields->m_lldb_global_tmp_dir);
1930b57cec5SDimitry Andric   });
194480093f4SDimitry Andric   return g_fields->m_lldb_global_tmp_dir;
1950b57cec5SDimitry Andric }
1960b57cec5SDimitry Andric 
GetAugmentedArchSpec(llvm::StringRef triple)1970b57cec5SDimitry Andric ArchSpec HostInfoBase::GetAugmentedArchSpec(llvm::StringRef triple) {
1980b57cec5SDimitry Andric   if (triple.empty())
1990b57cec5SDimitry Andric     return ArchSpec();
2000b57cec5SDimitry Andric   llvm::Triple normalized_triple(llvm::Triple::normalize(triple));
2010b57cec5SDimitry Andric   if (!ArchSpec::ContainsOnlyArch(normalized_triple))
2020b57cec5SDimitry Andric     return ArchSpec(triple);
2030b57cec5SDimitry Andric 
2040b57cec5SDimitry Andric   if (auto kind = HostInfo::ParseArchitectureKind(triple))
2050b57cec5SDimitry Andric     return HostInfo::GetArchitecture(*kind);
2060b57cec5SDimitry Andric 
2070b57cec5SDimitry Andric   llvm::Triple host_triple(llvm::sys::getDefaultTargetTriple());
2080b57cec5SDimitry Andric 
2090b57cec5SDimitry Andric   if (normalized_triple.getVendorName().empty())
2100b57cec5SDimitry Andric     normalized_triple.setVendor(host_triple.getVendor());
2110b57cec5SDimitry Andric   if (normalized_triple.getOSName().empty())
2120b57cec5SDimitry Andric     normalized_triple.setOS(host_triple.getOS());
21381ad6265SDimitry Andric   if (normalized_triple.getEnvironmentName().empty() &&
21481ad6265SDimitry Andric       !host_triple.getEnvironmentName().empty())
2150b57cec5SDimitry Andric     normalized_triple.setEnvironment(host_triple.getEnvironment());
2160b57cec5SDimitry Andric   return ArchSpec(normalized_triple);
2170b57cec5SDimitry Andric }
2180b57cec5SDimitry Andric 
ComputePathRelativeToLibrary(FileSpec & file_spec,llvm::StringRef dir)2190b57cec5SDimitry Andric bool HostInfoBase::ComputePathRelativeToLibrary(FileSpec &file_spec,
2200b57cec5SDimitry Andric                                                 llvm::StringRef dir) {
22181ad6265SDimitry Andric   Log *log = GetLog(LLDBLog::Host);
2220b57cec5SDimitry Andric 
2230b57cec5SDimitry Andric   FileSpec lldb_file_spec = GetShlibDir();
2240b57cec5SDimitry Andric   if (!lldb_file_spec)
2250b57cec5SDimitry Andric     return false;
2260b57cec5SDimitry Andric 
2270b57cec5SDimitry Andric   std::string raw_path = lldb_file_spec.GetPath();
22806c3fb27SDimitry Andric   LLDB_LOG(
22906c3fb27SDimitry Andric       log,
23006c3fb27SDimitry Andric       "Attempting to derive the path {0} relative to liblldb install path: {1}",
23106c3fb27SDimitry Andric       dir, raw_path);
2320b57cec5SDimitry Andric 
2330b57cec5SDimitry Andric   // Drop bin (windows) or lib
2340b57cec5SDimitry Andric   llvm::StringRef parent_path = llvm::sys::path::parent_path(raw_path);
2350b57cec5SDimitry Andric   if (parent_path.empty()) {
23606c3fb27SDimitry Andric     LLDB_LOG(log, "Failed to find liblldb within the shared lib path");
2370b57cec5SDimitry Andric     return false;
2380b57cec5SDimitry Andric   }
2390b57cec5SDimitry Andric 
2400b57cec5SDimitry Andric   raw_path = (parent_path + dir).str();
24106c3fb27SDimitry Andric   LLDB_LOG(log, "Derived the path as: {0}", raw_path);
242bdd1243dSDimitry Andric   file_spec.SetDirectory(raw_path);
2430b57cec5SDimitry Andric   return (bool)file_spec.GetDirectory();
2440b57cec5SDimitry Andric }
2450b57cec5SDimitry Andric 
ComputeSharedLibraryDirectory(FileSpec & file_spec)2460b57cec5SDimitry Andric bool HostInfoBase::ComputeSharedLibraryDirectory(FileSpec &file_spec) {
2470b57cec5SDimitry Andric   // To get paths related to LLDB we get the path to the executable that
2480b57cec5SDimitry Andric   // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB".
2490b57cec5SDimitry Andric   // On other posix systems, we will get .../lib(64|32)?/liblldb.so.
2500b57cec5SDimitry Andric 
2510b57cec5SDimitry Andric   FileSpec lldb_file_spec(Host::GetModuleFileSpecForHostAddress(
25281ad6265SDimitry Andric       reinterpret_cast<void *>(HostInfoBase::ComputeSharedLibraryDirectory)));
2530b57cec5SDimitry Andric 
254fe6060f1SDimitry Andric   if (g_shlib_dir_helper)
255fe6060f1SDimitry Andric     g_shlib_dir_helper(lldb_file_spec);
2560b57cec5SDimitry Andric 
2570b57cec5SDimitry Andric   // Remove the filename so that this FileSpec only represents the directory.
258bdd1243dSDimitry Andric   file_spec.SetDirectory(lldb_file_spec.GetDirectory());
2590b57cec5SDimitry Andric 
2600b57cec5SDimitry Andric   return (bool)file_spec.GetDirectory();
2610b57cec5SDimitry Andric }
2620b57cec5SDimitry Andric 
ComputeSupportExeDirectory(FileSpec & file_spec)2630b57cec5SDimitry Andric bool HostInfoBase::ComputeSupportExeDirectory(FileSpec &file_spec) {
2640b57cec5SDimitry Andric   file_spec = GetShlibDir();
2650b57cec5SDimitry Andric   return bool(file_spec);
2660b57cec5SDimitry Andric }
2670b57cec5SDimitry Andric 
ComputeProcessTempFileDirectory(FileSpec & file_spec)2680b57cec5SDimitry Andric bool HostInfoBase::ComputeProcessTempFileDirectory(FileSpec &file_spec) {
2690b57cec5SDimitry Andric   FileSpec temp_file_spec;
2700b57cec5SDimitry Andric   if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec))
2710b57cec5SDimitry Andric     return false;
2720b57cec5SDimitry Andric 
2730b57cec5SDimitry Andric   std::string pid_str{llvm::to_string(Host::GetCurrentProcessID())};
2740b57cec5SDimitry Andric   temp_file_spec.AppendPathComponent(pid_str);
2750b57cec5SDimitry Andric   if (llvm::sys::fs::create_directory(temp_file_spec.GetPath()))
2760b57cec5SDimitry Andric     return false;
2770b57cec5SDimitry Andric 
278bdd1243dSDimitry Andric   file_spec.SetDirectory(temp_file_spec.GetPathAsConstString());
2790b57cec5SDimitry Andric   return true;
2800b57cec5SDimitry Andric }
2810b57cec5SDimitry Andric 
ComputeTempFileBaseDirectory(FileSpec & file_spec)2820b57cec5SDimitry Andric bool HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec) {
2830b57cec5SDimitry Andric   llvm::SmallVector<char, 16> tmpdir;
2840b57cec5SDimitry Andric   llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir);
2850b57cec5SDimitry Andric   file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()));
2860b57cec5SDimitry Andric   FileSystem::Instance().Resolve(file_spec);
2870b57cec5SDimitry Andric   return true;
2880b57cec5SDimitry Andric }
2890b57cec5SDimitry Andric 
ComputeGlobalTempFileDirectory(FileSpec & file_spec)2900b57cec5SDimitry Andric bool HostInfoBase::ComputeGlobalTempFileDirectory(FileSpec &file_spec) {
2910b57cec5SDimitry Andric   file_spec.Clear();
2920b57cec5SDimitry Andric 
2930b57cec5SDimitry Andric   FileSpec temp_file_spec;
2940b57cec5SDimitry Andric   if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec))
2950b57cec5SDimitry Andric     return false;
2960b57cec5SDimitry Andric 
2970b57cec5SDimitry Andric   temp_file_spec.AppendPathComponent("lldb");
2980b57cec5SDimitry Andric   if (llvm::sys::fs::create_directory(temp_file_spec.GetPath()))
2990b57cec5SDimitry Andric     return false;
3000b57cec5SDimitry Andric 
301bdd1243dSDimitry Andric   file_spec.SetDirectory(temp_file_spec.GetPathAsConstString());
3020b57cec5SDimitry Andric   return true;
3030b57cec5SDimitry Andric }
3040b57cec5SDimitry Andric 
ComputeHeaderDirectory(FileSpec & file_spec)3050b57cec5SDimitry Andric bool HostInfoBase::ComputeHeaderDirectory(FileSpec &file_spec) {
3060b57cec5SDimitry Andric   // TODO(zturner): Figure out how to compute the header directory for all
3070b57cec5SDimitry Andric   // platforms.
3080b57cec5SDimitry Andric   return false;
3090b57cec5SDimitry Andric }
3100b57cec5SDimitry Andric 
ComputeSystemPluginsDirectory(FileSpec & file_spec)3110b57cec5SDimitry Andric bool HostInfoBase::ComputeSystemPluginsDirectory(FileSpec &file_spec) {
3120b57cec5SDimitry Andric   // TODO(zturner): Figure out how to compute the system plugins directory for
3130b57cec5SDimitry Andric   // all platforms.
3140b57cec5SDimitry Andric   return false;
3150b57cec5SDimitry Andric }
3160b57cec5SDimitry Andric 
ComputeUserPluginsDirectory(FileSpec & file_spec)3170b57cec5SDimitry Andric bool HostInfoBase::ComputeUserPluginsDirectory(FileSpec &file_spec) {
3180b57cec5SDimitry Andric   // TODO(zturner): Figure out how to compute the user plugins directory for
3190b57cec5SDimitry Andric   // all platforms.
3200b57cec5SDimitry Andric   return false;
3210b57cec5SDimitry Andric }
3220b57cec5SDimitry Andric 
ComputeHostArchitectureSupport(ArchSpec & arch_32,ArchSpec & arch_64)3230b57cec5SDimitry Andric void HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32,
3240b57cec5SDimitry Andric                                                   ArchSpec &arch_64) {
3250b57cec5SDimitry Andric   llvm::Triple triple(llvm::sys::getProcessTriple());
3260b57cec5SDimitry Andric 
3270b57cec5SDimitry Andric   arch_32.Clear();
3280b57cec5SDimitry Andric   arch_64.Clear();
3290b57cec5SDimitry Andric 
3300b57cec5SDimitry Andric   switch (triple.getArch()) {
3310b57cec5SDimitry Andric   default:
3320b57cec5SDimitry Andric     arch_32.SetTriple(triple);
3330b57cec5SDimitry Andric     break;
3340b57cec5SDimitry Andric 
3350b57cec5SDimitry Andric   case llvm::Triple::aarch64:
3360b57cec5SDimitry Andric   case llvm::Triple::ppc64:
3370b57cec5SDimitry Andric   case llvm::Triple::ppc64le:
3380b57cec5SDimitry Andric   case llvm::Triple::x86_64:
339bdd1243dSDimitry Andric   case llvm::Triple::riscv64:
340bdd1243dSDimitry Andric   case llvm::Triple::loongarch64:
3410b57cec5SDimitry Andric     arch_64.SetTriple(triple);
3420b57cec5SDimitry Andric     arch_32.SetTriple(triple.get32BitArchVariant());
3430b57cec5SDimitry Andric     break;
3440b57cec5SDimitry Andric 
3450b57cec5SDimitry Andric   case llvm::Triple::mips64:
3460b57cec5SDimitry Andric   case llvm::Triple::mips64el:
3470b57cec5SDimitry Andric   case llvm::Triple::sparcv9:
3480b57cec5SDimitry Andric   case llvm::Triple::systemz:
3490b57cec5SDimitry Andric     arch_64.SetTriple(triple);
3500b57cec5SDimitry Andric     break;
3510b57cec5SDimitry Andric   }
3520b57cec5SDimitry Andric }
353