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;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.