Re: [PATCH] ms-sysv: Add call_do_test_unaligned
Uros Bizjak <[email protected]>
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <CAFULd4Z7mSbxQFhZEcPQbJ-=A04e9ttNcpMP1Ne+u20vfOnNgA@mail.gmail.com> |
On Tue, Aug 18, 2026 at 5:21 PM H.J. Lu <[email protected]> wrote: > > We can't use > > void > test (long a, long b, long c, long d, long e) > { > ... > __asm__ __volatile__ ("subq $8,%%rsp":::"cc"); > ret = do_test_unaligned (a, b, c, d, e); > __asm__ __volatile__ ("addq $8,%%rsp":::"cc"); > ... > } Uh, this violates GCC's inline-asm contract for %rsp. GCC requires the stack pointer to have the identical value on exit from an asm as it had on entry. > to call do_test_unaligned, which is marked with ms_abi attribute, with > an unaligned stack since GCC may save a function argument on stack and > retrieve it from stack to pass it to do_test_unaligned. When it happens, > stack adjustment in asm statements can lead to a random value in the > outgoing argument. Add an assembly function, call_do_test_unaligned, to > call do_test_unaligned with an unaligned stack. > > PR testsuite/126927 > * gcc.target/x86_64/abi/ms-sysv/do-test.S (call_do_test_unaligned): > New. > * gcc.target/x86_64/abi/ms-sysv/gen.cc (make_do_tests_decl): > Replace do_test_unaligned with call_do_test_unaligned. > (make_do_test): Remove asm statements with stack adjustment. OK with a couple of simplifications below. Thanks, Uros. diff --git a/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/do-test.S b/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/do-test.S index 9bc108b3e98..7432994bc95 100644 --- a/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/do-test.S +++ b/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/do-test.S +FUNC_BEGIN(call_do_test_unaligned) + # Load the 5th argument to R10. + movq 0x28(%rsp), %r10 + # Unalign stack. + subq $8, %rsp + # Push the 5th argument. + pushq %r10 + subq $32, %rsp + call do_test_unaligned + addq $32, %rsp + addq $16, %rsp addq $48, %rsp + ret +FUNC_END(call_do_test_unaligned) diff --git a/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/gen.cc b/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/gen.cc index 818a8875a6d..ceade25cd29 100644 --- a/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/gen.cc +++ b/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/gen.cc - out << ") = (void*)do_test_" << (unaligned ? "un" : "") + out << ") = (void*)" << (unaligned ? "call_" : "") + << "do_test_" << (unaligned ? "un" : "") << "aligned;" << endl; out << ") = (void*)" << (unaligned ? "call_do_test_unaligned" : "do_test_aligned") << ";" << endl;