Author: gclayton
Date: Fri May 15 13:40:24 2015
New Revision: 237465
URL: http://llvm.org/viewvc/llvm-project?rev=237465&view=rev
Log:
OperatingSystem plug-ins need to avoid running code when fetching thread lists.
This patch helps with that by making all SBValue objects that are fetched not
try to do dynamic type resolution. Objective C can end up running code to fetch
a list of all ISA pointers so we can tell when something is dynamic and this
running code could cause the OS plug-in to continue the target.
This fix disabled dynamic types, fetches the new threads from the OS plug-in,
then restores the setting.
<rdar://problem/20768407>
Modified:
lldb/trunk/include/lldb/Target/Target.h
lldb/trunk/source/Target/Process.cpp
lldb/trunk/source/Target/Target.cpp
Modified: lldb/trunk/include/lldb/Target/Target.h
URL:
http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Target.h?rev=237465&r1=237464&r2=237465&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Target.h (original)
+++ lldb/trunk/include/lldb/Target/Target.h Fri May 15 13:40:24 2015
@@ -69,7 +69,10 @@ public:
lldb::DynamicValueType
GetPreferDynamicValue() const;
-
+
+ bool
+ SetPreferDynamicValue (lldb::DynamicValueType d);
+
bool
GetDisableASLR () const;
Modified: lldb/trunk/source/Target/Process.cpp
URL:
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=237465&r1=237464&r2=237465&view=diff
==============================================================================
--- lldb/trunk/source/Target/Process.cpp (original)
+++ lldb/trunk/source/Target/Process.cpp Fri May 15 13:40:24 2015
@@ -1548,10 +1548,24 @@ Process::UpdateThreadListIfNeeded ()
for (size_t i=0; i<num_old_threads; ++i)
old_thread_list.GetThreadAtIndex(i,
false)->ClearBackingThread();
+ // Turn off dynamic types to ensure we don't run any
expressions. Objective C
+ // can run an expression to determine if a SBValue is
a dynamic type or not
+ // and we need to avoid this. OperatingSystem plug-ins
can't run expressions
+ // that require running code...
+
+ Target &target = GetTarget();
+ const lldb::DynamicValueType saved_prefer_dynamic =
target.GetPreferDynamicValue ();
+ if (saved_prefer_dynamic != lldb::eNoDynamicValues)
+
target.SetPreferDynamicValue(lldb::eNoDynamicValues);
+
// Now let the OperatingSystem plug-in update the
thread list
+
os->UpdateThreadList (old_thread_list, // Old list
full of threads created by OS plug-in
real_thread_list, // The actual
thread list full of threads created by each lldb_private::Process subclass
new_thread_list); // The new
thread list that we will show to the user that gets filled in
+
+ if (saved_prefer_dynamic != lldb::eNoDynamicValues)
+ target.SetPreferDynamicValue(saved_prefer_dynamic);
}
else
{
Modified: lldb/trunk/source/Target/Target.cpp
URL:
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=237465&r1=237464&r2=237465&view=diff
==============================================================================
--- lldb/trunk/source/Target/Target.cpp (original)
+++ lldb/trunk/source/Target/Target.cpp Fri May 15 13:40:24 2015
@@ -3217,6 +3217,14 @@ TargetProperties::GetPreferDynamicValue(
}
bool
+TargetProperties::SetPreferDynamicValue (lldb::DynamicValueType d)
+{
+ const uint32_t idx = ePropertyPreferDynamic;
+ return m_collection_sp->SetPropertyAtIndexAsEnumeration(NULL, idx, d);
+}
+
+
+bool
TargetProperties::GetDisableASLR () const
{
const uint32_t idx = ePropertyDisableASLR;
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits