LLDB  mainline
PlatformDarwinKernel.h
Go to the documentation of this file.
1 //===-- PlatformDarwinKernel.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_PLATFORMDARWINKERNEL_H
10 #define LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMDARWINKERNEL_H
11 
12 #include "PlatformDarwin.h"
13 #include "lldb/Host/FileSystem.h"
15 #include "lldb/Utility/FileSpec.h"
16 #include "lldb/Utility/Status.h"
17 #include "lldb/Utility/UUID.h"
18 #include "lldb/lldb-forward.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/ADT/StringRef.h"
22 #include "llvm/Support/FileSystem.h"
23 
24 #include <vector>
25 
26 namespace lldb_private {
27 class ArchSpec;
28 class Debugger;
29 class FileSpecList;
30 class ModuleSpec;
31 class Process;
32 class Stream;
33 
34 #if defined(__APPLE__) // This Plugin uses the Mac-specific
35  // source/Host/macosx/cfcpp utilities
36 
37 class PlatformDarwinKernel : public PlatformDarwin {
38 public:
39  static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch);
40 
41  static void DebuggerInitialize(Debugger &debugger);
42 
43  static void Initialize();
44 
45  static void Terminate();
46 
47  static llvm::StringRef GetPluginNameStatic() { return "darwin-kernel"; }
48 
49  static llvm::StringRef GetDescriptionStatic();
50 
51  PlatformDarwinKernel(LazyBool is_ios_debug_session);
52 
53  ~PlatformDarwinKernel() override;
54 
55  llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
56 
57  llvm::StringRef GetDescription() override { return GetDescriptionStatic(); }
58 
59  void GetStatus(Stream &strm) override;
60 
61  Status GetSharedModule(const ModuleSpec &module_spec, Process *process,
62  lldb::ModuleSP &module_sp,
63  const FileSpecList *module_search_paths_ptr,
65  bool *did_create_ptr) override;
66 
67  std::vector<ArchSpec>
68  GetSupportedArchitectures(const ArchSpec &process_host_arch) override;
69 
70  bool SupportsModules() override { return false; }
71 
72  void CalculateTrapHandlerSymbolNames() override;
73 
74 protected:
75  // Map from kext bundle ID ("com.apple.filesystems.exfat") to FileSpec for
76  // the kext bundle on the host
77  // ("/System/Library/Extensions/exfat.kext/Contents/Info.plist").
78  typedef std::multimap<ConstString, FileSpec> BundleIDToKextMap;
79  typedef BundleIDToKextMap::iterator BundleIDToKextIterator;
80 
81  typedef std::vector<FileSpec> KernelBinaryCollection;
82 
83  // Array of directories that were searched for kext bundles (used only for
84  // reporting to user).
85  typedef std::vector<FileSpec> DirectoriesSearchedCollection;
86  typedef DirectoriesSearchedCollection::iterator DirectoriesSearchedIterator;
87 
88  // Populate m_search_directories and m_search_directories_no_recursing
89  // vectors of directories.
90  void CollectKextAndKernelDirectories();
91 
92  void GetUserSpecifiedDirectoriesToSearch();
93 
94  static void AddRootSubdirsToSearchPaths(PlatformDarwinKernel *thisp,
95  const std::string &dir);
96 
97  void AddSDKSubdirsToSearchPaths(const std::string &dir);
98 
100  FindKDKandSDKDirectoriesInDirectory(void *baton, llvm::sys::fs::file_type ft,
101  llvm::StringRef path);
102 
103  void SearchForKextsAndKernelsRecursively();
104 
106  GetKernelsAndKextsInDirectoryWithRecursion(void *baton,
107  llvm::sys::fs::file_type ft,
108  llvm::StringRef path);
109 
111  GetKernelsAndKextsInDirectoryNoRecursion(void *baton,
112  llvm::sys::fs::file_type ft,
113  llvm::StringRef path);
114 
116  GetKernelsAndKextsInDirectoryHelper(void *baton, llvm::sys::fs::file_type ft,
117  llvm::StringRef path, bool recurse);
118 
119  static std::vector<FileSpec>
120  SearchForExecutablesRecursively(const std::string &dir);
121 
122  static void AddKextToMap(PlatformDarwinKernel *thisp,
123  const FileSpec &file_spec);
124 
125  // Returns true if there is a .dSYM bundle next to the kext, or next to the
126  // binary inside the kext.
127  static bool KextHasdSYMSibling(const FileSpec &kext_bundle_filepath);
128 
129  // Returns true if there is a .dSYM bundle next to the kernel
130  static bool KernelHasdSYMSibling(const FileSpec &kernel_filepath);
131 
132  // Returns true if there is a .dSYM bundle with NO kernel binary next to it
133  static bool
134  KerneldSYMHasNoSiblingBinary(const FileSpec &kernel_dsym_filepath);
135 
136  // Given a dsym_bundle argument ('.../foo.dSYM'), return a FileSpec
137  // with the binary inside it ('.../foo.dSYM/Contents/Resources/DWARF/foo').
138  // A dSYM bundle may have multiple DWARF binaries in them, so a vector
139  // of matches is returned.
140  static std::vector<FileSpec> GetDWARFBinaryInDSYMBundle(FileSpec dsym_bundle);
141 
142  Status GetSharedModuleKext(const ModuleSpec &module_spec, Process *process,
143  lldb::ModuleSP &module_sp,
144  const FileSpecList *module_search_paths_ptr,
146  bool *did_create_ptr);
147 
148  Status GetSharedModuleKernel(
149  const ModuleSpec &module_spec, Process *process,
150  lldb::ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr,
151  llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr);
152 
153  Status ExamineKextForMatchingUUID(const FileSpec &kext_bundle_path,
154  const UUID &uuid, const ArchSpec &arch,
155  lldb::ModuleSP &exe_module_sp);
156 
157  bool LoadPlatformBinaryAndSetup(Process *process, lldb::addr_t addr,
158  bool notify) override;
159 
160  // Most of the ivars are assembled under FileSystem::EnumerateDirectory calls
161  // where the function being called for each file/directory must be static.
162  // We'll pass a this pointer as a baton and access the ivars directly.
163  // Toss-up whether this should just be a struct at this point.
164 
165 public:
166  /// Multimap of CFBundleID to FileSpec on local filesystem, kexts with dSYMs
167  /// next to them.
168  BundleIDToKextMap m_name_to_kext_path_map_with_dsyms;
169 
170  /// Multimap of CFBundleID to FileSpec on local filesystem, kexts without
171  /// dSYMs next to them.
172  BundleIDToKextMap m_name_to_kext_path_map_without_dsyms;
173 
174  /// List of directories we search for kexts/kernels.
175  DirectoriesSearchedCollection m_search_directories;
176 
177  /// List of directories we search for kexts/kernels, no recursion.
178  DirectoriesSearchedCollection m_search_directories_no_recursing;
179 
180  /// List of kernel binaries we found on local filesystem, without dSYMs next
181  /// to them.
182  KernelBinaryCollection m_kernel_binaries_with_dsyms;
183 
184  /// List of kernel binaries we found on local filesystem, with dSYMs next to
185  /// them.
186  KernelBinaryCollection m_kernel_binaries_without_dsyms;
187 
188  /// List of kernel dsyms with no binaries next to them.
189  KernelBinaryCollection m_kernel_dsyms_no_binaries;
190 
191  /// List of kernel .dSYM.yaa files.
192  KernelBinaryCollection m_kernel_dsyms_yaas;
193 
194  LazyBool m_ios_debug_session;
195 
196  PlatformDarwinKernel(const PlatformDarwinKernel &) = delete;
197  const PlatformDarwinKernel &operator=(const PlatformDarwinKernel &) = delete;
198 };
199 
200 #else // __APPLE__
201 
202 // Since DynamicLoaderDarwinKernel is compiled in for all systems, and relies
203 // on PlatformDarwinKernel for the plug-in name, we compile just the plug-in
204 // name in here to avoid issues. We are tracking an internal bug to resolve
205 // this issue by either not compiling in DynamicLoaderDarwinKernel for
206 // non-apple builds, or to make PlatformDarwinKernel build on all systems.
207 //
208 // PlatformDarwinKernel is currently not compiled on other platforms due to the
209 // use of the Mac-specific source/Host/macosx/cfcpp utilities.
210 
212 public:
213  static llvm::StringRef GetPluginNameStatic() { return "darwin-kernel"; }
214 };
215 
216 #endif // __APPLE__
217 
218 } // namespace lldb_private
219 
220 #endif // LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMDARWINKERNEL_H
FileSystem.h
UUID.h
lldb::addr_t
uint64_t addr_t
Definition: lldb-types.h:83
lldb_private::LazyBool
LazyBool
Definition: lldb-private-enumerations.h:115
lldb-private-enumerations.h
lldb_private::PlatformDarwinKernel::GetPluginNameStatic
static llvm::StringRef GetPluginNameStatic()
Definition: PlatformDarwinKernel.h:213
lldb_private::LLDBLog::Process
@ Process
lldb_private::FileSystem::EnumerateDirectoryResult
EnumerateDirectoryResult
Definition: FileSystem.h:166
string
string(SUBSTRING ${p} 10 -1 pStripped) if($
Definition: Plugins/CMakeLists.txt:40
lldb_private::PlatformDarwinKernel
Definition: PlatformDarwinKernel.h:211
lldb-forward.h
Status.h
lldb_private
A class that represents a running process on the host machine.
Definition: SBCommandInterpreterRunOptions.h:16
FileSpec.h
ConstString.h
llvm::SmallVectorImpl
Definition: Disassembler.h:42
lldb_private::LineStatus::Status
@ Status
PlatformDarwin.h