1//===-- HostInfoBase.h ------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_HOST_HOSTINFOBASE_H
10#define LLDB_HOST_HOSTINFOBASE_H
11
12#include "lldb/Utility/ArchSpec.h"
13#include "lldb/Utility/FileSpec.h"
14#include "lldb/Utility/UUID.h"
15#include "lldb/Utility/UserIDResolver.h"
16#include "lldb/Utility/XcodeSDK.h"
17#include "lldb/lldb-enumerations.h"
18#include "llvm/ADT/StringRef.h"
19
20#include <stdint.h>
21
22#include <string>
23
24namespace lldb_private {
25
26class FileSpec;
27
28struct SharedCacheImageInfo {
29 UUID uuid;
30 lldb::DataBufferSP data_sp;
31};
32
33class HostInfoBase {
34private:
35 // Static class, unconstructable.
36 HostInfoBase() {}
37 ~HostInfoBase() {}
38
39public:
40 /// A helper function for determining the liblldb location. It receives a
41 /// FileSpec with the location of file containing _this_ code. It can
42 /// (optionally) replace it with a file spec pointing to a more canonical
43 /// copy.
44 using SharedLibraryDirectoryHelper = void(FileSpec &this_file);
45
46 static void Initialize(SharedLibraryDirectoryHelper *helper = nullptr);
47 static void Terminate();
48
49 /// Gets the host target triple.
50 ///
51 /// \return
52 /// The host target triple.
53 static llvm::Triple GetTargetTriple();
54
55 enum ArchitectureKind {
56 eArchKindDefault, // The overall default architecture that applications will
57 // run on this host
58 eArchKind32, // If this host supports 32 bit programs, return the default 32
59 // bit arch
60 eArchKind64 // If this host supports 64 bit programs, return the default 64
61 // bit arch
62 };
63
64 static const ArchSpec &
65 GetArchitecture(ArchitectureKind arch_kind = eArchKindDefault);
66
67 static llvm::Optional<ArchitectureKind> ParseArchitectureKind(llvm::StringRef kind);
68
69 /// Returns the directory containing the lldb shared library. Only the
70 /// directory member of the FileSpec is filled in.
71 static FileSpec GetShlibDir();
72
73 /// Returns the directory containing the support executables (debugserver,
74 /// ...). Only the directory member of the FileSpec is filled in.
75 static FileSpec GetSupportExeDir();
76
77 /// Returns the directory containing the lldb headers. Only the directory
78 /// member of the FileSpec is filled in.
79 static FileSpec GetHeaderDir();
80
81 /// Returns the directory containing the system plugins. Only the directory
82 /// member of the FileSpec is filled in.
83 static FileSpec GetSystemPluginDir();
84
85 /// Returns the directory containing the user plugins. Only the directory
86 /// member of the FileSpec is filled in.
87 static FileSpec GetUserPluginDir();
88
89 /// Returns the proces temporary directory. This directory will be cleaned up
90 /// when this process exits. Only the directory member of the FileSpec is
91 /// filled in.
92 static FileSpec GetProcessTempDir();
93
94 /// Returns the global temporary directory. This directory will **not** be
95 /// cleaned up when this process exits. Only the directory member of the
96 /// FileSpec is filled in.
97 static FileSpec GetGlobalTempDir();
98
99 /// If the triple does not specify the vendor, os, and environment parts, we
100 /// "augment" these using information from the host and return the resulting
101 /// ArchSpec object.
102 static ArchSpec GetAugmentedArchSpec(llvm::StringRef triple);
103
104 static bool ComputePathRelativeToLibrary(FileSpec &file_spec,
105 llvm::StringRef dir);
106
107 static FileSpec GetXcodeContentsDirectory() { return {}; }
108 static FileSpec GetXcodeDeveloperDirectory() { return {}; }
109
110 /// Return the directory containing a specific Xcode SDK.
111 static llvm::StringRef GetXcodeSDKPath(XcodeSDK sdk) { return {}; }
112
113 /// Return information about module \p image_name if it is loaded in
114 /// the current process's address space.
115 static SharedCacheImageInfo
116 GetSharedCacheImageInfo(llvm::StringRef image_name) {
117 return {};
118 }
119
120protected:
121 static bool ComputeSharedLibraryDirectory(FileSpec &file_spec);
122 static bool ComputeSupportExeDirectory(FileSpec &file_spec);
123 static bool ComputeProcessTempFileDirectory(FileSpec &file_spec);
124 static bool ComputeGlobalTempFileDirectory(FileSpec &file_spec);
125 static bool ComputeTempFileBaseDirectory(FileSpec &file_spec);
126 static bool ComputeHeaderDirectory(FileSpec &file_spec);
127 static bool ComputeSystemPluginsDirectory(FileSpec &file_spec);
128 static bool ComputeUserPluginsDirectory(FileSpec &file_spec);
129
130 static void ComputeHostArchitectureSupport(ArchSpec &arch_32,
131 ArchSpec &arch_64);
132};
133}
134
135#endif
136