From 6d64162a2d0df2230faf02ff7ee677c448faf4af Mon Sep 17 00:00:00 2001 From: Jason Molenda Date: Wed, 11 Dec 2019 11:43:35 -0800 Subject: return-object-by-reference ("non trivial") xfail on arm64 in TestTrivialABI.py I don't think this test case can be handled correctly on AAPCS64. The ABI says that the caller passes the address of the return object in x8. x8 is a caller-spilled (aka "volatile") register, and the function is not required to preserve x8 or to copy the address back into x8 on function exit like the SysV x86_64 ABI does with rax. (from aapcs64: "there is no requirement for the callee to preserve the value stored in x8") From my quick reading of ABISysV_arm64, I worry that it may actually be using the value in x8 at function exit, assuming it still has the address of the return object - if (is_return_value) { // We are assuming we are decoding this immediately after returning from // a function call and that the address of the structure is in x8 reg_info = reg_ctx->GetRegisterInfoByName("x8", 0); This will work on trivial test programs / examples, but if the function does another function call, or overwrites x8 as a scratch register, lldb will provide incorrect values to the user. ABIMacOSX_arm64 doesn't do this, but it also doesn't flag the value as unavailable so we're providing incorrect values to the user all the time. I expect my fix will be to make ABIMacOSX_arm64 flag the return value as unretrievable, unless I've misread the ABI. --- .../Python/lldbsuite/test/lang/cpp/trivial_abi/TestTrivialABI.py | 1 + lldb/packages/Python/lldbsuite/test/lang/cpp/trivial_abi/main.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'lldb/packages/Python/lldbsuite/test/lang/cpp/trivial_abi') diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/trivial_abi/TestTrivialABI.py b/lldb/packages/Python/lldbsuite/test/lang/cpp/trivial_abi/TestTrivialABI.py index 78f7fa3afd7..27cf324baec 100644 --- a/lldb/packages/Python/lldbsuite/test/lang/cpp/trivial_abi/TestTrivialABI.py +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/trivial_abi/TestTrivialABI.py @@ -31,6 +31,7 @@ class TestTrivialABI(TestBase): @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr36870") @expectedFailureAll(archs=["aarch64"], oslist=["linux"], bugnumber="llvm.org/pr44161") + @expectedFailureAll(archs=["arm64", "arm64e"], bugnumber="") def test_call_nontrivial(self): """Test that we can print a variable & call a function on the same class w/o the trivial ABI marker.""" self.build() diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/trivial_abi/main.cpp b/lldb/packages/Python/lldbsuite/test/lang/cpp/trivial_abi/main.cpp index cdf593e8b40..b1f50159692 100644 --- a/lldb/packages/Python/lldbsuite/test/lang/cpp/trivial_abi/main.cpp +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/trivial_abi/main.cpp @@ -29,7 +29,7 @@ main() outVal = takeTrivial(inVal); S_NotTrivial inNotVal, outNotVal; - outNotVal = takeNotTrivial(outNotVal); + outNotVal = takeNotTrivial(inNotVal); return 0; // Set another for return value } -- cgit v1.2.3