jingham created this revision.
jingham added a reviewer: JDevlieghere.
jingham requested review of this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.
When Jonas made the change to not add demangled names to the name indexes, we
were worried it might cause breaking on overloaded functions to stop working.
But that's actually not true, anything that uses the Symbol::LookupInfo to
search names will do the right thing here, which includes
SBModule::FindFunctions and the breakpoint by name resolver. That does the job
of extracting the base name, finding potential matches, and then comparing the
demangled name of the match to the input string. It's still the case that the
names must match exactly.
Anyway, in the course of proving this to myself I wrote a little test for
simple overloaded name breakpoints.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D119997
Files:
lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/Makefile
lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/TestBreakOnOverload.py
lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/main.cpp
Index: lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/main.cpp
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/main.cpp
@@ -0,0 +1,29 @@
+int a_function(int x) {
+ return x * x;
+}
+
+int a_function(double x) {
+ return static_cast<int>(x * x);
+}
+
+int a_function(double x, int y) {
+ return y * y;
+}
+
+int a_function(int x, double y) {
+ return static_cast<int>(y * y);
+}
+
+int main(int argc, char const *argv[]) {
+ // This is a random comment.
+
+ int int_val = 20;
+ double double_val = 20.0;
+
+ int result = a_function(int_val);
+ result += a_function(double_val);
+ result += a_function(double_val, int_val);
+ result += a_function(int_val, double_val);
+
+ return result;
+}
Index:
lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/TestBreakOnOverload.py
===================================================================
--- /dev/null
+++
lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/TestBreakOnOverload.py
@@ -0,0 +1,32 @@
+"""
+Test setting a breakpoint on an overloaded function by name.
+"""
+
+import re
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestBreakpointOnOverload(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def check_breakpoint(self, name):
+ bkpt = self.target.BreakpointCreateByName(name)
+ self.assertEqual(bkpt.num_locations, 1, "Got one location")
+ addr = bkpt.locations[0].GetAddress()
+ self.assertTrue(addr.function.IsValid(), "Got a real function")
+ self.assertEqual(addr.function.name, name, "Got the right name")
+
+ def test_break_on_overload(self):
+ self.build()
+ self.target = lldbutil.run_to_breakpoint_make_target(self)
+ self.check_breakpoint("a_function(int)")
+ self.check_breakpoint("a_function(double)")
+ self.check_breakpoint("a_function(int, double)")
+ self.check_breakpoint("a_function(double, int)")
+
+
+
Index: lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/Makefile
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/Makefile
@@ -0,0 +1,4 @@
+CXX_SOURCES := main.cpp
+CXXFLAGS_EXTRAS := -std=c++14
+
+include Makefile.rules
Index: lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/main.cpp
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/main.cpp
@@ -0,0 +1,29 @@
+int a_function(int x) {
+ return x * x;
+}
+
+int a_function(double x) {
+ return static_cast<int>(x * x);
+}
+
+int a_function(double x, int y) {
+ return y * y;
+}
+
+int a_function(int x, double y) {
+ return static_cast<int>(y * y);
+}
+
+int main(int argc, char const *argv[]) {
+ // This is a random comment.
+
+ int int_val = 20;
+ double double_val = 20.0;
+
+ int result = a_function(int_val);
+ result += a_function(double_val);
+ result += a_function(double_val, int_val);
+ result += a_function(int_val, double_val);
+
+ return result;
+}
Index: lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/TestBreakOnOverload.py
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/TestBreakOnOverload.py
@@ -0,0 +1,32 @@
+"""
+Test setting a breakpoint on an overloaded function by name.
+"""
+
+import re
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestBreakpointOnOverload(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def check_breakpoint(self, name):
+ bkpt = self.target.BreakpointCreateByName(name)
+ self.assertEqual(bkpt.num_locations, 1, "Got one location")
+ addr = bkpt.locations[0].GetAddress()
+ self.assertTrue(addr.function.IsValid(), "Got a real function")
+ self.assertEqual(addr.function.name, name, "Got the right name")
+
+ def test_break_on_overload(self):
+ self.build()
+ self.target = lldbutil.run_to_breakpoint_make_target(self)
+ self.check_breakpoint("a_function(int)")
+ self.check_breakpoint("a_function(double)")
+ self.check_breakpoint("a_function(int, double)")
+ self.check_breakpoint("a_function(double, int)")
+
+
+
Index: lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/Makefile
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/breakpoint/breakpoint_on_overload/Makefile
@@ -0,0 +1,4 @@
+CXX_SOURCES := main.cpp
+CXXFLAGS_EXTRAS := -std=c++14
+
+include Makefile.rules
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits