Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adding support to step into the callable wrapped by libc++ std::function
rdar://problem/14365983 Differential Revision: https://reviews.llvm.org/D52851 llvm-svn: 344371
- Loading branch information
Showing
6 changed files
with
213 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
lldb/packages/Python/lldbsuite/test/lang/cpp/std-function-step-into-callable/Makefile
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
LEVEL = ../../../make | ||
|
||
CXX_SOURCES := main.cpp | ||
CXXFLAGS += -std=c++11 | ||
USE_LIBCPP := 1 | ||
|
||
include $(LEVEL)/Makefile.rules |
71 changes: 71 additions & 0 deletions
71
...ldbsuite/test/lang/cpp/std-function-step-into-callable/TestStdFunctionStepIntoCallable.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
""" | ||
Test stepping into std::function | ||
""" | ||
|
||
from __future__ import print_function | ||
|
||
|
||
import lldb | ||
import sys | ||
from lldbsuite.test.decorators import * | ||
from lldbsuite.test.lldbtest import * | ||
from lldbsuite.test import lldbutil | ||
|
||
|
||
class LibCxxFunctionTestCase(TestBase): | ||
|
||
mydir = TestBase.compute_mydir(__file__) | ||
|
||
NO_DEBUG_INFO_TESTCASE = True | ||
|
||
@add_test_categories(["libc++"]) | ||
def test(self): | ||
"""Test that std::function as defined by libc++ is correctly printed by LLDB""" | ||
self.build() | ||
|
||
self.main_source = "main.cpp" | ||
self.main_source_spec = lldb.SBFileSpec(self.main_source) | ||
self.source_foo_line = line_number( | ||
self.main_source, '// Source foo start line') | ||
self.source_lambda_f2_line = line_number( | ||
self.main_source, '// Source lambda used by f2 start line') | ||
self.source_lambda_f3_line = line_number( | ||
self.main_source, '// Source lambda used by f3 start line') | ||
self.source_bar_operator_line = line_number( | ||
self.main_source, '// Source Bar::operator()() start line') | ||
self.source_bar_add_num_line = line_number( | ||
self.main_source, '// Source Bar::add_num start line') | ||
self.source_main_invoking_f1 = line_number( | ||
self.main_source, '// Source main invoking f1') | ||
|
||
(target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( | ||
self, "// Set break point at this line.", self.main_source_spec) | ||
|
||
thread.StepInto() | ||
self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_main_invoking_f1 ) ; | ||
self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; | ||
|
||
thread.StepInto() | ||
self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_foo_line ) ; | ||
self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; | ||
process.Continue() | ||
|
||
thread.StepInto() | ||
self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_lambda_f2_line ) ; | ||
self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; | ||
process.Continue() | ||
|
||
thread.StepInto() | ||
self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_lambda_f3_line ) ; | ||
self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; | ||
process.Continue() | ||
|
||
thread.StepInto() | ||
self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_bar_operator_line ) ; | ||
self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; | ||
process.Continue() | ||
|
||
thread.StepInto() | ||
self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_bar_add_num_line ) ; | ||
self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; | ||
process.Continue() |
38 changes: 38 additions & 0 deletions
38
lldb/packages/Python/lldbsuite/test/lang/cpp/std-function-step-into-callable/main.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
#include <functional> | ||
|
||
int foo(int x, int y) { | ||
return x + y - 1; // Source foo start line | ||
} | ||
|
||
struct Bar { | ||
int operator()() { | ||
return 66 ; // Source Bar::operator()() start line | ||
} | ||
int add_num(int i) const { return i + 3 ; } // Source Bar::add_num start line | ||
int num_ = 0 ; | ||
} ; | ||
|
||
int main (int argc, char *argv[]) | ||
{ | ||
int acc = 42; | ||
std::function<int (int,int)> f1 = foo; | ||
std::function<int (int)> f2 = [acc,f1] (int x) -> int { | ||
return x+f1(acc,x); // Source lambda used by f2 start line | ||
}; | ||
|
||
auto f = [](int x, int y) { return x + y; }; // Source lambda used by f3 start line | ||
auto g = [](int x, int y) { return x * y; } ; | ||
std::function<int (int,int)> f3 = argc %2 ? f : g ; | ||
|
||
Bar bar1 ; | ||
std::function<int ()> f4( bar1 ) ; | ||
std::function<int (const Bar&, int)> f5 = &Bar::add_num; | ||
std::function<int(Bar const&)> f_mem = &Bar::num_; | ||
|
||
return f_mem(bar1) + // Set break point at this line. | ||
f1(acc,acc) + // Source main invoking f1 | ||
f2(acc) + // Set break point at this line. | ||
f3(acc+1,acc+2) + // Set break point at this line. | ||
f4() + // Set break point at this line. | ||
f5(bar1, 10); // Set break point at this line. | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters