Author: jimingham
Date: 2026-07-01T10:59:44-07:00
New Revision: a201ae3addcef5580c1228c9b7c7538cfac690a3

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

LOG: Handle the case where the ISA we find when looking up a method 
implementation has masked bits (#206864)

We need to canonicalize these since we look them up, and the PointerISA
is the right thing to use since it actually points at the class.

I can't write a test for this because ObjC mostly uses the masks for
swift/objc interop. I will add a test on the swift fork.

Added: 
    

Modified: 
    
lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h
    
lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
    lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h

Removed: 
    


################################################################################
diff  --git 
a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h
 
b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h
index 0580d49920c47..78e8c1167828d 100644
--- 
a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h
+++ 
b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h
@@ -418,7 +418,7 @@ class AppleObjCRuntimeV2 : public AppleObjCRuntime {
 
   AppleObjCRuntimeV2(Process *process, const lldb::ModuleSP &objc_module_sp);
 
-  ObjCISA GetPointerISA(ObjCISA isa);
+  ObjCISA GetPointerISA(ObjCISA isa) override;
 
   lldb::addr_t GetISAHashTablePointer();
 

diff  --git 
a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
 
b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
index 0de03894fdfea..9e0ebf2090b62 100644
--- 
a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
+++ 
b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
@@ -977,6 +977,10 @@ 
AppleObjCTrampolineHandler::GetStepThroughDispatchPlan(Thread &thread,
       ObjCLanguageRuntime *objc_runtime =
           ObjCLanguageRuntime::Get(*thread.GetProcess());
       assert(objc_runtime != nullptr);
+      // We have the address in the ISA pointer of our object, but it might
+      // be a masked value, so we need to get the Pointer ISA:
+      isa_addr = objc_runtime->GetPointerISA(isa_addr);
+
       LLDB_LOG(log, "Resolving call for class - {0} and selector - {1}",
                isa_addr, sel_addr);
       impl_addr = objc_runtime->LookupInMethodCache(isa_addr, sel_addr);

diff  --git a/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h 
b/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h
index 4e8210c23e0d4..4552fe341ed99 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h
@@ -307,6 +307,8 @@ class ObjCLanguageRuntime : public LanguageRuntime {
 
   virtual ObjCISA GetParentClass(ObjCISA isa);
 
+  virtual ObjCISA GetPointerISA(ObjCISA isa) { return isa; };
+
   // Finds the byte offset of the child_type ivar in parent_type.  If it can't
   // find the offset, returns LLDB_INVALID_IVAR_OFFSET.
 


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

Reply via email to