diff options
Diffstat (limited to 'lldb/test/API/lang/cpp')
4 files changed, 99 insertions, 0 deletions
diff --git a/lldb/test/API/lang/cpp/bitfields/TestCppBitfields.py b/lldb/test/API/lang/cpp/bitfields/TestCppBitfields.py index f796c635895a..dba1422a0d52 100644 --- a/lldb/test/API/lang/cpp/bitfields/TestCppBitfields.py +++ b/lldb/test/API/lang/cpp/bitfields/TestCppBitfields.py @@ -8,6 +8,7 @@ from lldbsuite.test import lldbutil class CppBitfieldsTestCase(TestBase): @no_debug_info_test + @skipIf(oslist=["windows"], bugnumber="github.com/llvm/llvm-project/issues/105019") def test_bitfields(self): self.build() lldbutil.run_to_source_breakpoint( 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); +} |
