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;
90 llvm::call_once(
g_fields->m_host_triple_once, []() {
91 g_fields->m_host_triple = HostInfo::GetArchitecture().GetTriple();
97 llvm::call_once(
g_fields->m_host_arch_once, []() {
98 HostInfo::ComputeHostArchitectureSupport(g_fields->m_host_arch_32,
99 g_fields->m_host_arch_64);
113std::optional<HostInfoBase::ArchitectureKind>
115 return llvm::StringSwitch<std::optional<ArchitectureKind>>(kind)
119 .Default(std::nullopt);
123 llvm::call_once(
g_fields->m_lldb_so_dir_once, []() {
124 if (!HostInfo::ComputeSharedLibraryDirectory(g_fields->m_lldb_so_dir))
125 g_fields->m_lldb_so_dir = FileSpec();
126 Log *log = GetLog(LLDBLog::Host);
127 LLDB_LOG(log,
"shlib dir -> `{0}`", g_fields->m_lldb_so_dir);
133 llvm::call_once(
g_fields->m_lldb_support_exe_dir_once, []() {
134 if (!HostInfo::ComputeSupportExeDirectory(g_fields->m_lldb_support_exe_dir))
135 g_fields->m_lldb_support_exe_dir = FileSpec();
136 Log *log = GetLog(LLDBLog::Host);
137 LLDB_LOG(log,
"support exe dir -> `{0}`", g_fields->m_lldb_support_exe_dir);
139 return g_fields->m_lldb_support_exe_dir;
143 llvm::call_once(
g_fields->m_lldb_headers_dir_once, []() {
144 if (!HostInfo::ComputeHeaderDirectory(g_fields->m_lldb_headers_dir))
145 g_fields->m_lldb_headers_dir = FileSpec();
146 Log *log = GetLog(LLDBLog::Host);
147 LLDB_LOG(log,
"header dir -> `{0}`", g_fields->m_lldb_headers_dir);
149 return g_fields->m_lldb_headers_dir;
153 llvm::call_once(
g_fields->m_lldb_system_plugin_dir_once, []() {
154 if (!HostInfo::ComputeSystemPluginsDirectory(
155 g_fields->m_lldb_system_plugin_dir))
156 g_fields->m_lldb_system_plugin_dir = FileSpec();
157 Log *log = GetLog(LLDBLog::Host);
158 LLDB_LOG(log,
"system plugin dir -> `{0}`",
159 g_fields->m_lldb_system_plugin_dir);
161 return g_fields->m_lldb_system_plugin_dir;
165 llvm::call_once(
g_fields->m_lldb_user_plugin_dir_once, []() {
166 if (!HostInfo::ComputeUserPluginsDirectory(
167 g_fields->m_lldb_user_plugin_dir))
168 g_fields->m_lldb_user_plugin_dir = FileSpec();
169 Log *log = GetLog(LLDBLog::Host);
170 LLDB_LOG(log,
"user plugin dir -> `{0}`", g_fields->m_lldb_user_plugin_dir);
172 return g_fields->m_lldb_user_plugin_dir;
176 llvm::call_once(
g_fields->m_lldb_process_tmp_dir_once, []() {
177 if (!HostInfo::ComputeProcessTempFileDirectory(
178 g_fields->m_lldb_process_tmp_dir))
179 g_fields->m_lldb_process_tmp_dir = FileSpec();
180 Log *log = GetLog(LLDBLog::Host);
181 LLDB_LOG(log,
"process temp dir -> `{0}`",
182 g_fields->m_lldb_process_tmp_dir);
184 return g_fields->m_lldb_process_tmp_dir;
188 llvm::call_once(
g_fields->m_lldb_global_tmp_dir_once, []() {
189 if (!HostInfo::ComputeGlobalTempFileDirectory(
190 g_fields->m_lldb_global_tmp_dir))
191 g_fields->m_lldb_global_tmp_dir = FileSpec();
193 Log *log = GetLog(LLDBLog::Host);
194 LLDB_LOG(log,
"global temp dir -> `{0}`", g_fields->m_lldb_global_tmp_dir);
196 return g_fields->m_lldb_global_tmp_dir;
202 llvm::Triple normalized_triple(llvm::Triple::normalize(triple));
206 if (
auto kind = HostInfo::ParseArchitectureKind(triple))
207 return HostInfo::GetArchitecture(*kind);
209 llvm::Triple host_triple(llvm::sys::getDefaultTargetTriple());
211 if (normalized_triple.getVendorName().empty())
212 normalized_triple.setVendor(host_triple.getVendor());
213 if (normalized_triple.getOSName().empty())
214 normalized_triple.setOS(host_triple.getOS());
215 if (normalized_triple.getEnvironmentName().empty() &&
216 !host_triple.getEnvironmentName().empty())
217 normalized_triple.setEnvironment(host_triple.getEnvironment());
222 llvm::StringRef dir) {
229 std::string raw_path = lldb_file_spec.
GetPath();
232 "Attempting to derive the path {0} relative to liblldb install path: {1}",
236 llvm::StringRef parent_path = llvm::sys::path::parent_path(raw_path);
237 if (parent_path.empty()) {
238 LLDB_LOG(log,
"Failed to find liblldb within the shared lib path");
242 raw_path = (parent_path + dir).str();
243 LLDB_LOG(log,
"Derived the path as: {0}", raw_path);
267 return bool(file_spec);
272 if (!HostInfo::ComputeGlobalTempFileDirectory(temp_file_spec))
277 if (llvm::sys::fs::create_directory(temp_file_spec.
GetPath()))
285 llvm::SmallVector<char, 16> tmpdir;
286 llvm::sys::path::system_temp_directory(
true, tmpdir);
287 file_spec =
FileSpec(std::string(tmpdir.data(), tmpdir.size()));
296 if (!HostInfo::ComputeTempFileBaseDirectory(temp_file_spec))
300 if (llvm::sys::fs::create_directory(temp_file_spec.
GetPath()))
327 llvm::Triple triple(llvm::sys::getProcessTriple());
332 switch (triple.getArch()) {
337 case llvm::Triple::aarch64:
338 case llvm::Triple::ppc64:
339 case llvm::Triple::ppc64le:
340 case llvm::Triple::x86_64:
341 case llvm::Triple::riscv64:
342 case llvm::Triple::loongarch64:
344 arch_32.
SetTriple(triple.get32BitArchVariant());
347 case llvm::Triple::mips64:
348 case llvm::Triple::mips64el:
349 case llvm::Triple::sparcv9:
350 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.