1//===-- PlatformDarwin.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_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMDARWIN_H
10#define LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMDARWIN_H
11
12#include "Plugins/Platform/POSIX/PlatformPOSIX.h"
13#include "lldb/Host/FileSystem.h"
14#include "lldb/Host/ProcessLaunchInfo.h"
15#include "lldb/Utility/ArchSpec.h"
16#include "lldb/Utility/ConstString.h"
17#include "lldb/Utility/FileSpec.h"
18#include "lldb/Utility/FileSpecList.h"
19#include "lldb/Utility/Status.h"
20#include "lldb/Utility/StructuredData.h"
21#include "lldb/Utility/XcodeSDK.h"
22#include "lldb/lldb-forward.h"
23#include "llvm/ADT/SmallVector.h"
24#include "llvm/ADT/StringMap.h"
25#include "llvm/ADT/StringRef.h"
26#include "llvm/Support/Error.h"
27#include "llvm/Support/VersionTuple.h"
28#include "llvm/TargetParser/Triple.h"
29
30#include <mutex>
31#include <optional>
32#include <string>
33#include <vector>
34
35namespace lldb_private {
36class BreakpointSite;
37class Debugger;
38class Module;
39class ModuleSpec;
40class Process;
41class ProcessLaunchInfo;
42class Stream;
43class Target;
44
45class PlatformDarwin : public PlatformPOSIX {
46public:
47 using PlatformPOSIX::PlatformPOSIX;
48
49 ~PlatformDarwin() override;
50
51 static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch);
52
53 static void DebuggerInitialize(lldb_private::Debugger &debugger);
54
55 static void Initialize();
56
57 static void Terminate();
58
59 static llvm::StringRef GetPluginNameStatic() { return "darwin"; }
60
61 static llvm::StringRef GetDescriptionStatic();
62
63 Status PutFile(const FileSpec &source, const FileSpec &destination,
64 uint32_t uid = UINT32_MAX, uint32_t gid = UINT32_MAX) override;
65
66 // Platform functions
67 Status ResolveSymbolFile(Target &target, const ModuleSpec &sym_spec,
68 FileSpec &sym_file) override;
69
70 FileSpecList
71 LocateExecutableScriptingResources(Target *target, Module &module,
72 Stream &feedback_stream) override;
73
74 Status GetSharedModule(const ModuleSpec &module_spec, Process *process,
75 lldb::ModuleSP &module_sp,
76 const FileSpecList *module_search_paths_ptr,
77 llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules,
78 bool *did_create_ptr) override;
79
80 size_t GetSoftwareBreakpointTrapOpcode(Target &target,
81 BreakpointSite *bp_site) override;
82
83 lldb::BreakpointSP SetThreadCreationBreakpoint(Target &target) override;
84
85 bool ModuleIsExcludedForUnconstrainedSearches(
86 Target &target, const lldb::ModuleSP &module_sp) override;
87
88 void
89 ARMGetSupportedArchitectures(std::vector<ArchSpec> &archs,
90 std::optional<llvm::Triple::OSType> os = {});
91
92 void x86GetSupportedArchitectures(std::vector<ArchSpec> &archs);
93
94 uint32_t GetResumeCountForLaunchInfo(ProcessLaunchInfo &launch_info) override;
95
96 lldb::ProcessSP DebugProcess(ProcessLaunchInfo &launch_info,
97 Debugger &debugger, Target &target,
98 Status &error) override;
99
100 void CalculateTrapHandlerSymbolNames() override;
101
102 llvm::VersionTuple GetOSVersion(Process *process = nullptr) override;
103
104 bool SupportsModules() override { return true; }
105
106 ConstString GetFullNameForDylib(ConstString basename) override;
107
108 FileSpec LocateExecutable(const char *basename) override;
109
110 Status LaunchProcess(ProcessLaunchInfo &launch_info) override;
111
112 Args GetExtraStartupCommands() override;
113
114 static std::tuple<llvm::VersionTuple, llvm::StringRef>
115 ParseVersionBuildDir(llvm::StringRef str);
116
117 llvm::Expected<StructuredData::DictionarySP>
118 FetchExtendedCrashInformation(Process &process) override;
119
120 llvm::Expected<std::pair<XcodeSDK, bool>>
121 GetSDKPathFromDebugInfo(Module &module) override;
122
123 llvm::Expected<std::string>
124 ResolveSDKPathFromDebugInfo(Module &module) override;
125
126 llvm::Expected<XcodeSDK> GetSDKPathFromDebugInfo(CompileUnit &unit) override;
127
128 llvm::Expected<std::string>
129 ResolveSDKPathFromDebugInfo(CompileUnit &unit) override;
130
131protected:
132 static const char *GetCompatibleArch(ArchSpec::Core core, size_t idx);
133
134 struct CrashInfoAnnotations {
135 uint64_t version; // unsigned long
136 uint64_t message; // char *
137 uint64_t signature_string; // char *
138 uint64_t backtrace; // char *
139 uint64_t message2; // char *
140 uint64_t thread; // uint64_t
141 uint64_t dialog_mode; // unsigned int
142 uint64_t abort_cause; // unsigned int
143 };
144
145 /// Extract the `__crash_info` annotations from each of the target's
146 /// modules.
147 ///
148 /// If the platform have a crashed processes with a `__crash_info` section,
149 /// extract the section to gather the messages annotations and the abort
150 /// cause.
151 ///
152 /// \param[in] process
153 /// The crashed process.
154 ///
155 /// \return
156 /// A structured data array containing at each entry in each entry, the
157 /// module spec, its UUID, the crash messages and the abort cause.
158 /// \b nullptr if process has no crash information annotations.
159 StructuredData::ArraySP ExtractCrashInfoAnnotations(Process &process);
160
161 /// Extract the `Application Specific Information` messages from a crash
162 /// report.
163 StructuredData::DictionarySP ExtractAppSpecificInfo(Process &process);
164
165 void ReadLibdispatchOffsetsAddress(Process *process);
166
167 void ReadLibdispatchOffsets(Process *process);
168
169 virtual bool CheckLocalSharedCache() const { return IsHost(); }
170
171 struct SDKEnumeratorInfo {
172 FileSpec found_path;
173 XcodeSDK::Type sdk_type;
174 };
175
176 static FileSystem::EnumerateDirectoryResult
177 DirectoryEnumerator(void *baton, llvm::sys::fs::file_type file_type,
178 llvm::StringRef path);
179
180 static FileSpec FindSDKInXcodeForModules(XcodeSDK::Type sdk_type,
181 const FileSpec &sdks_spec);
182
183 static FileSpec GetSDKDirectoryForModules(XcodeSDK::Type sdk_type);
184
185 void
186 AddClangModuleCompilationOptionsForSDKType(Target *target,
187 std::vector<std::string> &options,
188 XcodeSDK::Type sdk_type);
189
190 Status FindBundleBinaryInExecSearchPaths(
191 const ModuleSpec &module_spec, Process *process,
192 lldb::ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr,
193 llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr);
194
195 // The OSType where lldb is running.
196 static llvm::Triple::OSType GetHostOSType();
197
198 std::string m_developer_directory;
199 llvm::StringMap<std::string> m_sdk_path;
200 std::mutex m_sdk_path_mutex;
201
202private:
203 PlatformDarwin(const PlatformDarwin &) = delete;
204 const PlatformDarwin &operator=(const PlatformDarwin &) = delete;
205};
206
207} // namespace lldb_private
208
209#endif // LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMDARWIN_H
210

Provided by KDAB

Privacy Policy
Improve your Profiling and Debugging skills
Find out more

source code of lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h