summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/API/SBTarget.h3
-rw-r--r--lldb/include/lldb/Target/ObjCLanguageRuntime.h25
-rw-r--r--lldb/include/lldb/Target/Target.h6
-rw-r--r--lldb/scripts/Python/interface/SBTarget.i3
-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
10 files changed, 75 insertions, 20 deletions
diff --git a/lldb/include/lldb/API/SBTarget.h b/lldb/include/lldb/API/SBTarget.h
index 1f6595ba089..18d0ca09448 100644
--- a/lldb/include/lldb/API/SBTarget.h
+++ b/lldb/include/lldb/API/SBTarget.h
@@ -237,7 +237,8 @@ public:
eBroadcastBitBreakpointChanged = (1 << 0),
eBroadcastBitModulesLoaded = (1 << 1),
eBroadcastBitModulesUnloaded = (1 << 2),
- eBroadcastBitWatchpointChanged = (1 << 3)
+ eBroadcastBitWatchpointChanged = (1 << 3),
+ eBroadcastBitSymbolsLoaded = (1 << 4)
};
//------------------------------------------------------------------
diff --git a/lldb/include/lldb/Target/ObjCLanguageRuntime.h b/lldb/include/lldb/Target/ObjCLanguageRuntime.h
index 5938d2b43cf..cb48b46dfe1 100644
--- a/lldb/include/lldb/Target/ObjCLanguageRuntime.h
+++ b/lldb/include/lldb/Target/ObjCLanguageRuntime.h
@@ -14,6 +14,7 @@
// C++ Includes
#include <functional>
#include <map>
+#include <unordered_set>
// Other libraries and framework includes
// Project includes
@@ -197,7 +198,8 @@ public:
IsValid () = 0;
virtual bool
- IsTagged () = 0;
+ GetTaggedPointerInfo (uint64_t* info_bits = NULL,
+ uint64_t* value_bits = NULL) = 0;
virtual uint64_t
GetInstanceSize () = 0;
@@ -463,6 +465,12 @@ public:
return (m_has_new_literals_and_indexing == eLazyBoolYes);
}
+ virtual void
+ SymbolsDidLoad (const ModuleList& module_list)
+ {
+ m_negative_complete_class_cache.clear();
+ }
+
protected:
//------------------------------------------------------------------
// Classes that inherit from ObjCLanguageRuntime can see and modify these
@@ -567,10 +575,23 @@ private:
protected:
uint32_t m_isa_to_descriptor_stop_id;
+
typedef std::map<ConstString, lldb::TypeWP> CompleteClassMap;
CompleteClassMap m_complete_class_cache;
-
+ struct ConstStringSetHelpers {
+ size_t operator () (const ConstString& arg) const // for hashing
+ {
+ return (size_t)arg.GetCString();
+ }
+ bool operator () (const ConstString& arg1, const ConstString& arg2) const // for equality
+ {
+ return arg1.operator==(arg2);
+ }
+ };
+ typedef std::unordered_set<ConstString, ConstStringSetHelpers, ConstStringSetHelpers> CompleteClassSet;
+ CompleteClassSet m_negative_complete_class_cache;
+
ISAToDescriptorIterator
GetDescriptorIterator (const ConstString &name);
diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h
index 8d42937298a..ae782c3d2d4 100644
--- a/lldb/include/lldb/Target/Target.h
+++ b/lldb/include/lldb/Target/Target.h
@@ -302,7 +302,8 @@ public:
eBroadcastBitBreakpointChanged = (1 << 0),
eBroadcastBitModulesLoaded = (1 << 1),
eBroadcastBitModulesUnloaded = (1 << 2),
- eBroadcastBitWatchpointChanged = (1 << 3)
+ eBroadcastBitWatchpointChanged = (1 << 3),
+ eBroadcastBitSymbolsLoaded = (1 << 4)
};
// These two functions fill out the Broadcaster interface:
@@ -667,6 +668,9 @@ public:
void
ModulesDidUnload (ModuleList &module_list);
+ void
+ SymbolsDidLoad (ModuleList &module_list);
+
//------------------------------------------------------------------
/// Gets the module for the main executable.
///
diff --git a/lldb/scripts/Python/interface/SBTarget.i b/lldb/scripts/Python/interface/SBTarget.i
index b60a8dba84f..8547b7b5365 100644
--- a/lldb/scripts/Python/interface/SBTarget.i
+++ b/lldb/scripts/Python/interface/SBTarget.i
@@ -239,7 +239,8 @@ public:
eBroadcastBitBreakpointChanged = (1 << 0),
eBroadcastBitModulesLoaded = (1 << 1),
eBroadcastBitModulesUnloaded = (1 << 2),
- eBroadcastBitWatchpointChanged = (1 << 3)
+ eBroadcastBitWatchpointChanged = (1 << 3),
+ eBroadcastBitSymbolsLoaded = (1 << 4)
};
//------------------------------------------------------------------
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