Author: jingham Date: Thu Jun 19 13:25:51 2014 New Revision: 211289 URL: http://llvm.org/viewvc/llvm-project?rev=211289&view=rev Log: Switch over to using object_getClass to get the class of an object. Previously we were directly accessing the isa pointer of a class object to get its meta-class, but the isa pointers are not simple pointers on arm64, so this would cause the stepping to fail. object_getClass does whatever magic needs doing in this case.
<rdar://problem/17239690>
Modified:
lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
Modified:
lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
URL:
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp?rev=211289&r1=211288&r2=211289&view=diff
==============================================================================
---
lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
(original)
+++
lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
Thu Jun 19 13:25:51 2014
@@ -50,6 +50,7 @@ extern \"C\"
{
\n\
extern void *class_getMethodImplementation(void *objc_class, void *sel);
\n\
extern void *class_getMethodImplementation_stret(void *objc_class, void
*sel); \n\
+ extern void * object_getClass (id object);
\n\
extern void * sel_getUid(char *name);
\n\
extern int printf(const char *format, ...);
\n\
}
\n\
@@ -101,20 +102,25 @@ extern \"C\" void * __lldb_objc_find_imp
}
\n\
else
\n\
{
\n\
+ // This code seems a little funny, but has its reasons...
\n\
+ // The call to [object class] is here because if this is a class, and
has not been called into \n\
+ // yet, we need to do something to force the class to initialize
itself. \n\
+ // Then the call to object_getClass will actually return the correct
class, either the class \n\
+ // if object is a class instance, or the meta-class if it is a class
pointer. \n\
void *class_ptr = (void *) [(id) object class];
\n\
- if (class_ptr == object)
\n\
+ return_struct.class_addr = (id) object_getClass((id) object);
\n\
+ if (debug)
\n\
{
\n\
- struct __lldb_objc_class *class_as_class_struct = (struct
__lldb_objc_class *) class_ptr; \n\
- if (debug)
\n\
- printf (\"Found a class object, need to return the meta class
0x%p -> 0x%p\\n\", \n\
- class_ptr, class_as_class_struct->isa);
\n\
- return_struct.class_addr = class_as_class_struct->isa;
\n\
- }
\n\
- else
\n\
- {
\n\
- if (debug)
\n\
- printf (\"[object class] returned: 0x%p.\\n\", class_ptr);
\n\
- return_struct.class_addr = class_ptr;
\n\
+ if (class_ptr == object)
\n\
+ {
\n\
+ printf (\"Found a class object, need to use the meta class %p
-> %p\\n\", \n\
+ class_ptr, return_struct.class_addr);
\n\
+ }
\n\
+ else
\n\
+ {
\n\
+ printf (\"[object class] returned: %p object_getClass:
%p.\\n\", \n\
+ class_ptr, return_struct.class_addr);
\n\
+ }
\n\
}
\n\
}
\n\
\n\
@@ -129,7 +135,7 @@ extern \"C\" void * __lldb_objc_find_imp
char *sel_name = (char *) ((__lldb_msg_ref *) sel)->sel;
\n\
return_struct.sel_addr = sel_getUid (sel_name);
\n\
if (debug)
\n\
- printf (\"\\n*** Got fixed up selector: 0x%p for name
%s.\\n\", \n\
+ printf (\"\\n*** Got fixed up selector: %p for name %s.\\n\",
\n\
return_struct.sel_addr, sel_name);
\n\
}
\n\
}
\n\
@@ -149,7 +155,7 @@ extern \"C\" void * __lldb_objc_find_imp
return_struct.sel_addr); \n\
}
\n\
if (debug)
\n\
- printf (\"\\n*** Returning implementation: 0x%p.\\n\",
return_struct.impl_addr); \n\
+ printf (\"\\n*** Returning implementation: %p.\\n\",
return_struct.impl_addr); \n\
\n\
return return_struct.impl_addr;
\n\
}
\n\
@@ -158,6 +164,7 @@ const char *AppleObjCTrampolineHandler::
extern \"C\"
\n\
{
\n\
extern void *class_getMethodImplementation(void *objc_class, void *sel);
\n\
+ extern void * object_getClass (id object);
\n\
extern void * sel_getUid(char *name);
\n\
extern int printf(const char *format, ...);
\n\
}
\n\
@@ -209,20 +216,25 @@ extern \"C\" void * __lldb_objc_find_imp
}
\n\
else
\n\
{
\n\
+ // This code seems a little funny, but has its reasons...
\n\
+ // The call to [object class] is here because if this is a class, and
has not been called into \n\
+ // yet, we need to do something to force the class to initialize
itself. \n\
+ // Then the call to object_getClass will actually return the correct
class, either the class \n\
+ // if object is a class instance, or the meta-class if it is a class
pointer. \n\
void *class_ptr = (void *) [(id) object class];
\n\
- if (class_ptr == object)
\n\
+ return_struct.class_addr = (id) object_getClass((id) object);
\n\
+ if (debug)
\n\
{
\n\
- struct __lldb_objc_class *class_as_class_struct = (struct
__lldb_objc_class *) class_ptr; \n\
- if (debug)
\n\
- printf (\"Found a class object, need to return the meta class
0x%p -> 0x%p\\n\", \n\
- class_ptr, class_as_class_struct->isa);
\n\
- return_struct.class_addr = class_as_class_struct->isa;
\n\
- }
\n\
- else
\n\
- {
\n\
- if (debug)
\n\
- printf (\"[object class] returned: 0x%p.\\n\", class_ptr);
\n\
- return_struct.class_addr = class_ptr;
\n\
+ if (class_ptr == object)
\n\
+ {
\n\
+ printf (\"Found a class object, need to return the meta class
%p -> %p\\n\", \n\
+ class_ptr, return_struct.class_addr);
\n\
+ }
\n\
+ else
\n\
+ {
\n\
+ printf (\"[object class] returned: %p object_getClass:
%p.\\n\", \n\
+ class_ptr, return_struct.class_addr);
\n\
+ }
\n\
}
\n\
}
\n\
\n\
@@ -237,7 +249,7 @@ extern \"C\" void * __lldb_objc_find_imp
char *sel_name = (char *) ((__lldb_msg_ref *) sel)->sel;
\n\
return_struct.sel_addr = sel_getUid (sel_name);
\n\
if (debug)
\n\
- printf (\"\\n*** Got fixed up selector: 0x%p for name
%s.\\n\", \n\
+ printf (\"\\n*** Got fixed up selector: %p for name %s.\\n\",
\n\
return_struct.sel_addr, sel_name);
\n\
}
\n\
}
\n\
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
