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 lldb-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits