Author: Jonas Devlieghere
Date: 2026-03-21T00:50:16Z
New Revision: b9d276748ecaf748e0bab32ed82834644ed6827a

URL: 
https://github.com/llvm/llvm-project/commit/b9d276748ecaf748e0bab32ed82834644ed6827a
DIFF: 
https://github.com/llvm/llvm-project/commit/b9d276748ecaf748e0bab32ed82834644ed6827a.diff

LOG: [lldb] Support arm64e Objective-C signing in the expression evaluator 
(#187765)

When targeting arm64e, ISA pointers, class_ro_t pointers, and interface
selectors are signed in Objective-C. This PR adds support for that in
the expression evaluator.

Added: 
    lldb/test/API/commands/expression/ptrauth-objc/Makefile
    lldb/test/API/commands/expression/ptrauth-objc/TestPtrAuthObjectiveC.py
    lldb/test/API/commands/expression/ptrauth-objc/main.m

Modified: 
    lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp

Removed: 
    


################################################################################
diff  --git 
a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp 
b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp
index f46cb32865f3b..38e5298f9cc93 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp
@@ -731,6 +731,9 @@ static void SetPointerAuthOptionsForArm64e(LangOptions 
&lang_opts) {
   lang_opts.PointerAuthReturns = true;
   lang_opts.PointerAuthAuthTraps = true;
   lang_opts.PointerAuthIndirectGotos = true;
+  lang_opts.PointerAuthObjcIsa = true;
+  lang_opts.PointerAuthObjcClassROPointers = true;
+  lang_opts.PointerAuthObjcInterfaceSel = true;
 }
 
 ClangExpressionParser::ClangExpressionParser(

diff  --git a/lldb/test/API/commands/expression/ptrauth-objc/Makefile 
b/lldb/test/API/commands/expression/ptrauth-objc/Makefile
new file mode 100644
index 0000000000000..496df2948ac1b
--- /dev/null
+++ b/lldb/test/API/commands/expression/ptrauth-objc/Makefile
@@ -0,0 +1,10 @@
+OBJC_SOURCES := main.m
+
+override ARCH := arm64e
+
+# We need an arm64e stdlib.
+USE_SYSTEM_STDLIB := 1
+
+LD_EXTRAS := -framework Foundation
+
+include Makefile.rules

diff  --git 
a/lldb/test/API/commands/expression/ptrauth-objc/TestPtrAuthObjectiveC.py 
b/lldb/test/API/commands/expression/ptrauth-objc/TestPtrAuthObjectiveC.py
new file mode 100644
index 0000000000000..0f4b50d126d51
--- /dev/null
+++ b/lldb/test/API/commands/expression/ptrauth-objc/TestPtrAuthObjectiveC.py
@@ -0,0 +1,91 @@
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestPtrAuthObjectiveC(TestBase):
+    NO_DEBUG_INFO_TESTCASE = True
+
+    @skipUnlessArm64eSupported
+    def test_objc_message_send(self):
+        self.build()
+
+        lldbutil.run_to_source_breakpoint(
+            self, "// break here", lldb.SBFileSpec("main.m", False)
+        )
+
+        self.expect_expr(
+            "[obj doubleValue]",
+            result_type="int",
+            result_value="42",
+        )
+
+    @skipUnlessArm64eSupported
+    def test_objc_message_send_with_arg(self):
+        self.build()
+
+        lldbutil.run_to_source_breakpoint(
+            self, "// break here", lldb.SBFileSpec("main.m", False)
+        )
+
+        self.expect_expr(
+            "[obj addValue:9]",
+            result_type="int",
+            result_value="30",
+        )
+
+    @skipUnlessArm64eSupported
+    def test_objc_alloc_and_message(self):
+        self.build()
+
+        lldbutil.run_to_source_breakpoint(
+            self, "// break here", lldb.SBFileSpec("main.m", False)
+        )
+
+        self.expect_expr(
+            "PtrAuthTestObj *tmp = (PtrAuthTestObj *)[[PtrAuthTestObj alloc] 
init]; "
+            "tmp.value = 7; [tmp doubleValue]",
+            result_type="int",
+            result_value="14",
+        )
+
+    @skipUnlessArm64eSupported
+    def test_objc_derived_class(self):
+        self.build()
+
+        lldbutil.run_to_source_breakpoint(
+            self, "// break here", lldb.SBFileSpec("main.m", False)
+        )
+
+        self.expect_expr(
+            "[derived tripleValue]",
+            result_type="int",
+            result_value="30",
+        )
+
+        self.expect_expr(
+            "[derived doubleValue]",
+            result_type="int",
+            result_value="20",
+        )
+
+    @skipUnlessArm64eSupported
+    def test_objc_isa_check(self):
+        self.build()
+
+        lldbutil.run_to_source_breakpoint(
+            self, "// break here", lldb.SBFileSpec("main.m", False)
+        )
+
+        self.expect_expr(
+            "(bool)[derived isKindOfClass:[PtrAuthTestObj class]]",
+            result_type="bool",
+            result_value="true",
+        )
+
+        self.expect_expr(
+            "(bool)[obj isKindOfClass:[PtrAuthDerived class]]",
+            result_type="bool",
+            result_value="false",
+        )

diff  --git a/lldb/test/API/commands/expression/ptrauth-objc/main.m 
b/lldb/test/API/commands/expression/ptrauth-objc/main.m
new file mode 100644
index 0000000000000..8088fd2fef7d9
--- /dev/null
+++ b/lldb/test/API/commands/expression/ptrauth-objc/main.m
@@ -0,0 +1,39 @@
+#import <Foundation/Foundation.h>
+#include <stdio.h>
+
+@interface PtrAuthTestObj : NSObject
+@property(nonatomic, assign) int value;
+- (int)doubleValue;
+- (int)addValue:(int)other;
+@end
+
+@implementation PtrAuthTestObj
+- (int)doubleValue {
+  return self.value * 2;
+}
+- (int)addValue:(int)other {
+  return self.value + other;
+}
+@end
+
+@interface PtrAuthDerived : PtrAuthTestObj
+- (int)tripleValue;
+@end
+
+@implementation PtrAuthDerived
+- (int)tripleValue {
+  return self.value * 3;
+}
+@end
+
+int main(int argc, const char *argv[]) {
+  PtrAuthTestObj *obj = [[PtrAuthTestObj alloc] init];
+  obj.value = 21;
+
+  PtrAuthDerived *derived = [[PtrAuthDerived alloc] init];
+  derived.value = 10;
+
+  int result = [obj doubleValue]; // break here
+  printf("%d %d\n", result, [derived tripleValue]);
+  return 0;
+}


        
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to