diff options
Diffstat (limited to 'lldb/source')
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()) |