xref: /llvm-project/lldb/test/API/commands/frame/recognizer/TestFrameRecognizer.py (revision 7293455cf292cfaa263ea04fc1bc2aee4ceab6a6)
199451b44SJordan Rupprecht# encoding: utf-8
299451b44SJordan Rupprecht"""
399451b44SJordan RupprechtTest lldb's frame recognizers.
499451b44SJordan Rupprecht"""
599451b44SJordan Rupprecht
699451b44SJordan Rupprechtimport lldb
799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprechtimport recognizer
1299451b44SJordan Rupprecht
132238dcc3SJonas Devlieghere
1499451b44SJordan Rupprechtclass FrameRecognizerTestCase(TestBase):
1599451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht    def test_frame_recognizer_1(self):
1899451b44SJordan Rupprecht        self.build()
19db31e2e1SMed Ismail Bennani        exe = self.getBuildArtifact("a.out")
20d8d252feSAdrian Vogelsgesang        target, process, thread, _ = lldbutil.run_to_name_breakpoint(
21d8d252feSAdrian Vogelsgesang            self, "foo", exe_name=exe
22d8d252feSAdrian Vogelsgesang        )
23*7293455cSDave Lee        frame = thread.selected_frame
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht        # Clear internal & plugins recognizers that get initialized at launch
2699451b44SJordan Rupprecht        self.runCmd("frame recognizer clear")
2799451b44SJordan Rupprecht
282238dcc3SJonas Devlieghere        self.runCmd(
292238dcc3SJonas Devlieghere            "command script import "
302238dcc3SJonas Devlieghere            + os.path.join(self.getSourceDir(), "recognizer.py")
312238dcc3SJonas Devlieghere        )
3299451b44SJordan Rupprecht
332238dcc3SJonas Devlieghere        self.expect("frame recognizer list", substrs=["no matching results found."])
3499451b44SJordan Rupprecht
352238dcc3SJonas Devlieghere        self.runCmd(
362238dcc3SJonas Devlieghere            "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo"
372238dcc3SJonas Devlieghere        )
3899451b44SJordan Rupprecht
392238dcc3SJonas Devlieghere        self.expect(
402238dcc3SJonas Devlieghere            "frame recognizer list",
41dd060bdeSAdrian Vogelsgesang            substrs=[
42dd060bdeSAdrian Vogelsgesang                "0: recognizer.MyFrameRecognizer, module a.out, demangled symbol foo"
43dd060bdeSAdrian Vogelsgesang            ],
442238dcc3SJonas Devlieghere        )
4599451b44SJordan Rupprecht
462238dcc3SJonas Devlieghere        self.runCmd(
472238dcc3SJonas Devlieghere            "frame recognizer add -l recognizer.MyOtherFrameRecognizer -s a.out -n bar -x"
482238dcc3SJonas Devlieghere        )
4999451b44SJordan Rupprecht
5099451b44SJordan Rupprecht        self.expect(
5199451b44SJordan Rupprecht            "frame recognizer list",
5299451b44SJordan Rupprecht            substrs=[
53dd060bdeSAdrian Vogelsgesang                "1: recognizer.MyOtherFrameRecognizer, module a.out, demangled symbol regex bar",
54dd060bdeSAdrian Vogelsgesang                "0: recognizer.MyFrameRecognizer, module a.out, demangled symbol foo",
552238dcc3SJonas Devlieghere            ],
562238dcc3SJonas Devlieghere        )
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht        self.runCmd("frame recognizer delete 0")
5999451b44SJordan Rupprecht
605477fbc2SRaphael Isemann        # Test that it deleted the recognizer with id 0.
612238dcc3SJonas Devlieghere        self.expect(
622238dcc3SJonas Devlieghere            "frame recognizer list",
632238dcc3SJonas Devlieghere            substrs=[
64fc517973SAdrian Vogelsgesang                "1: recognizer.MyOtherFrameRecognizer, module a.out, demangled symbol regex bar"
652238dcc3SJonas Devlieghere            ],
662238dcc3SJonas Devlieghere        )
672238dcc3SJonas Devlieghere        self.expect(
682238dcc3SJonas Devlieghere            "frame recognizer list", matching=False, substrs=["MyFrameRecognizer"]
692238dcc3SJonas Devlieghere        )
705477fbc2SRaphael Isemann
715477fbc2SRaphael Isemann        # Test that an invalid index and deleting the same index again
725477fbc2SRaphael Isemann        # is an error and doesn't do any changes.
732238dcc3SJonas Devlieghere        self.expect(
742238dcc3SJonas Devlieghere            "frame recognizer delete 2",
752238dcc3SJonas Devlieghere            error=True,
762238dcc3SJonas Devlieghere            substrs=["error: '2' is not a valid recognizer id."],
772238dcc3SJonas Devlieghere        )
782238dcc3SJonas Devlieghere        self.expect(
792238dcc3SJonas Devlieghere            "frame recognizer delete 0",
802238dcc3SJonas Devlieghere            error=True,
812238dcc3SJonas Devlieghere            substrs=["error: '0' is not a valid recognizer id."],
822238dcc3SJonas Devlieghere        )
835477fbc2SRaphael Isemann        # Recognizers should have the same state as above.
842238dcc3SJonas Devlieghere        self.expect(
852238dcc3SJonas Devlieghere            "frame recognizer list",
862238dcc3SJonas Devlieghere            substrs=[
87fc517973SAdrian Vogelsgesang                "1: recognizer.MyOtherFrameRecognizer, module a.out, demangled symbol regex bar"
882238dcc3SJonas Devlieghere            ],
892238dcc3SJonas Devlieghere        )
902238dcc3SJonas Devlieghere        self.expect(
912238dcc3SJonas Devlieghere            "frame recognizer list", matching=False, substrs=["MyFrameRecognizer"]
922238dcc3SJonas Devlieghere        )
9399451b44SJordan Rupprecht
9499451b44SJordan Rupprecht        self.runCmd("frame recognizer clear")
9599451b44SJordan Rupprecht
962238dcc3SJonas Devlieghere        self.expect("frame recognizer list", substrs=["no matching results found."])
9799451b44SJordan Rupprecht
982238dcc3SJonas Devlieghere        self.runCmd(
992238dcc3SJonas Devlieghere            "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo"
1002238dcc3SJonas Devlieghere        )
10199451b44SJordan Rupprecht
1022238dcc3SJonas Devlieghere        self.expect("frame variable", substrs=["(int) a = 42", "(int) b = 56"])
10399451b44SJordan Rupprecht
10499451b44SJordan Rupprecht        # Recognized arguments don't show up by default...
10599451b44SJordan Rupprecht        variables = frame.GetVariables(lldb.SBVariablesOptions())
10699451b44SJordan Rupprecht        self.assertEqual(variables.GetSize(), 0)
10799451b44SJordan Rupprecht
10899451b44SJordan Rupprecht        # ...unless you set target.display-recognized-arguments to 1...
10999451b44SJordan Rupprecht        self.runCmd("settings set target.display-recognized-arguments 1")
11099451b44SJordan Rupprecht        variables = frame.GetVariables(lldb.SBVariablesOptions())
11199451b44SJordan Rupprecht        self.assertEqual(variables.GetSize(), 2)
11299451b44SJordan Rupprecht
11399451b44SJordan Rupprecht        # ...and you can reset it back to 0 to hide them again...
11499451b44SJordan Rupprecht        self.runCmd("settings set target.display-recognized-arguments 0")
11599451b44SJordan Rupprecht        variables = frame.GetVariables(lldb.SBVariablesOptions())
11699451b44SJordan Rupprecht        self.assertEqual(variables.GetSize(), 0)
11799451b44SJordan Rupprecht
11899451b44SJordan Rupprecht        # ... or explicitly ask for them with SetIncludeRecognizedArguments(True).
11999451b44SJordan Rupprecht        opts = lldb.SBVariablesOptions()
12099451b44SJordan Rupprecht        opts.SetIncludeRecognizedArguments(True)
12199451b44SJordan Rupprecht        variables = frame.GetVariables(opts)
12299451b44SJordan Rupprecht
12399451b44SJordan Rupprecht        self.assertEqual(variables.GetSize(), 2)
12499451b44SJordan Rupprecht        self.assertEqual(variables.GetValueAtIndex(0).name, "a")
12599451b44SJordan Rupprecht        self.assertEqual(variables.GetValueAtIndex(0).signed, 42)
1262238dcc3SJonas Devlieghere        self.assertEqual(
1272238dcc3SJonas Devlieghere            variables.GetValueAtIndex(0).GetValueType(), lldb.eValueTypeVariableArgument
1282238dcc3SJonas Devlieghere        )
12999451b44SJordan Rupprecht        self.assertEqual(variables.GetValueAtIndex(1).name, "b")
13099451b44SJordan Rupprecht        self.assertEqual(variables.GetValueAtIndex(1).signed, 56)
1312238dcc3SJonas Devlieghere        self.assertEqual(
1322238dcc3SJonas Devlieghere            variables.GetValueAtIndex(1).GetValueType(), lldb.eValueTypeVariableArgument
1332238dcc3SJonas Devlieghere        )
13499451b44SJordan Rupprecht
1352238dcc3SJonas Devlieghere        self.expect(
1362238dcc3SJonas Devlieghere            "frame recognizer info 0",
1372238dcc3SJonas Devlieghere            substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"],
1382238dcc3SJonas Devlieghere        )
13999451b44SJordan Rupprecht
1402238dcc3SJonas Devlieghere        self.expect(
1412238dcc3SJonas Devlieghere            "frame recognizer info 999", error=True, substrs=["no frame with index 999"]
1422238dcc3SJonas Devlieghere        )
14399451b44SJordan Rupprecht
1442238dcc3SJonas Devlieghere        self.expect(
1452238dcc3SJonas Devlieghere            "frame recognizer info 1",
1462238dcc3SJonas Devlieghere            substrs=["frame 1 not recognized by any recognizer"],
1472238dcc3SJonas Devlieghere        )
14899451b44SJordan Rupprecht
14999451b44SJordan Rupprecht        # FIXME: The following doesn't work yet, but should be fixed.
15099451b44SJordan Rupprecht        """
151db31e2e1SMed Ismail Bennani        target, process, thread, _ = lldbutil.run_to_name_breakpoint(self, "bar",
152db31e2e1SMed Ismail Bennani                                                                 exe_name = exe)
153db31e2e1SMed Ismail Bennani        frame = thread.GetSelectedFrame()
15499451b44SJordan Rupprecht
15599451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
15699451b44SJordan Rupprecht                    substrs=['stopped', 'stop reason = breakpoint'])
15799451b44SJordan Rupprecht
15899451b44SJordan Rupprecht        self.expect("frame variable -t",
15999451b44SJordan Rupprecht                    substrs=['(int *) a = '])
16099451b44SJordan Rupprecht
16199451b44SJordan Rupprecht        self.expect("frame variable -t *a",
16299451b44SJordan Rupprecht                    substrs=['*a = 78'])
16399451b44SJordan Rupprecht        """
164db31e2e1SMed Ismail Bennani
1653c0fba4fSAdrian Prantl    def test_frame_recognizer_hiding(self):
1663c0fba4fSAdrian Prantl        self.build()
1673c0fba4fSAdrian Prantl
1683c0fba4fSAdrian Prantl        target, process, thread, _ = lldbutil.run_to_name_breakpoint(self, "nested")
169*7293455cSDave Lee        frame = thread.selected_frame
1703c0fba4fSAdrian Prantl
1713c0fba4fSAdrian Prantl        # Sanity check.
1723c0fba4fSAdrian Prantl        self.expect(
1733c0fba4fSAdrian Prantl            "thread backtrace", patterns=["frame.*nested", "frame.*baz", "frame.*main"]
1743c0fba4fSAdrian Prantl        )
1753c0fba4fSAdrian Prantl
1763c0fba4fSAdrian Prantl        self.expect("frame recognizer clear")
1773c0fba4fSAdrian Prantl        self.expect(
1783c0fba4fSAdrian Prantl            "command script import "
1793c0fba4fSAdrian Prantl            + os.path.join(self.getSourceDir(), "recognizer.py")
1803c0fba4fSAdrian Prantl        )
1813c0fba4fSAdrian Prantl
1823c0fba4fSAdrian Prantl        self.expect(
1833c0fba4fSAdrian Prantl            "frame recognizer add -l recognizer.BazFrameRecognizer -f false -s a.out -n baz"
1843c0fba4fSAdrian Prantl        )
1853c0fba4fSAdrian Prantl
1863c0fba4fSAdrian Prantl        self.expect(
1873c0fba4fSAdrian Prantl            "frame recognizer list",
1883c0fba4fSAdrian Prantl            substrs=["0: recognizer.BazFrameRecognizer"],
1893c0fba4fSAdrian Prantl        )
1903c0fba4fSAdrian Prantl
1913c0fba4fSAdrian Prantl        # Now main should be hidden.
1923c0fba4fSAdrian Prantl        self.expect("thread backtrace", matching=False, patterns=["frame.*baz"])
1933c0fba4fSAdrian Prantl        self.assertFalse(frame.IsHidden())
1943c0fba4fSAdrian Prantl        frame = thread.SetSelectedFrame(1)
1953c0fba4fSAdrian Prantl        self.assertIn("baz", frame.name)
1963c0fba4fSAdrian Prantl        self.assertTrue(frame.IsHidden())
1973c0fba4fSAdrian Prantl
1983c0fba4fSAdrian Prantl        # Test StepOut.
1993c0fba4fSAdrian Prantl        frame = thread.SetSelectedFrame(0)
2003c0fba4fSAdrian Prantl        thread.StepOut()
2013c0fba4fSAdrian Prantl        frame = thread.GetSelectedFrame()
2023c0fba4fSAdrian Prantl        self.assertIn("main", frame.name)
2033c0fba4fSAdrian Prantl
204db31e2e1SMed Ismail Bennani    def test_frame_recognizer_multi_symbol(self):
205db31e2e1SMed Ismail Bennani        self.build()
206db31e2e1SMed Ismail Bennani        exe = self.getBuildArtifact("a.out")
207db31e2e1SMed Ismail Bennani
208db31e2e1SMed Ismail Bennani        # Clear internal & plugins recognizers that get initialized at launch
209db31e2e1SMed Ismail Bennani        self.runCmd("frame recognizer clear")
210db31e2e1SMed Ismail Bennani
2112238dcc3SJonas Devlieghere        self.runCmd(
2122238dcc3SJonas Devlieghere            "command script import "
2132238dcc3SJonas Devlieghere            + os.path.join(self.getSourceDir(), "recognizer.py")
2142238dcc3SJonas Devlieghere        )
215db31e2e1SMed Ismail Bennani
2162238dcc3SJonas Devlieghere        self.expect("frame recognizer list", substrs=["no matching results found."])
217db31e2e1SMed Ismail Bennani
2182238dcc3SJonas Devlieghere        self.runCmd(
2192238dcc3SJonas Devlieghere            "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar"
2202238dcc3SJonas Devlieghere        )
221db31e2e1SMed Ismail Bennani
2222238dcc3SJonas Devlieghere        self.expect(
2232238dcc3SJonas Devlieghere            "frame recognizer list",
2242238dcc3SJonas Devlieghere            substrs=[
225dd060bdeSAdrian Vogelsgesang                "recognizer.MyFrameRecognizer, module a.out, demangled symbol foo, bar"
2262238dcc3SJonas Devlieghere            ],
2272238dcc3SJonas Devlieghere        )
228db31e2e1SMed Ismail Bennani
2292238dcc3SJonas Devlieghere        target, process, thread, _ = lldbutil.run_to_name_breakpoint(
2302238dcc3SJonas Devlieghere            self, "foo", exe_name=exe
2312238dcc3SJonas Devlieghere        )
232db31e2e1SMed Ismail Bennani
2332238dcc3SJonas Devlieghere        self.expect(
2342238dcc3SJonas Devlieghere            "frame recognizer info 0",
2352238dcc3SJonas Devlieghere            substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"],
2362238dcc3SJonas Devlieghere        )
237db31e2e1SMed Ismail Bennani
2382238dcc3SJonas Devlieghere        target, process, thread, _ = lldbutil.run_to_name_breakpoint(
2392238dcc3SJonas Devlieghere            self, "bar", exe_name=exe
2402238dcc3SJonas Devlieghere        )
241db31e2e1SMed Ismail Bennani
2422238dcc3SJonas Devlieghere        self.expect(
2432238dcc3SJonas Devlieghere            "frame recognizer info 0",
2442238dcc3SJonas Devlieghere            substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"],
2452238dcc3SJonas Devlieghere        )
2469010cef2SRaphael Isemann
2471b7c9eaeSRaphael Isemann    def test_frame_recognizer_target_specific(self):
2481b7c9eaeSRaphael Isemann        self.build()
2491b7c9eaeSRaphael Isemann        exe = self.getBuildArtifact("a.out")
2501b7c9eaeSRaphael Isemann
2511b7c9eaeSRaphael Isemann        # Clear internal & plugins recognizers that get initialized at launch
2521b7c9eaeSRaphael Isemann        self.runCmd("frame recognizer clear")
2531b7c9eaeSRaphael Isemann
2541b7c9eaeSRaphael Isemann        # Create a target.
2552238dcc3SJonas Devlieghere        target, process, thread, _ = lldbutil.run_to_name_breakpoint(
2562238dcc3SJonas Devlieghere            self, "foo", exe_name=exe
2572238dcc3SJonas Devlieghere        )
2581b7c9eaeSRaphael Isemann
2592238dcc3SJonas Devlieghere        self.runCmd(
2602238dcc3SJonas Devlieghere            "command script import "
2612238dcc3SJonas Devlieghere            + os.path.join(self.getSourceDir(), "recognizer.py")
2622238dcc3SJonas Devlieghere        )
2631b7c9eaeSRaphael Isemann
2641b7c9eaeSRaphael Isemann        # Check that this doesn't contain our own FrameRecognizer somehow.
2652238dcc3SJonas Devlieghere        self.expect(
2662238dcc3SJonas Devlieghere            "frame recognizer list", matching=False, substrs=["MyFrameRecognizer"]
2672238dcc3SJonas Devlieghere        )
2681b7c9eaeSRaphael Isemann
2691b7c9eaeSRaphael Isemann        # Add a frame recognizer in that target.
2702238dcc3SJonas Devlieghere        self.runCmd(
2712238dcc3SJonas Devlieghere            "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar"
2722238dcc3SJonas Devlieghere        )
2731b7c9eaeSRaphael Isemann
2742238dcc3SJonas Devlieghere        self.expect(
2752238dcc3SJonas Devlieghere            "frame recognizer list",
2762238dcc3SJonas Devlieghere            substrs=[
277dd060bdeSAdrian Vogelsgesang                "recognizer.MyFrameRecognizer, module a.out, demangled symbol foo, bar"
2782238dcc3SJonas Devlieghere            ],
2792238dcc3SJonas Devlieghere        )
2801b7c9eaeSRaphael Isemann
2812238dcc3SJonas Devlieghere        self.expect(
2822238dcc3SJonas Devlieghere            "frame recognizer info 0",
2832238dcc3SJonas Devlieghere            substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"],
2842238dcc3SJonas Devlieghere        )
2851b7c9eaeSRaphael Isemann
2861b7c9eaeSRaphael Isemann        # Create a second target. That one shouldn't have the frame recognizer.
2872238dcc3SJonas Devlieghere        target, process, thread, _ = lldbutil.run_to_name_breakpoint(
2882238dcc3SJonas Devlieghere            self, "bar", exe_name=exe
2892238dcc3SJonas Devlieghere        )
2901b7c9eaeSRaphael Isemann
2912238dcc3SJonas Devlieghere        self.expect(
2922238dcc3SJonas Devlieghere            "frame recognizer info 0",
2932238dcc3SJonas Devlieghere            substrs=["frame 0 not recognized by any recognizer"],
2942238dcc3SJonas Devlieghere        )
2951b7c9eaeSRaphael Isemann
2961b7c9eaeSRaphael Isemann        # Add a frame recognizer to the new target.
2972238dcc3SJonas Devlieghere        self.runCmd(
2982238dcc3SJonas Devlieghere            "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n bar"
2992238dcc3SJonas Devlieghere        )
3001b7c9eaeSRaphael Isemann
3012238dcc3SJonas Devlieghere        self.expect(
3022238dcc3SJonas Devlieghere            "frame recognizer list",
303dd060bdeSAdrian Vogelsgesang            substrs=[
304dd060bdeSAdrian Vogelsgesang                "recognizer.MyFrameRecognizer, module a.out, demangled symbol bar"
305dd060bdeSAdrian Vogelsgesang            ],
3062238dcc3SJonas Devlieghere        )
3071b7c9eaeSRaphael Isemann
3081b7c9eaeSRaphael Isemann        # Now the new target should also recognize the frame.
3092238dcc3SJonas Devlieghere        self.expect(
3102238dcc3SJonas Devlieghere            "frame recognizer info 0",
3112238dcc3SJonas Devlieghere            substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"],
3122238dcc3SJonas Devlieghere        )
3131b7c9eaeSRaphael Isemann
31454c496daSRoman Podoliaka    def test_frame_recognizer_not_only_first_instruction(self):
31554c496daSRoman Podoliaka        self.build()
31654c496daSRoman Podoliaka        exe = self.getBuildArtifact("a.out")
31754c496daSRoman Podoliaka
31854c496daSRoman Podoliaka        # Clear internal & plugins recognizers that get initialized at launch.
31954c496daSRoman Podoliaka        self.runCmd("frame recognizer clear")
32054c496daSRoman Podoliaka
3212238dcc3SJonas Devlieghere        self.runCmd(
3222238dcc3SJonas Devlieghere            "command script import "
3232238dcc3SJonas Devlieghere            + os.path.join(self.getSourceDir(), "recognizer.py")
3242238dcc3SJonas Devlieghere        )
32554c496daSRoman Podoliaka
3262238dcc3SJonas Devlieghere        self.expect("frame recognizer list", substrs=["no matching results found."])
32754c496daSRoman Podoliaka
32854c496daSRoman Podoliaka        # Create a target.
3292238dcc3SJonas Devlieghere        target, process, thread, _ = lldbutil.run_to_name_breakpoint(
3302238dcc3SJonas Devlieghere            self, "foo", exe_name=exe
3312238dcc3SJonas Devlieghere        )
33254c496daSRoman Podoliaka
33354c496daSRoman Podoliaka        # Move the PC one instruction further.
33454c496daSRoman Podoliaka        self.runCmd("next")
33554c496daSRoman Podoliaka
33654c496daSRoman Podoliaka        # Add a frame recognizer in that target.
3372238dcc3SJonas Devlieghere        self.runCmd(
3382238dcc3SJonas Devlieghere            "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar"
3392238dcc3SJonas Devlieghere        )
34054c496daSRoman Podoliaka
34154c496daSRoman Podoliaka        # It's not applied to foo(), because frame's PC is not at the first instruction of the function.
3422238dcc3SJonas Devlieghere        self.expect(
3432238dcc3SJonas Devlieghere            "frame recognizer info 0",
3442238dcc3SJonas Devlieghere            substrs=["frame 0 not recognized by any recognizer"],
3452238dcc3SJonas Devlieghere        )
34654c496daSRoman Podoliaka
34754c496daSRoman Podoliaka        # Add a frame recognizer with --first-instruction-only=true.
34854c496daSRoman Podoliaka        self.runCmd("frame recognizer clear")
34954c496daSRoman Podoliaka
3502238dcc3SJonas Devlieghere        self.runCmd(
3512238dcc3SJonas Devlieghere            "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar --first-instruction-only=true"
3522238dcc3SJonas Devlieghere        )
35354c496daSRoman Podoliaka
35454c496daSRoman Podoliaka        # It's not applied to foo(), because frame's PC is not at the first instruction of the function.
3552238dcc3SJonas Devlieghere        self.expect(
3562238dcc3SJonas Devlieghere            "frame recognizer info 0",
3572238dcc3SJonas Devlieghere            substrs=["frame 0 not recognized by any recognizer"],
3582238dcc3SJonas Devlieghere        )
35954c496daSRoman Podoliaka
36054c496daSRoman Podoliaka        # Now add a frame recognizer with --first-instruction-only=false.
36154c496daSRoman Podoliaka        self.runCmd("frame recognizer clear")
36254c496daSRoman Podoliaka
3632238dcc3SJonas Devlieghere        self.runCmd(
3642238dcc3SJonas Devlieghere            "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar --first-instruction-only=false"
3652238dcc3SJonas Devlieghere        )
36654c496daSRoman Podoliaka
36754c496daSRoman Podoliaka        # This time it should recognize the frame.
3682238dcc3SJonas Devlieghere        self.expect(
3692238dcc3SJonas Devlieghere            "frame recognizer info 0",
3702238dcc3SJonas Devlieghere            substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"],
3712238dcc3SJonas Devlieghere        )
37254c496daSRoman Podoliaka
37354c496daSRoman Podoliaka        opts = lldb.SBVariablesOptions()
37454c496daSRoman Podoliaka        opts.SetIncludeRecognizedArguments(True)
375*7293455cSDave Lee        frame = thread.selected_frame
37654c496daSRoman Podoliaka        variables = frame.GetVariables(opts)
37754c496daSRoman Podoliaka
37854c496daSRoman Podoliaka        self.assertEqual(variables.GetSize(), 2)
37954c496daSRoman Podoliaka        self.assertEqual(variables.GetValueAtIndex(0).name, "a")
38054c496daSRoman Podoliaka        self.assertEqual(variables.GetValueAtIndex(0).signed, 42)
3812238dcc3SJonas Devlieghere        self.assertEqual(
3822238dcc3SJonas Devlieghere            variables.GetValueAtIndex(0).GetValueType(), lldb.eValueTypeVariableArgument
3832238dcc3SJonas Devlieghere        )
38454c496daSRoman Podoliaka        self.assertEqual(variables.GetValueAtIndex(1).name, "b")
38554c496daSRoman Podoliaka        self.assertEqual(variables.GetValueAtIndex(1).signed, 56)
3862238dcc3SJonas Devlieghere        self.assertEqual(
3872238dcc3SJonas Devlieghere            variables.GetValueAtIndex(1).GetValueType(), lldb.eValueTypeVariableArgument
3882238dcc3SJonas Devlieghere        )
38954c496daSRoman Podoliaka
390d8d252feSAdrian Vogelsgesang    def test_frame_recognizer_disable(self):
391d8d252feSAdrian Vogelsgesang        self.build()
392d8d252feSAdrian Vogelsgesang        exe = self.getBuildArtifact("a.out")
393d8d252feSAdrian Vogelsgesang        target, process, thread, _ = lldbutil.run_to_name_breakpoint(
394d8d252feSAdrian Vogelsgesang            self, "foo", exe_name=exe
395d8d252feSAdrian Vogelsgesang        )
396d8d252feSAdrian Vogelsgesang
397d8d252feSAdrian Vogelsgesang        # Clear internal & plugins recognizers that get initialized at launch.
398d8d252feSAdrian Vogelsgesang        self.runCmd("frame recognizer clear")
399d8d252feSAdrian Vogelsgesang
400d8d252feSAdrian Vogelsgesang        self.runCmd(
401d8d252feSAdrian Vogelsgesang            "command script import "
402d8d252feSAdrian Vogelsgesang            + os.path.join(self.getSourceDir(), "recognizer.py")
403d8d252feSAdrian Vogelsgesang        )
404d8d252feSAdrian Vogelsgesang
405d8d252feSAdrian Vogelsgesang        # Add a frame recognizer in that target.
406d8d252feSAdrian Vogelsgesang        self.runCmd(
407d8d252feSAdrian Vogelsgesang            "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar"
408d8d252feSAdrian Vogelsgesang        )
409d8d252feSAdrian Vogelsgesang
410d8d252feSAdrian Vogelsgesang        # The frame is recognized
411d8d252feSAdrian Vogelsgesang        self.expect(
412d8d252feSAdrian Vogelsgesang            "frame recognizer info 0",
413d8d252feSAdrian Vogelsgesang            substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"],
414d8d252feSAdrian Vogelsgesang        )
415d8d252feSAdrian Vogelsgesang
416d8d252feSAdrian Vogelsgesang        # Disable the recognizer
417d8d252feSAdrian Vogelsgesang        self.runCmd("frame recognizer disable 0")
418d8d252feSAdrian Vogelsgesang
419d8d252feSAdrian Vogelsgesang        self.expect(
420d8d252feSAdrian Vogelsgesang            "frame recognizer list",
421d8d252feSAdrian Vogelsgesang            substrs=[
422d8d252feSAdrian Vogelsgesang                "0: [disabled] recognizer.MyFrameRecognizer, module a.out, demangled symbol foo"
423d8d252feSAdrian Vogelsgesang            ],
424d8d252feSAdrian Vogelsgesang        )
425d8d252feSAdrian Vogelsgesang
426d8d252feSAdrian Vogelsgesang        self.expect(
427d8d252feSAdrian Vogelsgesang            "frame recognizer info 0",
428d8d252feSAdrian Vogelsgesang            substrs=["frame 0 not recognized by any recognizer"],
429d8d252feSAdrian Vogelsgesang        )
430d8d252feSAdrian Vogelsgesang
431d8d252feSAdrian Vogelsgesang        # Re-enable the recognizer
432d8d252feSAdrian Vogelsgesang        self.runCmd("frame recognizer enable 0")
433d8d252feSAdrian Vogelsgesang
434d8d252feSAdrian Vogelsgesang        self.expect(
435d8d252feSAdrian Vogelsgesang            "frame recognizer list",
436d8d252feSAdrian Vogelsgesang            substrs=[
437d8d252feSAdrian Vogelsgesang                "0: recognizer.MyFrameRecognizer, module a.out, demangled symbol foo"
438d8d252feSAdrian Vogelsgesang            ],
439d8d252feSAdrian Vogelsgesang        )
440d8d252feSAdrian Vogelsgesang
441d8d252feSAdrian Vogelsgesang        self.expect(
442d8d252feSAdrian Vogelsgesang            "frame recognizer info 0",
443d8d252feSAdrian Vogelsgesang            substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"],
444d8d252feSAdrian Vogelsgesang        )
445d8d252feSAdrian Vogelsgesang
4469010cef2SRaphael Isemann    @no_debug_info_test
4479010cef2SRaphael Isemann    def test_frame_recognizer_delete_invalid_arg(self):
4482238dcc3SJonas Devlieghere        self.expect(
4492238dcc3SJonas Devlieghere            "frame recognizer delete a",
4502238dcc3SJonas Devlieghere            error=True,
4512238dcc3SJonas Devlieghere            substrs=["error: 'a' is not a valid recognizer id."],
4522238dcc3SJonas Devlieghere        )
4532238dcc3SJonas Devlieghere        self.expect(
4542238dcc3SJonas Devlieghere            'frame recognizer delete ""',
4552238dcc3SJonas Devlieghere            error=True,
4562238dcc3SJonas Devlieghere            substrs=["error: '' is not a valid recognizer id."],
4572238dcc3SJonas Devlieghere        )
4582238dcc3SJonas Devlieghere        self.expect(
4592238dcc3SJonas Devlieghere            "frame recognizer delete -1",
4602238dcc3SJonas Devlieghere            error=True,
4612238dcc3SJonas Devlieghere            substrs=["error: '-1' is not a valid recognizer id."],
4622238dcc3SJonas Devlieghere        )
4632238dcc3SJonas Devlieghere        self.expect(
4642238dcc3SJonas Devlieghere            "frame recognizer delete 4294967297",
4652238dcc3SJonas Devlieghere            error=True,
4662238dcc3SJonas Devlieghere            substrs=["error: '4294967297' is not a valid recognizer id."],
4672238dcc3SJonas Devlieghere        )
4689010cef2SRaphael Isemann
4699010cef2SRaphael Isemann    @no_debug_info_test
4709010cef2SRaphael Isemann    def test_frame_recognizer_info_invalid_arg(self):
4712238dcc3SJonas Devlieghere        self.expect(
4722238dcc3SJonas Devlieghere            "frame recognizer info a",
4732238dcc3SJonas Devlieghere            error=True,
4742238dcc3SJonas Devlieghere            substrs=["error: 'a' is not a valid frame index."],
4752238dcc3SJonas Devlieghere        )
4762238dcc3SJonas Devlieghere        self.expect(
4772238dcc3SJonas Devlieghere            'frame recognizer info ""',
4782238dcc3SJonas Devlieghere            error=True,
4792238dcc3SJonas Devlieghere            substrs=["error: '' is not a valid frame index."],
4802238dcc3SJonas Devlieghere        )
4812238dcc3SJonas Devlieghere        self.expect(
4822238dcc3SJonas Devlieghere            "frame recognizer info -1",
4832238dcc3SJonas Devlieghere            error=True,
4842238dcc3SJonas Devlieghere            substrs=["error: '-1' is not a valid frame index."],
4852238dcc3SJonas Devlieghere        )
4862238dcc3SJonas Devlieghere        self.expect(
4872238dcc3SJonas Devlieghere            "frame recognizer info 4294967297",
4882238dcc3SJonas Devlieghere            error=True,
4892238dcc3SJonas Devlieghere            substrs=["error: '4294967297' is not a valid frame index."],
4902238dcc3SJonas Devlieghere        )
49154c496daSRoman Podoliaka
49254c496daSRoman Podoliaka    @no_debug_info_test
49354c496daSRoman Podoliaka    def test_frame_recognizer_add_invalid_arg(self):
4942238dcc3SJonas Devlieghere        self.expect(
4952238dcc3SJonas Devlieghere            "frame recognizer add -f",
4962238dcc3SJonas Devlieghere            error=True,
4972238dcc3SJonas Devlieghere            substrs=["error: last option requires an argument"],
4982238dcc3SJonas Devlieghere        )
4992238dcc3SJonas Devlieghere        self.expect(
5002238dcc3SJonas Devlieghere            "frame recognizer add -f -1",
5012238dcc3SJonas Devlieghere            error=True,
5022238dcc3SJonas Devlieghere            substrs=["error: invalid boolean value '-1' passed for -f option"],
5032238dcc3SJonas Devlieghere        )
5042238dcc3SJonas Devlieghere        self.expect(
5052238dcc3SJonas Devlieghere            "frame recognizer add -f foo",
5062238dcc3SJonas Devlieghere            error=True,
5072238dcc3SJonas Devlieghere            substrs=["error: invalid boolean value 'foo' passed for -f option"],
5082238dcc3SJonas Devlieghere        )
509