| 1 | //===-- StopInfoMachException.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_PROCESS_UTILITY_STOPINFOMACHEXCEPTION_H |
| 10 | #define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_STOPINFOMACHEXCEPTION_H |
| 11 | |
| 12 | #include <optional> |
| 13 | #include <string> |
| 14 | |
| 15 | #include "lldb/Target/StopInfo.h" |
| 16 | |
| 17 | #if defined(__APPLE__) |
| 18 | // Needed for the EXC_* defines |
| 19 | #include <mach/exception.h> |
| 20 | #endif |
| 21 | |
| 22 | namespace lldb_private { |
| 23 | |
| 24 | class StopInfoMachException : public StopInfo { |
| 25 | /// Determine the pointer-authentication related failure that caused this |
| 26 | /// exception. Returns true and fills out the failure description if there |
| 27 | /// is auth-related failure, and returns false otherwise. |
| 28 | bool DeterminePtrauthFailure(ExecutionContext &exe_ctx); |
| 29 | |
| 30 | public: |
| 31 | // Constructors and Destructors |
| 32 | StopInfoMachException(Thread &thread, uint32_t exc_type, |
| 33 | uint32_t exc_data_count, uint64_t exc_code, |
| 34 | uint64_t exc_subcode, |
| 35 | bool not_stepping_but_got_singlestep_exception) |
| 36 | : StopInfo(thread, exc_type), m_exc_data_count(exc_data_count), |
| 37 | m_exc_code(exc_code), m_exc_subcode(exc_subcode), |
| 38 | m_not_stepping_but_got_singlestep_exception( |
| 39 | not_stepping_but_got_singlestep_exception) {} |
| 40 | |
| 41 | ~StopInfoMachException() override = default; |
| 42 | |
| 43 | lldb::StopReason GetStopReason() const override { |
| 44 | return lldb::eStopReasonException; |
| 45 | } |
| 46 | |
| 47 | const char *GetDescription() override; |
| 48 | |
| 49 | #if defined(__APPLE__) |
| 50 | struct MachException { |
| 51 | static const char *Name(exception_type_t exc_type); |
| 52 | static std::optional<exception_type_t> ExceptionCode(const char *name); |
| 53 | }; |
| 54 | #endif |
| 55 | |
| 56 | // Since some mach exceptions will be reported as breakpoints, signals, |
| 57 | // or trace, we use this static accessor which will translate the mach |
| 58 | // exception into the correct StopInfo. |
| 59 | static lldb::StopInfoSP CreateStopReasonWithMachException( |
| 60 | Thread &thread, uint32_t exc_type, uint32_t exc_data_count, |
| 61 | uint64_t exc_code, uint64_t exc_sub_code, uint64_t exc_sub_sub_code, |
| 62 | bool pc_already_adjusted = true, bool adjust_pc_if_needed = false); |
| 63 | |
| 64 | bool WasContinueInterrupted(Thread &thread) override; |
| 65 | |
| 66 | protected: |
| 67 | uint32_t m_exc_data_count; |
| 68 | uint64_t m_exc_code; |
| 69 | uint64_t m_exc_subcode; |
| 70 | |
| 71 | bool m_not_stepping_but_got_singlestep_exception; |
| 72 | }; |
| 73 | |
| 74 | } // namespace lldb_private |
| 75 | |
| 76 | #endif // LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_STOPINFOMACHEXCEPTION_H |
| 77 | |