[Lldb-commits] [lldb] r175106 - A lot more cleanup on the AppleObjCRuntimeV2 class.

Greg Clayton gclayton at apple.com
Wed Feb 13 15:22:26 PST 2013


Author: gclayton
Date: Wed Feb 13 17:22:26 2013
New Revision: 175106

URL: http://llvm.org/viewvc/llvm-project?rev=175106&view=rev
Log:
A lot more cleanup on the AppleObjCRuntimeV2 class.


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

Modified: lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp?rev=175106&r1=175105&r2=175106&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp (original)
+++ lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp Wed Feb 13 17:22:26 2013
@@ -18,20 +18,16 @@
 #include "lldb/Core/ClangForward.h"
 #include "lldb/Symbol/ClangASTType.h"
 
-#include "lldb/Breakpoint/BreakpointLocation.h"
 #include "lldb/Core/ClangForward.h"
 #include "lldb/Core/ConstString.h"
-#include "lldb/Core/DataBufferMemoryMap.h"
 #include "lldb/Core/Error.h"
 #include "lldb/Core/Log.h"
-#include "lldb/Core/MappedHash.h"
 #include "lldb/Core/Module.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/Scalar.h"
 #include "lldb/Core/Section.h"
 #include "lldb/Core/StreamString.h"
 #include "lldb/Core/Timer.h"
-#include "lldb/Core/ValueObjectConstResult.h"
 #include "lldb/Expression/ClangFunction.h"
 #include "lldb/Expression/ClangUtilityFunction.h"
 #include "lldb/Symbol/ClangASTContext.h"
@@ -60,110 +56,6 @@ static const char *pluginShort = "langua
 // 2 second timeout when running utility functions
 #define UTILITY_FUNCTION_TIMEOUT_USEC 2*1000*1000
 
-static const char *g_find_class_name_function_name = "__lldb_apple_objc_v2_find_class_name";
-static const char *g_find_class_name_function_body = "                                            \n\
-extern \"C\"                                                                                      \n\
-{                                                                                                 \n\
-    extern void *gdb_class_getClass (void *objc_class);                                           \n\
-    extern void *class_getName(void *objc_class);                                                 \n\
-    extern int printf(const char *format, ...);                                                   \n\
-    extern unsigned char class_isMetaClass (void *objc_class);                                    \n\
-}                                                                                                 \n\
-                                                                                                  \n\
-struct __lldb_objc_object {                                                                       \n\
-    void *isa;                                                                                    \n\
-};                                                                                                \n\
-                                                                                                  \n\
-extern \"C\" void *__lldb_apple_objc_v2_find_class_name (__lldb_objc_object *object_ptr,          \n\
-                                                         int debug)                               \n\
-{                                                                                                 \n\
-    void *name = 0;                                                                               \n\
-    if (debug)                                                                                    \n\
-        printf (\"\\n*** Called in v2_find_class_name with object: 0x%p\\n\", object_ptr);        \n\
-    // Call gdb_class_getClass so we can tell if the class is good.                               \n\
-    void *objc_class = gdb_class_getClass (object_ptr->isa);                                      \n\
-    if (objc_class)                                                                               \n\
-    {                                                                                             \n\
-        void *actual_class = (void *) [(id) object_ptr class];                                    \n\
-        if (actual_class != 0)                                                                    \n\
-        {                                                                                         \n\
-            if (class_isMetaClass(actual_class) == 1)                                             \n\
-            {                                                                                     \n\
-                if (debug)                                                                        \n\
-                    printf (\"\\n*** Found metaclass.\\n\");                                      \n\
-            }                                                                                     \n\
-            else                                                                                  \n\
-            {                                                                                     \n\
-                name = class_getName((void *) actual_class);                                      \n\
-            }                                                                                     \n\
-        }                                                                                         \n\
-        if (debug)                                                                                \n\
-            printf (\"\\n*** Found name: %s\\n\", name ? name : \"<NOT FOUND>\");                 \n\
-    }                                                                                             \n\
-    else if (debug)                                                                               \n\
-        printf (\"\\n*** gdb_class_getClass returned NULL\\n\");                                  \n\
-    return name;                                                                                  \n\
-}                                                                                                 \n\
-";
-
-static const char *g_summarize_classes_function_name = "__lldb_apple_objc_v2_summarize_classes";
-static const char *g_summarize_classes_function_body = "                                            \n\
-                                                                                                    \n\
-#define NULL (0)                                                                                    \n\
-                                                                                                    \n\
-extern \"C\"                                                                                        \n\
-{                                                                                                   \n\
-    extern void *memset (void *b, int c, size_t len);                                               \n\
-    extern char *strncpy (char * s1, const char * s2, size_t n);                                    \n\
-                                                                                                    \n\
-    int objc_getClassList(void **buffer, int bufferLen);                                            \n\
-    const char *class_getName(void *cls);                                                           \n\
-    int printf(const char * format, ...);                                                           \n\
-}                                                                                                   \n\
-                                                                                                    \n\
-// This must be kept in sync with the caller in UpdateISAToDescriptorMapIfNeeded()!                 \n\
-// To get the number of classes, set num_isas_assumed to 0.                                         \n\
-                                                                                                    \n\
-// #define DEBUG                                                                                    \n\
-                                                                                                    \n\
-extern \"C\" uint32_t __lldb_apple_objc_v2_summarize_classes (                                      \n\
-    void              **isas,                                                                       \n\
-    char               *names,                                                                      \n\
-    uint32_t            num_isas_assumed,                                                           \n\
-    uint32_t            name_size)                                                                  \n\
-{                                                                                                   \n\
-#ifdef DEBUG                                                                                        \n\
-    printf(\"__lldb_apple_objc_v2_summarize_classes(%p, %p, 0x%lx, 0x%lx)\\n\",                     \n\
-           isas, names, num_isas_assumed, name_size);                                               \n\
-#endif                                                                                              \n\
-                                                                                                    \n\
-    if (num_isas_assumed == 0)                                                                      \n\
-        return objc_getClassList (NULL, 0);                                                         \n\
-                                                                                                    \n\
-    memset (isas, 0, num_isas_assumed * sizeof(void*));                                             \n\
-    memset (names, 0, num_isas_assumed * name_size);                                                \n\
-                                                                                                    \n\
-    int num_isas = objc_getClassList (isas, num_isas_assumed);                                      \n\
-                                                                                                    \n\
-    if (num_isas_assumed > num_isas)                                                                \n\
-        num_isas_assumed = num_isas;                                                                \n\
-                                                                                                    \n\
-    int isa_index;                                                                                  \n\
-                                                                                                    \n\
-    for (isa_index = 0; isa_index < num_isas_assumed; ++isa_index)                                  \n\
-    {                                                                                               \n\
-        const char *isa_name = class_getName (isas[isa_index]);                                     \n\
-#ifdef DEBUG                                                                                        \n\
-        printf(\"%p -- %s\\n\", isas[isa_index], isa_name);                                         \n\
-#endif                                                                                              \n\
-        if (isa_name)                                                                               \n\
-            strncpy (names + (name_size * isa_index), isa_name, name_size);                         \n\
-    }                                                                                               \n\
-                                                                                                    \n\
-    return num_isas;                                                                                \n\
-}                                                                                                   \n\
-";
-
 static const char *g_get_dynamic_class_info_name = "__lldb_apple_objc_v2_get_dynamic_class_info";
 // Testing using the new C++11 raw string literals. If this breaks GCC then we will
 // need to revert to the code above...
@@ -399,14 +291,6 @@ __lldb_apple_objc_v2_get_shared_cache_cl
 AppleObjCRuntimeV2::AppleObjCRuntimeV2 (Process *process,
                                         const ModuleSP &objc_module_sp) :
     AppleObjCRuntime (process),
-    m_get_class_name_function (),
-    m_get_class_name_code (),
-    m_get_class_name_args (LLDB_INVALID_ADDRESS),
-    m_get_class_name_args_mutex (Mutex::eMutexTypeNormal),
-    m_isas_allocation (LLDB_INVALID_ADDRESS),
-    m_names_allocation (LLDB_INVALID_ADDRESS),
-    m_summarize_classes_args (LLDB_INVALID_ADDRESS),
-    m_summarize_classes_args_mutex (Mutex::eMutexTypeNormal),
     m_get_class_info_function(),
     m_get_class_info_code(),
     m_get_class_info_args (LLDB_INVALID_ADDRESS),
@@ -426,139 +310,6 @@ AppleObjCRuntimeV2::AppleObjCRuntimeV2 (
 }
 
 bool
-AppleObjCRuntimeV2::RunFunctionToFindClassName(addr_t object_addr, Thread *thread, char *name_dst, size_t max_name_len)
-{
-    // Since we are going to run code we have to make sure only one thread at a time gets to try this.
-    Mutex::Locker locker(m_get_class_name_args_mutex);
-    
-    StreamString errors;
-    
-    LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));  // FIXME - a more appropriate log channel?
-    
-    int32_t debug;
-    if (log && log->GetVerbose())
-        debug = 1;
-    else
-        debug = 0;
-
-    ValueList dispatch_values;
-    
-    Value void_ptr_value;
-    ClangASTContext *clang_ast_context = m_process->GetTarget().GetScratchClangASTContext();
-    
-    clang_type_t clang_void_ptr_type = clang_ast_context->GetVoidPtrType(false);
-    void_ptr_value.SetValueType (Value::eValueTypeScalar);
-    void_ptr_value.SetContext (Value::eContextTypeClangType, clang_void_ptr_type);
-    void_ptr_value.GetScalar() = object_addr;
-        
-    dispatch_values.PushValue (void_ptr_value);
-    
-    Value int_value;
-    clang_type_t clang_int_type = clang_ast_context->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 32);
-    int_value.SetValueType (Value::eValueTypeScalar);
-    int_value.SetContext (Value::eContextTypeClangType, clang_int_type);
-    int_value.GetScalar() = debug;
-    
-    dispatch_values.PushValue (int_value);
-    
-    ExecutionContext exe_ctx;
-    thread->CalculateExecutionContext(exe_ctx);
-    
-    Address find_class_name_address;
-    
-    if (!m_get_class_name_code.get())
-    {
-        m_get_class_name_code.reset (new ClangUtilityFunction (g_find_class_name_function_body,
-                                                               g_find_class_name_function_name));
-                                                               
-        if (!m_get_class_name_code->Install(errors, exe_ctx))
-        {
-            if (log)
-                log->Printf ("Failed to install implementation lookup: %s.", errors.GetData());
-            m_get_class_name_code.reset();
-            return false;
-        }
-        find_class_name_address.Clear();
-        find_class_name_address.SetOffset(m_get_class_name_code->StartAddress());
-    }
-    else
-    {
-        find_class_name_address.Clear();
-        find_class_name_address.SetOffset(m_get_class_name_code->StartAddress());
-    }
-
-    // Next make the runner function for our implementation utility function.
-    if (!m_get_class_name_function.get())
-    {
-         m_get_class_name_function.reset(new ClangFunction (*m_process,
-                                                  clang_ast_context, 
-                                                  clang_void_ptr_type, 
-                                                  find_class_name_address, 
-                                                  dispatch_values));
-        
-        errors.Clear();        
-        unsigned num_errors = m_get_class_name_function->CompileFunction(errors);
-        if (num_errors)
-        {
-            if (log)
-                log->Printf ("Error compiling function: \"%s\".", errors.GetData());
-            return false;
-        }
-        
-        errors.Clear();
-        if (!m_get_class_name_function->WriteFunctionWrapper(exe_ctx, errors))
-        {
-            if (log)
-                log->Printf ("Error Inserting function: \"%s\".", errors.GetData());
-            return false;
-        }
-    }
-
-    if (m_get_class_name_code.get() == NULL || m_get_class_name_function.get() == NULL)
-        return false;
-
-    // Finally, write down the arguments, and call the function.  Note that we will re-use the same space in the target
-    // for the args.  We're locking this to ensure that only one thread at a time gets to call this function, so we don't
-    // have to worry about overwriting the arguments.
-    
-    if (!m_get_class_name_function->WriteFunctionArguments (exe_ctx, m_get_class_name_args, find_class_name_address, dispatch_values, errors))
-        return false;
-    
-    const bool stop_others = true;
-    const bool try_all_threads = true;
-    const bool unwind_on_error = true;
-    const bool ignore_breakpoints = true;
-    
-    ExecutionResults results = m_get_class_name_function->ExecuteFunction (exe_ctx, 
-                                                     &m_get_class_name_args, 
-                                                     errors, 
-                                                     stop_others, 
-                                                     100000, 
-                                                     try_all_threads, 
-                                                     unwind_on_error,
-                                                     ignore_breakpoints,
-                                                     void_ptr_value);
-                                                     
-    if (results != eExecutionCompleted)
-    {
-        if (log)
-            log->Printf("Error evaluating our find class name function: %d.\n", results);
-        return false;
-    }
-    
-    addr_t result_ptr = void_ptr_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
-    Error error;
-    size_t chars_read = m_process->ReadCStringFromMemory (result_ptr, name_dst, max_name_len, error);
-    
-    // If we exhausted our buffer before finding a NULL we're probably off in the weeds somewhere...
-    if (error.Fail() || chars_read == max_name_len)
-        return false;
-    else
-        return true;
-       
-}
-
-bool
 AppleObjCRuntimeV2::GetDynamicTypeAndAddress (ValueObject &in_value, 
                                               DynamicValueType use_dynamic, 
                                               TypeAndOrName &class_type_or_name, 
@@ -1929,298 +1680,6 @@ AppleObjCRuntimeV2::GetISAHashTablePoint
     return m_isa_hash_table_ptr;
 }
 
-
-// This code should NOT be used as it uses the objc_getClassList() function which
-// takes the ObjC runtime lock and can cause bad things to happen in your program.
-// For example one thread has the ObjC runtime lock and then we try to run this on
-// another. We are going to get a new version of the objc_getClassList() function at
-// some point in the future that doesn't take locks and that doesn't allocate memory,
-// so leave this code around so we can adapt it to that function when and if we get
-// it.
-
-bool
-AppleObjCRuntimeV2::UpdateISAToDescriptorMapUsingUtilityFunction_objc_getClassList()
-{
-    Process *process = GetProcess();
-    
-    if (process == NULL)
-        return false;
-    
-    lldb::LogSP log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
-    
-    ExecutionContext exe_ctx;
-    
-    ThreadSP thread_sp = process->GetThreadList().GetSelectedThread();
-    
-    if (!thread_sp)
-        return false;
-    
-    thread_sp->CalculateExecutionContext(exe_ctx);
-    ClangASTContext *clang_ast_context = process->GetTarget().GetScratchClangASTContext();
-    
-    if (!clang_ast_context)
-        return false;
-    
-    Address summarize_classes_address;
-    
-    StreamString errors;
-    
-    if (!m_summarize_classes_code.get())
-    {
-        m_summarize_classes_code.reset (new ClangUtilityFunction (g_summarize_classes_function_body,
-                                                                  g_summarize_classes_function_name));
-        
-        errors.Clear();
-        
-        if (!m_summarize_classes_code->Install(errors, exe_ctx))
-        {
-            if (log)
-                log->Printf ("Failed to install implementation lookup: %s.", errors.GetData());
-            m_summarize_classes_code.reset();
-            return false;
-        }
-        summarize_classes_address.Clear();
-        summarize_classes_address.SetOffset(m_summarize_classes_code->StartAddress());
-    }
-    else
-    {
-        summarize_classes_address.Clear();
-        summarize_classes_address.SetOffset(m_summarize_classes_code->StartAddress());
-    }
-    
-    const uint32_t name_size = 32;
-    
-    Error err;
-    
-    if (m_isas_allocation != LLDB_INVALID_ADDRESS)
-        process->DeallocateMemory(m_isas_allocation);
-    
-    if (m_names_allocation != LLDB_INVALID_ADDRESS)
-        process->DeallocateMemory(m_names_allocation);
-    
-    // This must be kept in sync with the definition in g_summarize_classes_function_body!
-    
-    clang_type_t clang_uint32_t_type = clang_ast_context->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, 32);
-    clang_type_t clang_void_pointer_type = clang_ast_context->CreatePointerType(clang_ast_context->GetBuiltInType_void());
-    
-    Value isas_value;
-    isas_value.SetValueType (Value::eValueTypeScalar);
-    isas_value.SetContext (Value::eContextTypeClangType, clang_void_pointer_type);
-    isas_value.GetScalar() = 0;
-    
-    Value names_value;
-    names_value.SetValueType (Value::eValueTypeScalar);
-    names_value.SetContext (Value::eContextTypeClangType, clang_void_pointer_type);
-    names_value.GetScalar() = 0;
-    
-    Value num_isas_assumed_value;
-    num_isas_assumed_value.SetValueType (Value::eValueTypeScalar);
-    num_isas_assumed_value.SetContext (Value::eContextTypeClangType, clang_uint32_t_type);
-    num_isas_assumed_value.GetScalar() = 0;
-    
-    Value name_size_value;
-    name_size_value.SetValueType (Value::eValueTypeScalar);
-    name_size_value.SetContext (Value::eContextTypeClangType, clang_uint32_t_type);
-    name_size_value.GetScalar() = 0;
-    
-    ValueList dispatch_values;
-    dispatch_values.PushValue (isas_value);
-    dispatch_values.PushValue (names_value);
-    dispatch_values.PushValue (num_isas_assumed_value);
-    dispatch_values.PushValue (name_size_value);
-    
-    // Next make the runner function for our implementation utility function.
-    if (!m_summarize_classes_function.get())
-    {
-        m_summarize_classes_function.reset(new ClangFunction (*m_process,
-                                                              clang_ast_context,
-                                                              clang_uint32_t_type,
-                                                              summarize_classes_address,
-                                                              dispatch_values));
-        
-        errors.Clear();
-        
-        unsigned num_errors = m_summarize_classes_function->CompileFunction(errors);
-        if (num_errors)
-        {
-            if (log)
-                log->Printf ("Error compiling function: \"%s\".", errors.GetData());
-            return false;
-        }
-        
-        errors.Clear();
-        
-        if (!m_summarize_classes_function->WriteFunctionWrapper(exe_ctx, errors))
-        {
-            if (log)
-                log->Printf ("Error Inserting function: \"%s\".", errors.GetData());
-            return false;
-        }
-    }
-    
-    if (m_summarize_classes_code.get() == NULL || m_summarize_classes_function.get() == NULL)
-        return false;
-    
-    // Write the initial arguments: (NULL, NULL, 0, 0).  The return value will be the
-    // new value of num_isas.
-    
-    Mutex::Locker locker(m_summarize_classes_args_mutex);
-    
-    errors.Clear();
-    
-    if (!m_summarize_classes_function->WriteFunctionArguments (exe_ctx,
-                                                               m_summarize_classes_args,
-                                                               summarize_classes_address,
-                                                               dispatch_values,
-                                                               errors))
-    {
-        if (log)
-            log->Printf ("Error writing function arguments: \"%s\".", errors.GetData());
-        return false;
-    }
-    
-    bool stop_others = true;
-    bool try_all_threads = false;
-    bool unwind_on_error = true;
-    bool ignore_breakpoints = true;
-    
-    Value num_isas_value;
-    num_isas_value.SetValueType (Value::eValueTypeScalar);
-    num_isas_value.SetContext (Value::eContextTypeClangType, clang_uint32_t_type);
-    num_isas_value.GetScalar() = 0;
-    
-    errors.Clear();
-    
-    ExecutionResults results = m_summarize_classes_function->ExecuteFunction (exe_ctx,
-                                                                              &m_summarize_classes_args,
-                                                                              errors,
-                                                                              stop_others,
-                                                                              UTILITY_FUNCTION_TIMEOUT_USEC,
-                                                                              try_all_threads,
-                                                                              unwind_on_error,
-                                                                              ignore_breakpoints,
-                                                                              num_isas_value);
-    
-    if (results != eExecutionCompleted)
-    {
-        if (log)
-            log->Printf("Error evaluating our find class name function: %s.\n", errors.GetData());
-        return false;
-    }
-    
-    // With the result from that, allocate real buffers.
-    
-    uint32_t num_isas = num_isas_value.GetScalar().ULong();
-    
-    if (log)
-        log->Printf("Fast class summary mode reports %u isas\n", num_isas);
-    
-    const uint32_t addr_size = process->GetAddressByteSize();
-    uint32_t isas_allocation_size = num_isas * addr_size;
-    uint32_t names_allocation_size = num_isas * name_size;
-    
-    if (m_isas_allocation == LLDB_INVALID_ADDRESS)
-    {
-        m_isas_allocation = process->AllocateMemory(isas_allocation_size,
-                                                    ePermissionsReadable | ePermissionsWritable,
-                                                    err);
-        
-        if (m_isas_allocation == LLDB_INVALID_ADDRESS)
-            return false;
-    }
-    
-    if (m_names_allocation == LLDB_INVALID_ADDRESS)
-    {
-        m_names_allocation = process->AllocateMemory(names_allocation_size,
-                                                     ePermissionsReadable | ePermissionsWritable,
-                                                     err);
-        
-        if (m_names_allocation == LLDB_INVALID_ADDRESS)
-            return false;
-    }
-    
-    // Write the final arguments.
-    
-    dispatch_values.Clear();
-    
-    isas_value.GetScalar() = m_isas_allocation;
-    names_value.GetScalar() = m_names_allocation;
-    num_isas_assumed_value.GetScalar() = num_isas;
-    name_size_value.GetScalar() = name_size;
-    
-    dispatch_values.PushValue (isas_value);
-    dispatch_values.PushValue (names_value);
-    dispatch_values.PushValue (num_isas_assumed_value);
-    dispatch_values.PushValue (name_size_value);
-    
-    errors.Clear();
-    
-    if (!m_summarize_classes_function->WriteFunctionArguments (exe_ctx, m_summarize_classes_args, summarize_classes_address, dispatch_values, errors))
-    {
-        if (log)
-            log->Printf ("Error writing function arguments: \"%s\".", errors.GetData());
-        return false;
-        
-    }
-    
-    errors.Clear();
-    
-    results = m_summarize_classes_function->ExecuteFunction (exe_ctx,
-                                                             &m_summarize_classes_args,
-                                                             errors,
-                                                             stop_others,
-                                                             UTILITY_FUNCTION_TIMEOUT_USEC,
-                                                             try_all_threads,
-                                                             unwind_on_error,
-                                                             ignore_breakpoints,
-                                                             num_isas_value);
-    
-    if (results != eExecutionCompleted)
-    {
-        if (log)
-            log->Printf("Error evaluating our find class name function: %s.\n", errors.GetData());
-        return false;
-    }
-    
-    DataBufferHeap isas_buffer(isas_allocation_size, 0);
-    DataBufferHeap names_buffer(names_allocation_size, 0);
-    
-    if (process->ReadMemory(m_isas_allocation, isas_buffer.GetBytes(), isas_allocation_size, err) != isas_allocation_size)
-        return false;
-    
-    if (process->ReadMemory(m_names_allocation, names_buffer.GetBytes(), names_allocation_size, err) != names_allocation_size)
-        return false;
-    
-    DataExtractor isa_extractor(isas_buffer.GetBytes(), isas_allocation_size, process->GetByteOrder(), addr_size);
-    
-    lldb::offset_t offset = 0;
-    
-    for (size_t index = 0; index < num_isas; ++index)
-    {
-        uint64_t isa = isa_extractor.GetPointer(&offset);
-        
-        const char *name = (const char*)(names_buffer.GetBytes() + (name_size * index));
-        
-        if (log && log->GetVerbose())
-            log->Printf("Fast class summary mode found isa 0x%llx (%s)", isa, name);
-        
-        // The name can only be relied upon if it is NULL-terminated.
-        // Otherwise it ran off its allocation and has been partially overwritten by the next name.
-        
-        ClassDescriptorSP descriptor_sp;
-        
-        if (name[name_size - 1] == '\0')
-            AddClass (isa, ClassDescriptorSP(new ClassDescriptorV2(*this, isa, name)), name);
-        else
-            AddClass (isa, ClassDescriptorSP(new ClassDescriptorV2(*this, isa, NULL)));
-    }
-    
-    return true;
-}
-
-
-
-
 bool
 AppleObjCRuntimeV2::UpdateISAToDescriptorMapDynamic(RemoteNXMapTable &hash_table)
 {
@@ -2400,7 +1859,7 @@ AppleObjCRuntimeV2::UpdateISAToDescripto
                                                     buffer.GetByteSize(),
                                                     process->GetByteOrder(),
                                                     addr_size);
-                    ParseISAHashArray (class_infos_data, num_class_infos);
+                    ParseClassInfoArray (class_infos_data, num_class_infos);
                 }
             }
             success = true;
@@ -2423,10 +1882,17 @@ AppleObjCRuntimeV2::UpdateISAToDescripto
     return success;
 }
 
-
 void
-AppleObjCRuntimeV2::ParseISAHashArray (const DataExtractor &data, uint32_t num_class_infos)
+AppleObjCRuntimeV2::ParseClassInfoArray (const DataExtractor &data, uint32_t num_class_infos)
 {
+    // Parses an array of "num_class_infos" packed ClassInfo structures:
+    //
+    //    struct ClassInfo
+    //    {
+    //        Class isa;
+    //        uint32_t hash;
+    //    } __attribute__((__packed__));
+
     lldb::LogSP log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
 
     // Iterate through all ClassInfo structures
@@ -2647,7 +2113,7 @@ AppleObjCRuntimeV2::UpdateISAToDescripto
                                                     process->GetByteOrder(),
                                                     addr_size);
                     
-                    ParseISAHashArray (class_infos_data, num_class_infos);
+                    ParseClassInfoArray (class_infos_data, num_class_infos);
                 }
             }
             success = true;

Modified: lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h?rev=175106&r1=175105&r2=175106&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h (original)
+++ lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h Wed Feb 13 17:22:26 2013
@@ -83,7 +83,6 @@ public:
     // we report an actual type - otherwise, we just say tagged
     // there is no connection between the values here and the tagged pointers map
     static const ObjCLanguageRuntime::ObjCISA g_objc_Tagged_ISA = 1;
-
     static const ObjCLanguageRuntime::ObjCISA g_objc_Tagged_ISA_NSAtom = 2;
     static const ObjCLanguageRuntime::ObjCISA g_objc_Tagged_ISA_NSNumber = 3;
     static const ObjCLanguageRuntime::ObjCISA g_objc_Tagged_ISA_NSDateTS = 4;
@@ -139,39 +138,18 @@ private:
     UpdateISAToDescriptorMapFromMemory (RemoteNXMapTable &hash_table);
     
     bool
-    UpdateISAToDescriptorMapUsingUtilityFunction_objc_getClassList();
-
-    bool
     UpdateISAToDescriptorMapDynamic(RemoteNXMapTable &hash_table);
     
     void
-    ParseISAHashArray (const lldb_private::DataExtractor &data,
-                       uint32_t num_class_infos);
+    ParseClassInfoArray (const lldb_private::DataExtractor &data,
+                         uint32_t num_class_infos);
     
     bool
     UpdateISAToDescriptorMapSharedCache ();
 
     lldb::addr_t
     GetSharedCacheReadOnlyAddress();
-
-    bool
-    RunFunctionToFindClassName (lldb::addr_t class_addr, Thread *thread, char *name_dst, size_t max_name_len);
     
-    std::auto_ptr<ClangFunction>        m_get_class_name_function;
-    std::auto_ptr<ClangUtilityFunction> m_get_class_name_code;
-    
-    lldb::addr_t                        m_get_class_name_args;
-    Mutex                               m_get_class_name_args_mutex;
-    
-    std::auto_ptr<ClangFunction>        m_summarize_classes_function;
-    std::auto_ptr<ClangUtilityFunction> m_summarize_classes_code;
-    
-    
-    lldb::addr_t                        m_isas_allocation;
-    lldb::addr_t                        m_names_allocation;
-    lldb::addr_t                        m_summarize_classes_args;
-    Mutex                               m_summarize_classes_args_mutex;
-
     std::auto_ptr<ClangFunction>        m_get_class_info_function;
     std::auto_ptr<ClangUtilityFunction> m_get_class_info_code;
     lldb::addr_t                        m_get_class_info_args;





More information about the lldb-commits mailing list