[Lldb-commits] [lldb] 2d1bc9f - [lldb] Recognize MTE faults with EXC_GUARD exception type (#172579)
via lldb-commits
lldb-commits at lists.llvm.org
Fri Dec 19 15:26:55 PST 2025
Author: Julian Lettner
Date: 2025-12-19T15:26:51-08:00
New Revision: 2d1bc9f5a212dc4c8fa14a5741af2a7a5e60ff36
URL: https://github.com/llvm/llvm-project/commit/2d1bc9f5a212dc4c8fa14a5741af2a7a5e60ff36
DIFF: https://github.com/llvm/llvm-project/commit/2d1bc9f5a212dc4c8fa14a5741af2a7a5e60ff36.diff
LOG: [lldb] Recognize MTE faults with EXC_GUARD exception type (#172579)
Recognize the new `EXC_GUARD` mach exception type
for MTE faults. We also keep supporting the old
`EXC_BAD_ACCESS` exception type for backward
compatibility (newer LLDB on older OS).
rdar://166415268
Added:
Modified:
lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp
lldb/source/Plugins/Process/Utility/StopInfoMachException.h
Removed:
################################################################################
diff --git a/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp b/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp
index 601cfdcb4e9f7..d374742b5722c 100644
--- a/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp
+++ b/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp
@@ -77,19 +77,28 @@ static void DescribeAddressBriefly(Stream &strm, const Address &addr,
strm.Printf(".\n");
}
+std::optional<addr_t> StopInfoMachException::GetTagFaultAddress() const {
+ const bool bad_access =
+ (m_value == 1 || m_value == 12); // EXC_BAD_ACCESS or EXC_GUARD
+ const bool tag_fault = (m_exc_code == 0x106); // EXC_ARM_MTE_TAG_FAULT
+ // Whether the subcode (m_exc_subcode) holds the fault address.
+ const bool has_fault_addr = (m_exc_data_count >= 2);
+
+ if (bad_access && tag_fault && has_fault_addr)
+ return m_exc_subcode; // The subcode is the fault address.
+
+ return std::nullopt;
+}
+
static constexpr uint8_t g_mte_tag_shift = 64 - 8;
static constexpr addr_t g_mte_tag_mask = (addr_t)0x0f << g_mte_tag_shift;
-bool StopInfoMachException::DetermineTagMismatch(ExecutionContext &exe_ctx) {
- const bool IsBadAccess = m_value == 1; // EXC_BAD_ACCESS
- const bool IsMTETagFault = (m_exc_code == 0x106); // EXC_ARM_MTE_TAG_FAULT
- if (!IsBadAccess || !IsMTETagFault)
- return false;
-
- if (m_exc_data_count < 2)
+bool StopInfoMachException::DetermineTagMismatch() {
+ std::optional<addr_t> fault_address = GetTagFaultAddress();
+ if (!fault_address)
return false;
- const uint64_t bad_address = m_exc_subcode;
+ const uint64_t bad_address = *fault_address;
StreamString strm;
strm.Printf("EXC_ARM_MTE_TAG_FAULT (code=%" PRIu64 ", address=0x%" PRIx64
@@ -295,7 +304,7 @@ const char *StopInfoMachException::GetDescription() {
case llvm::Triple::aarch64:
if (DeterminePtrauthFailure(exe_ctx))
return m_description.c_str();
- if (DetermineTagMismatch(exe_ctx))
+ if (DetermineTagMismatch())
return m_description.c_str();
break;
@@ -490,6 +499,8 @@ const char *StopInfoMachException::GetDescription() {
#endif
break;
case 12:
+ if (DetermineTagMismatch())
+ return m_description.c_str();
exc_desc = "EXC_GUARD";
break;
}
diff --git a/lldb/source/Plugins/Process/Utility/StopInfoMachException.h b/lldb/source/Plugins/Process/Utility/StopInfoMachException.h
index c02389e5b3642..26f93e0bb348f 100644
--- a/lldb/source/Plugins/Process/Utility/StopInfoMachException.h
+++ b/lldb/source/Plugins/Process/Utility/StopInfoMachException.h
@@ -27,7 +27,7 @@ class StopInfoMachException : public StopInfo {
/// is auth-related failure, and returns false otherwise.
bool DeterminePtrauthFailure(ExecutionContext &exe_ctx);
- bool DetermineTagMismatch(ExecutionContext &exe_ctx);
+ bool DetermineTagMismatch();
public:
// Constructors and Destructors
@@ -48,6 +48,9 @@ class StopInfoMachException : public StopInfo {
const char *GetDescription() override;
+ // Returns the fault address, iff this is a EXC_ARM_MTE_TAG_FAULT.
+ std::optional<lldb::addr_t> GetTagFaultAddress() const;
+
#if defined(__APPLE__)
struct MachException {
static const char *Name(exception_type_t exc_type);
More information about the lldb-commits
mailing list