summaryrefslogtreecommitdiffstats
path: root/lldb/source
diff options
context:
space:
mode:
authorEnrico Granata <egranata@apple.com>2013-04-05 18:49:06 +0000
committerEnrico Granata <egranata@apple.com>2013-04-05 18:49:06 +0000
commitf15ee4e89fbb475c0979aa09775f8495dad3a19c (patch)
tree6f01793d13107986269b9b72d3ffbd1a5fbc70b1 /lldb/source
parent4386fa99486429ebb50067f320117aa16ce934b3 (diff)
downloadbcm5719-llvm-f15ee4e89fbb475c0979aa09775f8495dad3a19c.tar.gz
bcm5719-llvm-f15ee4e89fbb475c0979aa09775f8495dad3a19c.zip
<rdar://problem/13563628>
Introducing a negative cache for ObjCLanguageRuntime::LookupInCompleteClassCache() This helps speed up the (common) case of us looking for classes that are hidden deep within Cocoa internals and repeatedly failing at finding type information for them. In order for this to work, we need to clean this cache whenever debug information is added. A new symbols loaded event is added that is triggered with add-dsym (before modules loaded would be triggered for both adding modules and adding symbols). Interested parties can register for this event. Internally, we make sure to clean the negative cache whenever symbols are added. Lastly, ClassDescriptor::IsTagged() has been refactored to GetTaggedPointerInfo() that also (optionally) returns info and value bits. In this way, data formatters can share tagged pointer code instead of duplicating the required arithmetic. llvm-svn: 178897
Diffstat (limited to 'lldb/source')
-rw-r--r--lldb/source/Commands/CommandObjectTarget.cpp2
-rw-r--r--lldb/source/DataFormatters/Cocoa.cpp13
-rw-r--r--lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.h6
-rw-r--r--lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp15
-rw-r--r--lldb/source/Target/ObjCLanguageRuntime.cpp4
-rw-r--r--lldb/source/Target/Target.cpp18
6 files changed, 43 insertions, 15 deletions
diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp
index 14a743a5c16..19b788258bb 100644
--- a/lldb/source/Commands/CommandObjectTarget.cpp
+++ b/lldb/source/Commands/CommandObjectTarget.cpp
@@ -4320,7 +4320,7 @@ protected:
// if it is currently loaded
ModuleList module_list;
module_list.Append (module_sp);
- target->ModulesDidLoad (module_list);
+ target->SymbolsDidLoad (module_list);
// Make sure we load any scripting resources that may be embedded
// in the debug info files in case the platform supports that.
diff --git a/lldb/source/DataFormatters/Cocoa.cpp b/lldb/source/DataFormatters/Cocoa.cpp
index 858bba98abc..e7f4def8d15 100644
--- a/lldb/source/DataFormatters/Cocoa.cpp
+++ b/lldb/source/DataFormatters/Cocoa.cpp
@@ -321,12 +321,10 @@ lldb_private::formatters::NSNumberSummaryProvider (ValueObject& valobj, Stream&
if (!strcmp(class_name,"NSNumber") || !strcmp(class_name,"__NSCFNumber"))
{
- if (descriptor->IsTagged())
+ uint64_t value = 0;
+ uint64_t i_bits = 0;
+ if (descriptor->GetTaggedPointerInfo(&i_bits,&value))
{
- // we have a call to get info and value bits in the tagged descriptor. but we prefer not to cast and replicate them
- int64_t value = (valobj_addr & ~0x0000000000000000FFL) >> 8;
- uint64_t i_bits = (valobj_addr & 0xF0) >> 4;
-
switch (i_bits)
{
case 0:
@@ -515,10 +513,9 @@ lldb_private::formatters::NSDateSummaryProvider (ValueObject& valobj, Stream& st
strcmp(class_name,"__NSDate") == 0 ||
strcmp(class_name,"__NSTaggedDate") == 0)
{
- if (descriptor->IsTagged())
+ uint64_t info_bits=0,value_bits = 0;
+ if (descriptor->GetTaggedPointerInfo(&info_bits,&value_bits))
{
- uint64_t info_bits = (valobj_addr & 0xF0ULL) >> 4;
- uint64_t value_bits = (valobj_addr & ~0x0000000000000000FFULL) >> 8;
date_value_bits = ((value_bits << 8) | (info_bits << 4));
date_value = *((double*)&date_value_bits);
}
diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.h b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.h
index 0de135d1874..419bae998b2 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.h
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.h
@@ -46,10 +46,12 @@ public:
return m_valid;
}
+ // v1 does not support tagged pointers
virtual bool
- IsTagged ()
+ GetTaggedPointerInfo (uint64_t* info_bits = NULL,
+ uint64_t* value_bits = NULL)
{
- return false; // v1 runtime does not support tagged pointers
+ return false;
}
virtual uint64_t
diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
index e46a1fd5002..31916937c0b 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
@@ -854,10 +854,12 @@ public:
return true; // any Objective-C v2 runtime class descriptor we vend is valid
}
+ // a custom descriptor is used for tagged pointers
virtual bool
- IsTagged ()
+ GetTaggedPointerInfo (uint64_t* info_bits = NULL,
+ uint64_t* value_bits = NULL)
{
- return false; // we use a special class for tagged descriptors
+ return false;
}
virtual uint64_t
@@ -1530,9 +1532,14 @@ public:
}
virtual bool
- IsTagged ()
+ GetTaggedPointerInfo (uint64_t* info_bits = NULL,
+ uint64_t* value_bits = NULL)
{
- return true; // we use this class to describe tagged pointers
+ if (info_bits)
+ *info_bits = GetInfoBits();
+ if (value_bits)
+ *value_bits = GetValueBits();
+ return true;
}
virtual uint64_t
diff --git a/lldb/source/Target/ObjCLanguageRuntime.cpp b/lldb/source/Target/ObjCLanguageRuntime.cpp
index 87dfc79289c..7e6685662b0 100644
--- a/lldb/source/Target/ObjCLanguageRuntime.cpp
+++ b/lldb/source/Target/ObjCLanguageRuntime.cpp
@@ -92,6 +92,9 @@ ObjCLanguageRuntime::LookupInCompleteClassCache (ConstString &name)
m_complete_class_cache.erase(name);
}
+ if (m_negative_complete_class_cache.count(name) > 0)
+ return TypeSP();
+
const ModuleList &modules = m_process->GetTarget().GetImages();
SymbolContextList sc_list;
@@ -139,6 +142,7 @@ ObjCLanguageRuntime::LookupInCompleteClassCache (ConstString &name)
}
}
}
+ m_negative_complete_class_cache.insert(name);
return TypeSP();
}
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index ba61678375b..ea97fd7d641 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -90,6 +90,7 @@ Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::Plat
SetEventName (eBroadcastBitModulesLoaded, "modules-loaded");
SetEventName (eBroadcastBitModulesUnloaded, "modules-unloaded");
SetEventName (eBroadcastBitWatchpointChanged, "watchpoint-changed");
+ SetEventName (eBroadcastBitSymbolsLoaded, "symbols-loaded");
CheckInWithManager();
@@ -1126,6 +1127,23 @@ Target::ModulesDidLoad (ModuleList &module_list)
}
void
+Target::SymbolsDidLoad (ModuleList &module_list)
+{
+ if (module_list.GetSize() == 0)
+ return;
+ if (m_process_sp)
+ {
+ LanguageRuntime* runtime = m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
+ if (runtime)
+ {
+ ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime*)runtime;
+ objc_runtime->SymbolsDidLoad(module_list);
+ }
+ }
+ BroadcastEvent(eBroadcastBitSymbolsLoaded, NULL);
+}
+
+void
Target::ModulesDidUnload (ModuleList &module_list)
{
if (module_list.GetSize())
OpenPOWER on IntegriCloud