summaryrefslogtreecommitdiff
path: root/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/function/TestDataFormatterStdFunction.py
blob: f4e0cd2f2b3dccc4294e647ed36fc3770c759733 (plain)
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()