[Lldb-commits] [lldb] r166512 - in /lldb/trunk: include/lldb/Symbol/Type.h include/lldb/Target/ObjCLanguageRuntime.h source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp source/Symbol/Type.cpp source/Target/ObjCLanguageRuntime.cpp
Greg Clayton
gclayton at apple.com
Tue Oct 23 15:41:19 PDT 2012
Author: gclayton
Date: Tue Oct 23 17:41:19 2012
New Revision: 166512
URL: http://llvm.org/viewvc/llvm-project?rev=166512&view=rev
Log:
Objective C cleanup. Removed an cache that was no longer needed and changes the code that gets the dynamic type and class name to use our new Objective C cache.
Modified:
lldb/trunk/include/lldb/Symbol/Type.h
lldb/trunk/include/lldb/Target/ObjCLanguageRuntime.h
lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
lldb/trunk/source/Symbol/Type.cpp
lldb/trunk/source/Target/ObjCLanguageRuntime.cpp
Modified: lldb/trunk/include/lldb/Symbol/Type.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Type.h?rev=166512&r1=166511&r2=166512&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/Type.h (original)
+++ lldb/trunk/include/lldb/Symbol/Type.h Tue Oct 23 17:41:19 2012
@@ -349,10 +349,10 @@
}
void
- SetName (ConstString &type_name_const_str);
+ SetName (const ConstString &type_name);
void
- SetName (const char *type_name_str);
+ SetName (const char *type_name_cstr);
void
SetTypeSP (lldb::TypeSP type_sp);
Modified: lldb/trunk/include/lldb/Target/ObjCLanguageRuntime.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/ObjCLanguageRuntime.h?rev=166512&r1=166511&r2=166512&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/ObjCLanguageRuntime.h (original)
+++ lldb/trunk/include/lldb/Target/ObjCLanguageRuntime.h Tue Oct 23 17:41:19 2012
@@ -45,14 +45,16 @@
public:
ClassDescriptor() :
- m_is_kvo(eLazyBoolCalculate),
- m_is_cf(eLazyBoolCalculate)
- {}
-
- ClassDescriptor (ObjCISA isa, lldb::ProcessSP process) :
- m_is_kvo(eLazyBoolCalculate),
- m_is_cf(eLazyBoolCalculate)
- {}
+ m_is_kvo (eLazyBoolCalculate),
+ m_is_cf (eLazyBoolCalculate),
+ m_type_wp ()
+ {
+ }
+
+ virtual
+ ~ClassDescriptor ()
+ {
+ }
virtual ConstString
GetClassName () = 0;
@@ -118,9 +120,17 @@
return false;
}
- virtual
- ~ClassDescriptor ()
- {}
+ lldb::TypeSP
+ GetType ()
+ {
+ return m_type_wp.lock();
+ }
+
+ void
+ SetType (const lldb::TypeSP &type_sp)
+ {
+ m_type_wp = type_sp;
+ }
protected:
bool
@@ -133,6 +143,7 @@
private:
LazyBool m_is_kvo;
LazyBool m_is_cf;
+ lldb::TypeWP m_type_wp;
};
// a convenience subclass of ClassDescriptor meant to represent invalid objects
@@ -141,6 +152,10 @@
public:
ClassDescriptor_Invalid() {}
+ virtual
+ ~ClassDescriptor_Invalid ()
+ {}
+
virtual ConstString
GetClassName () { return ConstString(""); }
@@ -164,11 +179,6 @@
{
return false;
}
-
- virtual
- ~ClassDescriptor_Invalid ()
- {}
-
};
virtual ClassDescriptorSP
@@ -443,10 +453,6 @@
ISAToDescriptorMap m_isa_to_descriptor_cache;
bool m_isa_to_descriptor_cache_is_up_to_date;
- typedef std::map<lldb::addr_t,TypeAndOrName> ClassNameMap;
- typedef ClassNameMap::iterator ClassNameIterator;
- ClassNameMap m_class_name_cache;
-
typedef std::map<ConstString, lldb::TypeWP> CompleteClassMap;
CompleteClassMap m_complete_class_cache;
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=166512&r1=166511&r2=166512&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp (original)
+++ lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp Tue Oct 23 17:41:19 2012
@@ -259,152 +259,31 @@
if (CouldHaveDynamicValue (in_value))
{
// First job, pull out the address at 0 offset from the object That will be the ISA pointer.
- Error error;
- const addr_t object_ptr = in_value.GetPointerValue();
- const addr_t isa_addr = m_process->ReadPointerFromMemory (object_ptr, error);
-
- if (error.Fail())
- return false;
-
- address.SetRawAddress(object_ptr);
-
- // First check the cache...
- SymbolContext sc;
- class_type_or_name = LookupInClassNameCache (isa_addr);
-
- if (!class_type_or_name.IsEmpty())
+ ClassDescriptorSP objc_class_sp (GetNonKVOClassDescriptor (in_value));
+ if (objc_class_sp)
{
- if (class_type_or_name.GetTypeSP())
- return true;
- else
- return false;
- }
-
- // We don't have the object cached, so make sure the class
- // address is readable, otherwise this is not a good object:
- m_process->ReadPointerFromMemory (isa_addr, error);
-
- if (error.Fail())
- return false;
+ const addr_t object_ptr = in_value.GetPointerValue();
+ address.SetRawAddress(object_ptr);
- const char *class_name = NULL;
- Address isa_address;
- Target &target = m_process->GetTarget();
- target.GetSectionLoadList().ResolveLoadAddress (isa_addr, isa_address);
-
- if (isa_address.IsValid())
- {
- // If the ISA pointer points to one of the sections in the binary, then see if we can
- // get the class name from the symbols.
-
- SectionSP section_sp (isa_address.GetSection());
-
- if (section_sp)
- {
- // If this points to a section that we know about, then this is
- // some static class or nothing. See if it is in the right section
- // and if its name is the right form.
- ConstString section_name = section_sp->GetName();
- static ConstString g_objc_class_section_name ("__objc_data");
- if (section_name == g_objc_class_section_name)
- {
- isa_address.CalculateSymbolContext(&sc, eSymbolContextModule | eSymbolContextSymbol);
- if (sc.symbol)
- {
- if (sc.symbol->GetType() == eSymbolTypeObjCClass)
- class_name = sc.symbol->GetName().GetCString();
- else if (sc.symbol->GetType() == eSymbolTypeObjCMetaClass)
- {
- // FIXME: Meta-classes can't have dynamic types...
- return false;
- }
- }
- }
- }
- }
-
- char class_buffer[1024];
- if (class_name == NULL && use_dynamic == eDynamicCanRunTarget)
- {
- // If the class address didn't point into the binary, or
- // it points into the right section but there wasn't a symbol
- // there, try to look it up by calling the class method in the target.
-
- ExecutionContext exe_ctx (in_value.GetExecutionContextRef());
-
- Thread *thread_to_use = exe_ctx.GetThreadPtr();
-
- if (thread_to_use == NULL)
- thread_to_use = m_process->GetThreadList().GetSelectedThread().get();
-
- if (thread_to_use == NULL)
- return false;
-
- if (!RunFunctionToFindClassName (object_ptr, thread_to_use, class_buffer, 1024))
- return false;
-
- class_name = class_buffer;
-
- }
-
- if (class_name && class_name[0])
- {
- class_type_or_name.SetName (class_name);
-
- TypeList class_types;
- const bool exact_match = true;
- uint32_t num_matches = target.GetImages().FindTypes (sc,
- class_type_or_name.GetName(),
- exact_match,
- UINT32_MAX,
- class_types);
- if (num_matches == 1)
- {
- class_type_or_name.SetTypeSP (class_types.GetTypeAtIndex(0));
- return true;
- }
+ ConstString class_name (objc_class_sp->GetClassName());
+ class_type_or_name.SetName(class_name);
+ TypeSP type_sp (objc_class_sp->GetType());
+ if (type_sp)
+ class_type_or_name.SetTypeSP (type_sp);
else
{
- for (size_t i = 0; i < num_matches; i++)
+ type_sp = LookupInCompleteClassCache (class_name);
+ if (type_sp)
{
- TypeSP this_type(class_types.GetTypeAtIndex(i));
- if (this_type)
- {
- // Only consider "real" ObjC classes. For now this means avoiding
- // the Type objects that are made up from the OBJC_CLASS_$_<NAME> symbols.
- // we don't want to use them since they are empty and useless.
- if (this_type->IsRealObjCClass())
- {
- // There can only be one type with a given name,
- // so we've just found duplicate definitions, and this
- // one will do as well as any other.
- // We don't consider something to have a dynamic type if
- // it is the same as the static type. So compare against
- // the value we were handed:
-
- clang::ASTContext *in_ast_ctx = in_value.GetClangAST ();
- clang::ASTContext *this_ast_ctx = this_type->GetClangAST ();
- if (in_ast_ctx != this_ast_ctx
- || !ClangASTContext::AreTypesSame (in_ast_ctx,
- in_value.GetClangType(),
- this_type->GetClangFullType()))
- {
- class_type_or_name.SetTypeSP (this_type);
- }
- break;
- }
- }
+ objc_class_sp->SetType (type_sp);
+ class_type_or_name.SetTypeSP (type_sp);
}
}
- AddToClassNameCache (isa_addr, class_type_or_name);
- if (class_type_or_name.GetTypeSP())
+ if (type_sp)
return true;
- else
- return false;
}
- }
-
+ }
return false;
}
@@ -1699,7 +1578,17 @@
Error error;
ObjCISA isa = process->ReadPointerFromMemory(isa_pointer, error);
if (isa != LLDB_INVALID_ADDRESS)
+ {
objc_class_sp = ObjCLanguageRuntime::GetClassDescriptor (isa);
+ if (isa && !objc_class_sp)
+ {
+ lldb::LogSP log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
+ if (log)
+ log->Printf("0x%llx: AppleObjCRuntimeV2::GetClassDescriptor() ISA was not in class descriptor cache 0x%llx",
+ isa_pointer,
+ isa);
+ }
+ }
}
}
}
Modified: lldb/trunk/source/Symbol/Type.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Type.cpp?rev=166512&r1=166511&r2=166512&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/Type.cpp (original)
+++ lldb/trunk/source/Symbol/Type.cpp Tue Oct 23 17:41:19 2012
@@ -838,15 +838,15 @@
}
void
-TypeAndOrName::SetName (ConstString &type_name_const_str)
+TypeAndOrName::SetName (const ConstString &type_name)
{
- m_type_name = type_name_const_str;
+ m_type_name = type_name;
}
void
-TypeAndOrName::SetName (const char *type_name_str)
+TypeAndOrName::SetName (const char *type_name_cstr)
{
- m_type_name.SetCString (type_name_str);
+ m_type_name.SetCString (type_name_cstr);
}
void
Modified: lldb/trunk/source/Target/ObjCLanguageRuntime.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ObjCLanguageRuntime.cpp?rev=166512&r1=166511&r2=166512&view=diff
==============================================================================
--- lldb/trunk/source/Target/ObjCLanguageRuntime.cpp (original)
+++ lldb/trunk/source/Target/ObjCLanguageRuntime.cpp Tue Oct 23 17:41:19 2012
@@ -58,47 +58,6 @@
return LLDB_INVALID_ADDRESS;
}
-void
-ObjCLanguageRuntime::AddToClassNameCache (lldb::addr_t class_addr, const char *name, lldb::TypeSP type_sp)
-{
- LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
- if (log)
- {
- log->Printf ("Caching: class 0x%llx name: %s.", class_addr, name);
- }
-
- TypeAndOrName class_type_or_name;
-
- if (type_sp)
- class_type_or_name.SetTypeSP (type_sp);
- else if (name && *name != '\0')
- class_type_or_name.SetName (name);
- else
- return;
- m_class_name_cache.insert (std::pair<lldb::addr_t,TypeAndOrName> (class_addr, class_type_or_name));
-}
-
-void
-ObjCLanguageRuntime::AddToClassNameCache (lldb::addr_t class_addr, const TypeAndOrName &class_type_or_name)
-{
- LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
- if (log)
- {
- log->Printf ("Caching: class 0x%llx name: %s.", class_addr, class_type_or_name.GetName().AsCString());
- }
-
- m_class_name_cache.insert (std::pair<lldb::addr_t,TypeAndOrName> (class_addr, class_type_or_name));
-}
-
-TypeAndOrName
-ObjCLanguageRuntime::LookupInClassNameCache (lldb::addr_t class_addr)
-{
- ClassNameMap::iterator pos, end = m_class_name_cache.end();
- pos = m_class_name_cache.find (class_addr);
- if (pos != end)
- return (*pos).second;
- return TypeAndOrName ();
-}
lldb::TypeSP
ObjCLanguageRuntime::LookupInCompleteClassCache (ConstString &name)
@@ -107,72 +66,77 @@
if (complete_class_iter != m_complete_class_cache.end())
{
- TypeSP ret(complete_class_iter->second);
+ // Check the weak pointer to make sure the type hasn't been unloaded
+ TypeSP complete_type_sp (complete_class_iter->second.lock());
- if (!ret)
- m_complete_class_cache.erase(name);
+ if (complete_type_sp)
+ return complete_type_sp;
else
- return TypeSP(complete_class_iter->second);
+ m_complete_class_cache.erase(name);
}
ModuleList &modules = m_process->GetTarget().GetImages();
-
+
SymbolContextList sc_list;
+ const size_t matching_symbols = modules.FindSymbolsWithNameAndType (name,
+ eSymbolTypeObjCClass,
+ sc_list);
- modules.FindSymbolsWithNameAndType(name, eSymbolTypeObjCClass, sc_list);
-
- if (sc_list.GetSize() == 0)
- return TypeSP();
-
- SymbolContext sc;
-
- sc_list.GetContextAtIndex(0, sc);
-
- ModuleSP module_sp(sc.module_sp);
-
- if (!module_sp)
- return TypeSP();
-
- const SymbolContext null_sc;
- const bool exact_match = true;
- const uint32_t max_matches = UINT32_MAX;
- TypeList types;
-
- module_sp->FindTypes (null_sc,
- name,
- exact_match,
- max_matches,
- types);
-
- if (types.GetSize() == 1)
+ if (matching_symbols)
{
- TypeSP candidate_type = types.GetTypeAtIndex(0);
+ SymbolContext sc;
- if (ClangASTContext::IsObjCClassType(candidate_type->GetClangForwardType()))
- {
- m_complete_class_cache[name] = TypeWP(candidate_type);
- return candidate_type;
- }
- else
- {
+ sc_list.GetContextAtIndex(0, sc);
+
+ ModuleSP module_sp(sc.module_sp);
+
+ if (!module_sp)
return TypeSP();
- }
- }
-
- for (uint32_t ti = 0, te = types.GetSize();
- ti < te;
- ++ti)
- {
- TypeSP candidate_type = types.GetTypeAtIndex(ti);
- if (candidate_type->IsCompleteObjCClass() &&
- ClangASTContext::IsObjCClassType(candidate_type->GetClangForwardType()))
+ const SymbolContext null_sc;
+ const bool exact_match = true;
+ const uint32_t max_matches = UINT32_MAX;
+ TypeList types;
+
+ const uint32_t num_types = module_sp->FindTypes (null_sc,
+ name,
+ exact_match,
+ max_matches,
+ types);
+
+ if (num_types)
{
- m_complete_class_cache[name] = TypeWP(candidate_type);
- return candidate_type;
+ TypeSP incomplete_type_sp;
+
+ uint32_t i;
+ for (i = 0; i < num_types; ++i)
+ {
+ TypeSP type_sp (types.GetTypeAtIndex(i));
+
+ if (ClangASTContext::IsObjCClassType(type_sp->GetClangForwardType()))
+ {
+ if (type_sp->IsCompleteObjCClass())
+ {
+ m_complete_class_cache[name] = type_sp;
+ return type_sp;
+ }
+ else if (!incomplete_type_sp)
+ incomplete_type_sp = type_sp;
+ }
+ }
+
+ // We didn't find any "real" definitions, so just use any??? Why was
+ // this being done? Prior to this, if there was 1 match only, then it
+ // would always use any objc definition, else we would only accept a
+ // definition if it was the real thing???? Doesn't make sense.
+
+ if (incomplete_type_sp)
+ {
+ m_complete_class_cache[name] = incomplete_type_sp;
+ return incomplete_type_sp;
+ }
}
}
-
return TypeSP();
}
More information about the lldb-commits
mailing list