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