File: TestLibCxxFunction.py

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,998,492 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (84 lines) | stat: -rw-r--r-- 2,847 bytes parent folder | download | duplicates (8)
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
"""
Test lldb data formatter subsystem.
"""


import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class LibCxxFunctionTestCase(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"],
        )

    @add_test_categories(["libc++"])
    def test(self):
        """Test that std::function as defined by libc++ is correctly printed by LLDB"""
        self.build()
        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 22"
        )

        lldbutil.continue_to_breakpoint(self.process(), bkpt)

        self.run_frame_var_check_cache_use(
            "add_num2_f", "Lambda in File main.cpp at Line 13"
        )

        lldbutil.continue_to_breakpoint(self.process(), bkpt)

        self.run_frame_var_check_cache_use("f2", "Lambda in File main.cpp at Line 35")
        self.run_frame_var_check_cache_use(
            "f3", "Lambda in File main.cpp at Line 39", 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"]
        )