[Lldb-commits] [lldb] r117341 - in /lldb/trunk: include/lldb/Target/StopInfo.h source/Target/ThreadPlanCallFunction.cpp

Jim Ingham jingham at apple.com
Mon Oct 25 17:27:45 PDT 2010


Author: jingham
Date: Mon Oct 25 19:27:45 2010
New Revision: 117341

URL: http://llvm.org/viewvc/llvm-project?rev=117341&view=rev
Log:
The call function thread plan should allow internal breakpoints to continue on.  Also made stopping
in mid-expression evaluation when we hit a breakpoint/signal work.

Modified:
    lldb/trunk/include/lldb/Target/StopInfo.h
    lldb/trunk/source/Target/ThreadPlanCallFunction.cpp

Modified: lldb/trunk/include/lldb/Target/StopInfo.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/StopInfo.h?rev=117341&r1=117340&r2=117341&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/StopInfo.h (original)
+++ lldb/trunk/include/lldb/Target/StopInfo.h Mon Oct 25 19:27:45 2010
@@ -46,6 +46,14 @@
         return m_thread;
     }
 
+    // The value of the StopInfo depends on the StopReason.
+    // StopReason                  Meaning
+    // ----------------------------------------------
+    // eStopReasonBreakpoint       BreakpointSiteID
+    // eStopReasonSignal           Signal number
+    // eStopReasonWatchpoint       WatchpointSiteID
+    // eStopReasonPlanComplete     No significance
+    
     uint64_t
     GetValue() const
     {

Modified: lldb/trunk/source/Target/ThreadPlanCallFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ThreadPlanCallFunction.cpp?rev=117341&r1=117340&r2=117341&view=diff
==============================================================================
--- lldb/trunk/source/Target/ThreadPlanCallFunction.cpp (original)
+++ lldb/trunk/source/Target/ThreadPlanCallFunction.cpp Mon Oct 25 19:27:45 2010
@@ -14,11 +14,14 @@
 // Other libraries and framework includes
 // Project includes
 #include "lldb/lldb-private-log.h"
+#include "lldb/Breakpoint/Breakpoint.h"
+#include "lldb/Breakpoint/BreakpointLocation.h"
 #include "lldb/Core/Address.h"
 #include "lldb/Core/Log.h"
 #include "lldb/Core/Stream.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/RegisterContext.h"
+#include "lldb/Target/StopInfo.h"
 #include "lldb/Target/Target.h"
 #include "lldb/Target/Thread.h"
 #include "lldb/Target/ThreadPlanRunToAddress.h"
@@ -171,9 +174,45 @@
 bool
 ThreadPlanCallFunction::PlanExplainsStop ()
 {
-    // If the subplan is running, any crashes are attributable to us.
+    // If our subplan knows why we stopped, even if it's done (which would forward the question to us)
+    // we answer yes.
+    if(m_subplan_sp.get() != NULL && m_subplan_sp->PlanExplainsStop())
+        return true;
     
-    return (m_subplan_sp.get() != NULL);
+    // If we don't want to discard this plan, than any stop we don't understand should be propagated up the stack.
+    if (!OkayToDiscard())
+        return false;
+            
+    // Otherwise, check the case where we stopped for an internal breakpoint, in that case, continue on.
+    // If it is not an internal breakpoint, consult OkayToDiscard.
+    lldb::StopInfoSP stop_info_sp = GetPrivateStopReason();
+    if (stop_info_sp && stop_info_sp->GetStopReason() == eStopReasonBreakpoint)
+    {
+        uint64_t break_site_id = stop_info_sp->GetValue();
+        lldb::BreakpointSiteSP bp_site_sp = m_thread.GetProcess().GetBreakpointSiteList().FindByID(break_site_id);
+        if (bp_site_sp)
+        {
+            uint32_t num_owners = bp_site_sp->GetNumberOfOwners();
+            bool is_internal = true;
+            for (uint32_t i = 0; i < num_owners; i++)
+            {
+                if (!bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint().IsInternal())
+                {
+                    is_internal = false;
+                    break;
+                }
+            }
+            if (is_internal)
+                return false;
+        }
+        
+        return OkayToDiscard();
+    }
+    else
+    {
+        // If the subplan is running, any crashes are attributable to us.
+        return (m_subplan_sp.get() != NULL);
+    }
 }
 
 bool





More information about the lldb-commits mailing list