1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
"""
Test lldb data formatter subsystem.
"""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class StdFunctionTestCase(TestBase):
# Run frame var for a variable twice. Verify we do not hit the cache
# the first time but do the second time.
def run_frame_var_check_cache_use(
self, variable, result_to_match, skip_find_function=False
):
self.runCmd("log timers reset")
self.expect(
"frame variable " + variable, substrs=[variable + " = " + result_to_match]
)
if not skip_find_function:
self.expect(
"log timers dump", substrs=["lldb_private::CompileUnit::FindFunction"]
)
self.runCmd("log timers reset")
self.expect(
"frame variable " + variable, substrs=[variable + " = " + result_to_match]
)
self.expect(
"log timers dump",
matching=False,
substrs=["lldb_private::CompileUnit::FindFunction"],
)
def do_test(self):
"""Test that std::function is correctly printed by LLDB"""
self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
bkpt = self.target().FindBreakpointByID(
lldbutil.run_break_set_by_source_regexp(
self, "Set break point at this line."
)
)
self.runCmd("run", RUN_SUCCEEDED)
# The stop reason of the thread should be breakpoint.
self.expect(
"thread list",
STOPPED_DUE_TO_BREAKPOINT,
substrs=["stopped", "stop reason = breakpoint"],
)
self.run_frame_var_check_cache_use(
"foo2_f", "Lambda in File main.cpp at Line 16"
)
lldbutil.continue_to_breakpoint(self.process(), bkpt)
self.run_frame_var_check_cache_use(
"add_num2_f", "Lambda in File main.cpp at Line 9"
)
lldbutil.continue_to_breakpoint(self.process(), bkpt)
self.run_frame_var_check_cache_use("f2", "Lambda in File main.cpp at Line 26")
self.run_frame_var_check_cache_use(
"f3", "Lambda in File main.cpp at Line 30", True
)
# TODO reenable this case when std::function formatter supports
# general callable object case.
# self.run_frame_var_check_cache_use("f4", "Function in File main.cpp at Line 8")
# These cases won't hit the cache at all but also don't require
# an expensive lookup.
self.expect("frame variable f1", substrs=["f1 = Function = foo(int, int)"])
self.expect(
"frame variable f5", substrs=["f5 = Function = Bar::add_num(int) const"]
)
@add_test_categories(["libc++"])
def test_libcxx(self):
self.build(dictionary={"USE_LIBCPP": 1})
self.do_test()
|