Author: abhishek
Date: Mon Feb  1 03:01:42 2016
New Revision: 259344

URL: http://llvm.org/viewvc/llvm-project?rev=259344&view=rev
Log:
Set correct ThreadStopInfo in case of trace event

Summary:
 - The patch solves Bug 23478 and Bug 19311. Resolving
   Bug 23478 also resolves Bug 23039.
      Correct ThreadStopInfo is set for Linux and FreeBSD
      platforms.

 - Summary:
      When a trace event is reported, we need to check
      whether the trace event lands at a breakpoint site.

      If it lands at a breakpoint site then set the thread's
      StopInfo with the reason 'breakpoint'. Else, set the reason
      to be 'Trace'.

Change-Id: I0af9765e782fd74bc0cead41548486009f8abb87
Signed-off-by: Abhishek Aggarwal <abhishek.a.aggar...@intel.com>

Reviewers: jingham, emaste, lldb-commits, clayborg, ovyalov

Subscribers: emaste

Differential Revision: http://reviews.llvm.org/D16720

Modified:
    
lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/consecutive_breakpoints/TestConsecutiveBreakpoints.py
    
lldb/trunk/packages/Python/lldbsuite/test/functionalities/dynamic_value_child_count/TestDynamicValueChildCount.py
    lldb/trunk/source/Plugins/Process/FreeBSD/FreeBSDThread.cpp
    lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp

Modified: 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/consecutive_breakpoints/TestConsecutiveBreakpoints.py
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/consecutive_breakpoints/TestConsecutiveBreakpoints.py?rev=259344&r1=259343&r2=259344&view=diff
==============================================================================
--- 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/consecutive_breakpoints/TestConsecutiveBreakpoints.py
 (original)
+++ 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/consecutive_breakpoints/TestConsecutiveBreakpoints.py
 Mon Feb  1 03:01:42 2016
@@ -15,7 +15,6 @@ class ConsecutiveBreakpointsTestCase(Tes
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @expectedFailureAll("llvm.org/pr23478", oslist = not_in(["macosx"]))
     def test (self):
         self.build ()
         self.consecutive_breakpoints_tests()

Modified: 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/dynamic_value_child_count/TestDynamicValueChildCount.py
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/dynamic_value_child_count/TestDynamicValueChildCount.py?rev=259344&r1=259343&r2=259344&view=diff
==============================================================================
--- 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/dynamic_value_child_count/TestDynamicValueChildCount.py
 (original)
+++ 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/dynamic_value_child_count/TestDynamicValueChildCount.py
 Mon Feb  1 03:01:42 2016
@@ -31,10 +31,7 @@ class DynamicValueChildCountTestCase(Tes
         self.main_sixth_call_line = line_number('pass-to-base.cpp',
                                                        '// Break here and 
check b has 0 children again')
 
-    @expectedFailureLinux("llvm.org/pr23039")
-    @expectedFailureFreeBSD("llvm.org/pr19311") # continue at a breakpoint 
does not work
     @expectedFailureWindows("llvm.org/pr24663")
-    @expectedFailurei386("to be figured out")
     @add_test_categories(['pyapi'])
     def test_get_dynamic_vals(self):
         """Test fetching C++ dynamic values from pointers & references."""

Modified: lldb/trunk/source/Plugins/Process/FreeBSD/FreeBSDThread.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/FreeBSD/FreeBSDThread.cpp?rev=259344&r1=259343&r2=259344&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/FreeBSD/FreeBSDThread.cpp (original)
+++ lldb/trunk/source/Plugins/Process/FreeBSD/FreeBSDThread.cpp Mon Feb  1 
03:01:42 2016
@@ -558,22 +558,49 @@ FreeBSDThread::WatchNotify(const Process
 void
 FreeBSDThread::TraceNotify(const ProcessMessage &message)
 {
-    POSIXBreakpointProtocol* reg_ctx = GetPOSIXBreakpointProtocol();
-    if (reg_ctx)
+    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
+
+    // Try to resolve the breakpoint object corresponding to the current PC.
+    assert(GetRegisterContext());
+    lldb::addr_t pc = GetRegisterContext()->GetPC();
+    if (log)
+        log->Printf ("FreeBSDThread::%s () PC=0x%8.8" PRIx64, __FUNCTION__, 
pc);
+    lldb::BreakpointSiteSP 
bp_site(GetProcess()->GetBreakpointSiteList().FindByAddress(pc));
+
+    // If the current pc is a breakpoint site then set the StopInfo to 
Breakpoint.
+    // Otherwise, set the StopInfo to Watchpoint or Trace.
+    if (bp_site)
     {
-        uint32_t num_hw_wps = reg_ctx->NumSupportedHardwareWatchpoints();
-        uint32_t wp_idx;
-        for (wp_idx = 0; wp_idx < num_hw_wps; wp_idx++)
+        lldb::break_id_t bp_id = bp_site->GetID();
+        // If we have an operating system plug-in, we might have set a thread 
specific breakpoint using the
+        // operating system thread ID, so we can't make any assumptions about 
the thread ID so we must always
+        // report the breakpoint regardless of the thread.
+        if (bp_site->ValidForThisThread(this) || 
GetProcess()->GetOperatingSystem () != NULL)
+            SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID(*this, 
bp_id));
+        else
         {
-            if (reg_ctx->IsWatchpointHit(wp_idx))
+            const bool should_stop = false;
+            SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID(*this, 
bp_id, should_stop));
+        }
+    }
+    else
+    {
+        POSIXBreakpointProtocol* reg_ctx = GetPOSIXBreakpointProtocol();
+        if (reg_ctx)
+        {
+            uint32_t num_hw_wps = reg_ctx->NumSupportedHardwareWatchpoints();
+            uint32_t wp_idx;
+            for (wp_idx = 0; wp_idx < num_hw_wps; wp_idx++)
             {
-                WatchNotify(message);
-                return;
+                if (reg_ctx->IsWatchpointHit(wp_idx))
+                {
+                    WatchNotify(message);
+                    return;
+                }
             }
         }
+        SetStopInfo (StopInfo::CreateStopReasonToTrace(*this));
     }
-
-    SetStopInfo (StopInfo::CreateStopReasonToTrace(*this));
 }
 
 void

Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=259344&r1=259343&r2=259344&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Mon Feb  
1 03:01:42 2016
@@ -2001,7 +2001,27 @@ ProcessGDBRemote::SetThreadStopInfo (lld
                     {
                         if (reason.compare("trace") == 0)
                         {
-                            thread_sp->SetStopInfo 
(StopInfo::CreateStopReasonToTrace (*thread_sp));
+                            addr_t pc = 
thread_sp->GetRegisterContext()->GetPC();
+                            lldb::BreakpointSiteSP bp_site_sp = 
thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
+
+                            // If the current pc is a breakpoint site then the 
StopInfo should be set to Breakpoint
+                            // Otherwise, it will be set to Trace.
+                            if (bp_site_sp)
+                            {
+                                // If the breakpoint is for this thread, then 
we'll report the hit, but if it is for another thread,
+                                // we can just report no reason.
+                                if (bp_site_sp->ValidForThisThread 
(thread_sp.get()))
+                                {
+                                    thread_sp->SetStopInfo 
(StopInfo::CreateStopReasonWithBreakpointSiteID (*thread_sp, 
bp_site_sp->GetID()));
+                                }
+                                else
+                                {
+                                    StopInfoSP invalid_stop_info_sp;
+                                    thread_sp->SetStopInfo 
(invalid_stop_info_sp);
+                                }
+                            }
+                            else
+                              thread_sp->SetStopInfo 
(StopInfo::CreateStopReasonToTrace (*thread_sp));
                             handled = true;
                         }
                         else if (reason.compare("breakpoint") == 0)


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to