9#include "lldb/Host/Config.h"
20#include "llvm/ADT/StringExtras.h"
21#include "llvm/Support/Path.h"
22#include "llvm/Support/ScopedPrinter.h"
23#include "llvm/Support/Threading.h"
24#include "llvm/Support/raw_ostream.h"
25#include "llvm/TargetParser/Host.h"
26#include "llvm/TargetParser/Triple.h"
37struct HostInfoBaseFields {
38 ~HostInfoBaseFields() {
43 llvm::sys::fs::remove_directories(m_lldb_process_tmp_dir.GetPath());
47 llvm::once_flag m_host_triple_once;
48 llvm::Triple m_host_triple;
50 llvm::once_flag m_host_arch_once;
54 llvm::once_flag m_lldb_so_dir_once;
56 llvm::once_flag m_lldb_support_exe_dir_once;
58 llvm::once_flag m_lldb_headers_dir_once;
60 llvm::once_flag m_lldb_clang_resource_dir_once;
62 llvm::once_flag m_lldb_system_plugin_dir_once;
64 llvm::once_flag m_lldb_user_plugin_dir_once;
66 llvm::once_flag m_lldb_process_tmp_dir_once;
68 llvm::once_flag m_lldb_global_tmp_dir_once;
88 llvm::call_once(
g_fields->m_host_triple_once, []() {
89 g_fields->m_host_triple = HostInfo::GetArchitecture().GetTriple();
95 llvm::call_once(
g_fields->m_host_arch_once, []() {
96 HostInfo::ComputeHostArchitectureSupport(g_fields->m_host_arch_32,
97 g_fields->m_host_arch_64);
111std::optional<HostInfoBase::ArchitectureKind>
113 return llvm::StringSwitch<std::optional<ArchitectureKind>>(kind)
117 .Default(std::nullopt);
121 llvm::call_once(
g_fields->m_lldb_so_dir_once, []() {
122 if (!HostInfo::ComputeSharedLibraryDirectory(g_fields->m_lldb_so_dir))
123 g_fields->m_lldb_so_dir = FileSpec();
124 Log *log = GetLog(LLDBLog::Host);
125 LLDB_LOG(log,
"shlib dir -> `{0}`", g_fields->m_lldb_so_dir);
131 llvm::call_once(
g_fields->m_lldb_support_exe_dir_once, []() {
132 if (!HostInfo::ComputeSupportExeDirectory(g_fields->m_lldb_support_exe_dir))
133 g_fields->m_lldb_support_exe_dir = FileSpec();
134 Log *log = GetLog(LLDBLog::Host);
135 LLDB_LOG(log,
"support exe dir -> `{0}`", g_fields->m_lldb_support_exe_dir);
137 return g_fields->m_lldb_support_exe_dir;
141 llvm::call_once(
g_fields->m_lldb_headers_dir_once, []() {
142 if (!HostInfo::ComputeHeaderDirectory(g_fields->m_lldb_headers_dir))
143 g_fields->m_lldb_headers_dir = FileSpec();
144 Log *log = GetLog(LLDBLog::Host);
145 LLDB_LOG(log,
"header dir -> `{0}`", g_fields->m_lldb_headers_dir);
147 return g_fields->m_lldb_headers_dir;
151 llvm::call_once(
g_fields->m_lldb_system_plugin_dir_once, []() {
152 if (!HostInfo::ComputeSystemPluginsDirectory(
153 g_fields->m_lldb_system_plugin_dir))
154 g_fields->m_lldb_system_plugin_dir = FileSpec();
155 Log *log = GetLog(LLDBLog::Host);
156 LLDB_LOG(log,
"system plugin dir -> `{0}`",
157 g_fields->m_lldb_system_plugin_dir);
159 return g_fields->m_lldb_system_plugin_dir;
163 llvm::call_once(
g_fields->m_lldb_user_plugin_dir_once, []() {
164 if (!HostInfo::ComputeUserPluginsDirectory(
165 g_fields->m_lldb_user_plugin_dir))
166 g_fields->m_lldb_user_plugin_dir = FileSpec();
167 Log *log = GetLog(LLDBLog::Host);
168 LLDB_LOG(log,
"user plugin dir -> `{0}`", g_fields->m_lldb_user_plugin_dir);
170 return g_fields->m_lldb_user_plugin_dir;
174 llvm::call_once(
g_fields->m_lldb_process_tmp_dir_once, []() {
175 if (!HostInfo::ComputeProcessTempFileDirectory(
176 g_fields->m_lldb_process_tmp_dir))
177 g_fields->m_lldb_process_tmp_dir = FileSpec();
178 Log *log = GetLog(LLDBLog::Host);
179 LLDB_LOG(log,
"process temp dir -> `{0}`",
180 g_fields->m_lldb_process_tmp_dir);
182 return g_fields->m_lldb_process_tmp_dir;
186 llvm::call_once(
g_fields->m_lldb_global_tmp_dir_once, []() {
187 if (!HostInfo::ComputeGlobalTempFileDirectory(
188 g_fields->m_lldb_global_tmp_dir))
189 g_fields->m_lldb_global_tmp_dir = FileSpec();
191 Log *log = GetLog(LLDBLog::Host);
192 LLDB_LOG(log,
"global temp dir -> `{0}`", g_fields->m_lldb_global_tmp_dir);
194 return g_fields->m_lldb_global_tmp_dir;
200 llvm::Triple normalized_triple(llvm::Triple::normalize(triple));
204 if (
auto kind = HostInfo::ParseArchitectureKind(triple))
205 return HostInfo::GetArchitecture(*kind);
207 llvm::Triple host_triple(llvm::sys::getDefaultTargetTriple());
209 if (normalized_triple.getVendorName().empty())
210 normalized_triple.setVendor(host_triple.getVendor());
211 if (normalized_triple.getOSName().empty())
212 normalized_triple.setOS(host_triple.getOS());
213 if (normalized_triple.getEnvironmentName().empty() &&
214 !host_triple.getEnvironmentName().empty())
215 normalized_triple.setEnvironment(host_triple.getEnvironment());
220 llvm::StringRef dir) {
227 std::string raw_path = lldb_file_spec.
GetPath();
230 "Attempting to derive the path {0} relative to liblldb install path: {1}",
234 llvm::StringRef parent_path = llvm::sys::path::parent_path(raw_path);
235 if (parent_path.empty()) {
236 LLDB_LOG(log,
"Failed to find liblldb within the shared lib path");
240 raw_path = (parent_path + dir).str();
241 LLDB_LOG(log,
"Derived the path as: {0}", raw_path);
265 return bool(file_spec);
270 if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec))
275 if (llvm::sys::fs::create_directory(temp_file_spec.
GetPath()))
283 llvm::SmallVector<char, 16> tmpdir;
284 llvm::sys::path::system_temp_directory(
true, tmpdir);
285 file_spec =
FileSpec(std::string(tmpdir.data(), tmpdir.size()));
294 if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec))
298 if (llvm::sys::fs::create_directory(temp_file_spec.
GetPath()))
325 llvm::Triple triple(llvm::sys::getProcessTriple());
330 switch (triple.getArch()) {
335 case llvm::Triple::aarch64:
336 case llvm::Triple::ppc64:
337 case llvm::Triple::ppc64le:
338 case llvm::Triple::x86_64:
339 case llvm::Triple::riscv64:
340 case llvm::Triple::loongarch64:
342 arch_32.
SetTriple(triple.get32BitArchVariant());
345 case llvm::Triple::mips64:
346 case llvm::Triple::mips64el:
347 case llvm::Triple::sparcv9:
348 case llvm::Triple::systemz:
static HostInfoBase::SharedLibraryDirectoryHelper * g_shlib_dir_helper
static HostInfoBaseFields * g_fields
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
constexpr lldb_private::HostInfo::SharedLibraryDirectoryHelper * g_shlib_dir_helper
An architecture specification class.
void Clear()
Clears the object state.
bool SetTriple(const llvm::Triple &triple)
Architecture triple setter.
static bool ContainsOnlyArch(const llvm::Triple &normalized_triple)
Returns true if the OS, vendor and environment fields of the triple are unset.
void AppendPathComponent(llvm::StringRef component)
void SetDirectory(ConstString directory)
Directory string set accessor.
const ConstString & GetDirectory() const
Directory string const get accessor.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
void Clear()
Clears the object state.
ConstString GetPathAsConstString(bool denormalize=true) const
Get the full path as a ConstString.
void Resolve(llvm::SmallVectorImpl< char > &path)
Resolve path to make it canonical.
static FileSystem & Instance()
static FileSpec GetGlobalTempDir()
Returns the global temporary directory.
static void ComputeHostArchitectureSupport(ArchSpec &arch_32, ArchSpec &arch_64)
void(FileSpec &this_file) SharedLibraryDirectoryHelper
A helper function for determining the liblldb location.
static bool ComputeSharedLibraryDirectory(FileSpec &file_spec)
static bool ComputeSupportExeDirectory(FileSpec &file_spec)
static ArchSpec GetAugmentedArchSpec(llvm::StringRef triple)
If the triple does not specify the vendor, os, and environment parts, we "augment" these using inform...
static FileSpec GetHeaderDir()
Returns the directory containing the lldb headers.
static const ArchSpec & GetArchitecture(ArchitectureKind arch_kind=eArchKindDefault)
static std::optional< ArchitectureKind > ParseArchitectureKind(llvm::StringRef kind)
static llvm::Triple GetTargetTriple()
Gets the host target triple.
static bool ComputePathRelativeToLibrary(FileSpec &file_spec, llvm::StringRef dir)
static bool ComputeTempFileBaseDirectory(FileSpec &file_spec)
static FileSpec GetSupportExeDir()
Returns the directory containing the support executables (debugserver, ...).
static bool ComputeUserPluginsDirectory(FileSpec &file_spec)
static FileSpec GetProcessTempDir()
Returns the proces temporary directory.
static bool ComputeHeaderDirectory(FileSpec &file_spec)
static FileSpec GetShlibDir()
Returns the directory containing the lldb shared library.
static FileSpec GetSystemPluginDir()
Returns the directory containing the system plugins.
static bool ComputeGlobalTempFileDirectory(FileSpec &file_spec)
static bool ComputeProcessTempFileDirectory(FileSpec &file_spec)
static FileSpec GetUserPluginDir()
Returns the directory containing the user plugins.
static bool ComputeSystemPluginsDirectory(FileSpec &file_spec)
static void Initialize(SharedLibraryDirectoryHelper *helper=nullptr)
static lldb::pid_t GetCurrentProcessID()
Get the process ID for the calling process.
static FileSpec GetModuleFileSpecForHostAddress(const void *host_addr)
Given an address in the current process (the process that is running the LLDB code),...
#define LLDB_ARCH_DEFAULT_64BIT
#define LLDB_ARCH_DEFAULT
CPU Type definitions.
#define LLDB_ARCH_DEFAULT_32BIT
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.