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/Core/FileSpecList.h" 14 #include "lldb/Host/FileSystem.h" 15 #include "lldb/Host/ProcessLaunchInfo.h" 16 #include "lldb/Utility/ArchSpec.h" 17 #include "lldb/Utility/ConstString.h" 18 #include "lldb/Utility/FileSpec.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/ADT/Triple.h" 27 #include "llvm/Support/Error.h" 28 #include "llvm/Support/VersionTuple.h" 29 30 #include <mutex> 31 #include <optional> 32 #include <string> 33 #include <vector> 34 35 namespace lldb_private { 36 class BreakpointSite; 37 class Debugger; 38 class Module; 39 class ModuleSpec; 40 class Process; 41 class ProcessLaunchInfo; 42 class Stream; 43 class Target; 44 45 class PlatformDarwin : public PlatformPOSIX { 46 public: 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 GetPluginNameStatic()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 SupportsModules()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 /// Return the toolchain directory the current LLDB instance is located in. 121 static FileSpec GetCurrentToolchainDirectory(); 122 123 /// Return the command line tools directory the current LLDB instance is 124 /// located in. 125 static FileSpec GetCurrentCommandLineToolsDirectory(); 126 127 protected: 128 static const char *GetCompatibleArch(ArchSpec::Core core, size_t idx); 129 130 struct CrashInfoAnnotations { 131 uint64_t version; // unsigned long 132 uint64_t message; // char * 133 uint64_t signature_string; // char * 134 uint64_t backtrace; // char * 135 uint64_t message2; // char * 136 uint64_t thread; // uint64_t 137 uint64_t dialog_mode; // unsigned int 138 uint64_t abort_cause; // unsigned int 139 }; 140 141 /// Extract the `__crash_info` annotations from each of of the target's 142 /// modules. 143 /// 144 /// If the platform have a crashed processes with a `__crash_info` section, 145 /// extract the section to gather the messages annotations and the abort 146 /// cause. 147 /// 148 /// \param[in] process 149 /// The crashed process. 150 /// 151 /// \return 152 /// A structured data array containing at each entry in each entry, the 153 /// module spec, its UUID, the crash messages and the abort cause. 154 /// \b nullptr if process has no crash information annotations. 155 StructuredData::ArraySP ExtractCrashInfoAnnotations(Process &process); 156 157 /// Extract the `Application Specific Information` messages from a crash 158 /// report. 159 StructuredData::DictionarySP ExtractAppSpecificInfo(Process &process); 160 161 void ReadLibdispatchOffsetsAddress(Process *process); 162 163 void ReadLibdispatchOffsets(Process *process); 164 CheckLocalSharedCache()165 virtual bool CheckLocalSharedCache() const { return IsHost(); } 166 167 struct SDKEnumeratorInfo { 168 FileSpec found_path; 169 XcodeSDK::Type sdk_type; 170 }; 171 172 static FileSystem::EnumerateDirectoryResult 173 DirectoryEnumerator(void *baton, llvm::sys::fs::file_type file_type, 174 llvm::StringRef path); 175 176 static FileSpec FindSDKInXcodeForModules(XcodeSDK::Type sdk_type, 177 const FileSpec &sdks_spec); 178 179 static FileSpec GetSDKDirectoryForModules(XcodeSDK::Type sdk_type); 180 181 void 182 AddClangModuleCompilationOptionsForSDKType(Target *target, 183 std::vector<std::string> &options, 184 XcodeSDK::Type sdk_type); 185 186 Status FindBundleBinaryInExecSearchPaths( 187 const ModuleSpec &module_spec, Process *process, 188 lldb::ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr, 189 llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr); 190 191 static std::string FindComponentInPath(llvm::StringRef path, 192 llvm::StringRef component); 193 194 // The OSType where lldb is running. 195 static llvm::Triple::OSType GetHostOSType(); 196 197 std::string m_developer_directory; 198 llvm::StringMap<std::string> m_sdk_path; 199 std::mutex m_sdk_path_mutex; 200 201 private: 202 PlatformDarwin(const PlatformDarwin &) = delete; 203 const PlatformDarwin &operator=(const PlatformDarwin &) = delete; 204 }; 205 206 } // namespace lldb_private 207 208 #endif // LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMDARWIN_H 209