brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · cdc9da0 Raw
79 lines · python
1"""2Test that we work properly with classes with the trivial_abi attribute3"""4 5 6import lldb7from lldbsuite.test.decorators import *8from lldbsuite.test.lldbtest import *9from lldbsuite.test import lldbutil10 11 12class TestTrivialABI(TestBase):13    NO_DEBUG_INFO_TESTCASE = True14 15    @skipUnlessSupportedTypeAttribute("trivial_abi")16    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr37995")17    @expectedFailureAll(18        archs=["aarch64"], oslist=["freebsd", "linux"], bugnumber="llvm.org/pr44161"19    )20    def test_call_trivial(self):21        """Test that we can print a variable & call a function with a trivial ABI class."""22        self.build()23        self.main_source_file = lldb.SBFileSpec("main.cpp")24        self.expr_test(True)25 26    @skipUnlessSupportedTypeAttribute("trivial_abi")27    # fixed for SysV-x86_64 ABI, but not Windows-x86_6428    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr36870")29    @expectedFailureAll(30        archs=["arm$", "aarch64"],31        oslist=["freebsd", "linux"],32        bugnumber="llvm.org/pr44161",33    )34    @expectedFailureAll(35        archs=["arm64", "arm64e"], bugnumber="<rdar://problem/57844240>"36    )37    def test_call_nontrivial(self):38        """Test that we can print a variable & call a function on the same class w/o the trivial ABI marker."""39        self.build()40        self.main_source_file = lldb.SBFileSpec("main.cpp")41        self.expr_test(False)42 43    def check_value(self, test_var, ivar_value):44        self.assertSuccess(test_var.GetError(), "Invalid valobj")45        ivar = test_var.GetChildMemberWithName("ivar")46        self.assertSuccess(test_var.GetError(), "Failed to fetch ivar")47        self.assertEqual(48            ivar_value, ivar.GetValueAsSigned(), "Got the right value for ivar"49        )50 51    def check_frame(self, thread):52        frame = thread.frames[0]53        inVal_var = frame.FindVariable("inVal")54        self.check_value(inVal_var, 10)55 56        options = lldb.SBExpressionOptions()57        inVal_expr = frame.EvaluateExpression("inVal", options)58        self.check_value(inVal_expr, 10)59 60        thread.StepOut()61        outVal_ret = thread.GetStopReturnValue()62        self.check_value(outVal_ret, 30)63 64    def expr_test(self, trivial):65        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(66            self, "Set a breakpoint here", self.main_source_file67        )68 69        # Stop in a function that takes a trivial value, and try both frame var & expr to get its value:70        if trivial:71            self.check_frame(thread)72            return73 74        # Now continue to the same thing without the trivial_abi and see if we get that right:75        threads = lldbutil.continue_to_breakpoint(process, bkpt)76        self.assertEqual(len(threads), 1, "Hit my breakpoint the second time.")77 78        self.check_frame(threads[0])79