summaryrefslogtreecommitdiff
path: root/lldb/test/API/lang/cpp/std-function-recognizer
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/test/API/lang/cpp/std-function-recognizer')
-rw-r--r--lldb/test/API/lang/cpp/std-function-recognizer/Makefile4
-rw-r--r--lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py84
-rw-r--r--lldb/test/API/lang/cpp/std-function-recognizer/main.cpp10
3 files changed, 98 insertions, 0 deletions
diff --git a/lldb/test/API/lang/cpp/std-function-recognizer/Makefile b/lldb/test/API/lang/cpp/std-function-recognizer/Makefile
new file mode 100644
index 000000000000..ab034edd121f
--- /dev/null
+++ b/lldb/test/API/lang/cpp/std-function-recognizer/Makefile
@@ -0,0 +1,4 @@
+CXX_SOURCES := main.cpp
+USE_LIBCPP := 1
+
+include Makefile.rules
diff --git a/lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py b/lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py
new file mode 100644
index 000000000000..30fe3ecb1e4b
--- /dev/null
+++ b/lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py
@@ -0,0 +1,84 @@
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class LibCxxStdFunctionRecognizerTestCase(TestBase):
+ NO_DEBUG_INFO_TESTCASE = True
+
+ @add_test_categories(["libc++"])
+ def test_backtrace(self):
+ """Test that std::function implementation details are hidden in bt"""
+ self.build()
+ (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
+ self, "// break here", lldb.SBFileSpec("main.cpp")
+ )
+ # Filtered.
+ self.expect(
+ "thread backtrace",
+ ordered=True,
+ substrs=["frame", "foo", "frame", "main"],
+ )
+ self.expect(
+ "thread backtrace", matching=False, patterns=["frame.*std::__1::__function"]
+ )
+ # Unfiltered.
+ self.expect(
+ "thread backtrace -u",
+ ordered=True,
+ patterns=["frame.*foo", "frame.*std::__1::__function", "frame.*main"],
+ )
+ self.expect(
+ "thread backtrace --unfiltered",
+ ordered=True,
+ patterns=["frame.*foo", "frame.*std::__1::__function", "frame.*main"],
+ )
+
+ @add_test_categories(["libc++"])
+ def test_up_down(self):
+ """Test that std::function implementation details are skipped"""
+ self.build()
+ (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
+ self, "// break here", lldb.SBFileSpec("main.cpp")
+ )
+ frame = thread.GetSelectedFrame()
+ # up
+ self.assertIn("foo", frame.GetFunctionName())
+ start_idx = frame.GetFrameID()
+ i = 0
+ while i < thread.GetNumFrames():
+ self.expect("up")
+ frame = thread.GetSelectedFrame()
+ if frame.GetFunctionName() == "main":
+ break
+ end_idx = frame.GetFrameID()
+ self.assertLess(i, end_idx - start_idx, "skipped frames")
+
+ # Back down again.
+ start_idx = frame.GetFrameID()
+ for i in range(1, thread.GetNumFrames()):
+ self.expect("down")
+ frame = thread.GetSelectedFrame()
+ if "foo" in frame.GetFunctionName():
+ break
+ end_idx = frame.GetFrameID()
+ self.assertLess(i, start_idx - end_idx, "skipped frames")
+
+ @add_test_categories(["libc++"])
+ def test_api(self):
+ """Test that std::function implementation details are skipped"""
+ self.build()
+ (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
+ self, "// break here", lldb.SBFileSpec("main.cpp")
+ )
+ frame = thread.GetSelectedFrame()
+ num_hidden = 0
+ for i in range(1, thread.GetNumFrames()):
+ thread.SetSelectedFrame(i)
+ frame = thread.GetSelectedFrame()
+ if frame.IsHidden():
+ num_hidden += 1
+
+ self.assertGreater(num_hidden, 0)
+ self.assertLess(num_hidden, thread.GetNumFrames())
diff --git a/lldb/test/API/lang/cpp/std-function-recognizer/main.cpp b/lldb/test/API/lang/cpp/std-function-recognizer/main.cpp
new file mode 100644
index 000000000000..8cf4eaa2e519
--- /dev/null
+++ b/lldb/test/API/lang/cpp/std-function-recognizer/main.cpp
@@ -0,0 +1,10 @@
+#include <functional>
+
+int foo(int x, int y) {
+ return x * y; // break here
+}
+
+int main(int argc, char *argv[]) {
+ std::function<int(int, int)> fn = foo;
+ return fn(argc, 1);
+}