brucem updated this revision to Diff 107297.
brucem added a comment.

Update per comments.


https://reviews.llvm.org/D31283

Files:
  include/lldb/API/SBBreakpointLocation.h
  
packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_hit_count/Makefile
  
packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_hit_count/TestBreakpointHitCount.py
  
packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_hit_count/main.cpp
  scripts/interface/SBBreakpointLocation.i
  source/API/SBBreakpointLocation.cpp

Index: source/API/SBBreakpointLocation.cpp
===================================================================
--- source/API/SBBreakpointLocation.cpp
+++ source/API/SBBreakpointLocation.cpp
@@ -100,6 +100,16 @@
     return false;
 }
 
+uint32_t SBBreakpointLocation::GetHitCount() {
+  BreakpointLocationSP loc_sp = GetSP();
+  if (loc_sp) {
+    std::lock_guard<std::recursive_mutex> guard(
+        loc_sp->GetTarget().GetAPIMutex());
+    return loc_sp->GetHitCount();
+  } else
+    return 0;
+}
+
 uint32_t SBBreakpointLocation::GetIgnoreCount() {
   BreakpointLocationSP loc_sp = GetSP();
   if (loc_sp) {
Index: scripts/interface/SBBreakpointLocation.i
===================================================================
--- scripts/interface/SBBreakpointLocation.i
+++ scripts/interface/SBBreakpointLocation.i
@@ -48,6 +48,9 @@
     IsEnabled ();
 
     uint32_t
+    GetHitCount ();
+
+    uint32_t
     GetIgnoreCount ();
 
     void
Index: packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_hit_count/main.cpp
===================================================================
--- /dev/null
+++ packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_hit_count/main.cpp
@@ -0,0 +1,27 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int a(int val)
+{
+   return val; // Breakpoint Location 1
+}
+
+float a(float val)
+{
+    return val; // Breakpoint Location 2
+}
+
+int main (int argc, char const *argv[])
+{
+    int A1 = a(1);
+    float A2 = a(2.0f);
+    float A3 = a(3.0f);
+
+    return 0;
+}
Index: packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_hit_count/TestBreakpointHitCount.py
===================================================================
--- /dev/null
+++ packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_hit_count/TestBreakpointHitCount.py
@@ -0,0 +1,109 @@
+"""
+Test breakpoint hit count features.
+"""
+
+from __future__ import print_function
+
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class BreakpointHitCountTestCase(TestBase):
+
+    NO_DEBUG_INFO_TESTCASE = True
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    @add_test_categories(['pyapi'])
+    def test_breakpoint_location_hit_count(self):
+        """Use Python APIs to check breakpoint hit count."""
+        self.build()
+        self.do_test_breakpoint_location_hit_count()
+
+    def setUp(self):
+        # Call super's setUp().
+        TestBase.setUp(self)
+        self.a_int_body_line_no = line_number(
+            'main.cpp', '// Breakpoint Location 1')
+        self.a_float_body_line_no = line_number(
+            'main.cpp', '// Breakpoint Location 2')
+
+    def do_test_breakpoint_location_hit_count(self):
+        """Use Python APIs to check breakpoint hit count."""
+        exe = os.path.join(os.getcwd(), "a.out")
+
+        target = self.dbg.CreateTarget(exe)
+        self.assertTrue(target, VALID_TARGET)
+
+        # Create a breakpoint in main.cpp by name 'a',
+        # there should be two locations.
+        breakpoint = target.BreakpointCreateByName('a', 'a.out')
+        self.assertTrue(breakpoint and
+                        breakpoint.GetNumLocations() == 2,
+                        VALID_BREAKPOINT)
+
+        # Verify all breakpoint locations are enabled.
+        location1 = breakpoint.GetLocationAtIndex(0)
+        self.assertTrue(location1 and
+                        location1.IsEnabled(),
+                        VALID_BREAKPOINT_LOCATION)
+
+        location2 = breakpoint.GetLocationAtIndex(1)
+        self.assertTrue(location2 and
+                        location2.IsEnabled(),
+                        VALID_BREAKPOINT_LOCATION)
+
+        # Launch the process, and do not stop at entry point.
+        process = target.LaunchSimple(
+            None, None, self.get_process_working_directory())
+        self.assertTrue(process, PROCESS_IS_VALID)
+
+        # Verify 1st breakpoint location is hit.
+        from lldbsuite.test.lldbutil import get_stopped_thread
+        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+        self.assertTrue(
+            thread.IsValid(),
+            "There should be a thread stopped due to breakpoint")
+
+        frame0 = thread.GetFrameAtIndex(0)
+        location1 = breakpoint.FindLocationByAddress(frame0.GetPC())
+        self.assertTrue(
+            frame0.GetLineEntry().GetLine() == self.a_int_body_line_no,
+            "Stopped in int a(int)")
+        self.assertTrue(location1)
+        self.assertEqual(location1.GetHitCount(), 1)
+        self.assertEqual(breakpoint.GetHitCount(), 1)
+
+        process.Continue()
+
+        # Verify 2nd breakpoint location is hit.
+        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+        self.assertTrue(
+            thread.IsValid(),
+            "There should be a thread stopped due to breakpoint")
+
+        frame0 = thread.GetFrameAtIndex(0)
+        location2 = breakpoint.FindLocationByAddress(frame0.GetPC())
+        self.assertTrue(
+            frame0.GetLineEntry().GetLine() == self.a_float_body_line_no,
+            "Stopped in float a(float)")
+        self.assertTrue(location2)
+        self.assertEqual(location2.GetHitCount(), 1)
+        self.assertEqual(location1.GetHitCount(), 1)
+        self.assertEqual(breakpoint.GetHitCount(), 2)
+
+        process.Continue()
+
+        # Verify 2nd breakpoint location is hit again.
+        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+        self.assertTrue(
+            thread.IsValid(),
+            "There should be a thread stopped due to breakpoint")
+
+        self.assertEqual(location2.GetHitCount(), 2)
+        self.assertEqual(location1.GetHitCount(), 1)
+        self.assertEqual(breakpoint.GetHitCount(), 3)
+
+        process.Continue()
Index: packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_hit_count/Makefile
===================================================================
--- /dev/null
+++ packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_hit_count/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
Index: include/lldb/API/SBBreakpointLocation.h
===================================================================
--- include/lldb/API/SBBreakpointLocation.h
+++ include/lldb/API/SBBreakpointLocation.h
@@ -38,6 +38,8 @@
 
   bool IsEnabled();
 
+  uint32_t GetHitCount();
+
   uint32_t GetIgnoreCount();
 
   void SetIgnoreCount(uint32_t n);
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to