Hi Daniel,
> Use of .struct in do_test.S causes breakages when gas isn't the
> assembler (e.g., Solaris). I also wasn't including TEST_ALWAYS_FLAGS in
> my CFLAGS resulting in super-ugly log files. Finally, this patch
> eliminates spam of "test unsupported" (limiting it to one printing).
>
> Signed-off-by: Daniel Santos <[email protected]>
> ---
> .../gcc.target/x86_64/abi/ms-sysv/do-test.S | 26
> +++++-----------------
> .../gcc.target/x86_64/abi/ms-sysv/ms-sysv.c | 7 ++++++
> .../gcc.target/x86_64/abi/ms-sysv/ms-sysv.exp | 24 ++++++++++++--------
> 3 files changed, 27 insertions(+), 30 deletions(-)
>
> 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 1395235fd1e..967eb959fbc 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
> @@ -46,22 +46,6 @@ fn:
> # define MOVAPS movaps
> # endif
>
> -/* TODO: Is there a cleaner way to provide these offsets? */
> - .struct 0
> -test_data_save:
> -
> - .struct test_data_save + 224
> -test_data_input:
> -
> - .struct test_data_save + 448
> -test_data_output:
> -
> - .struct test_data_save + 672
> -test_data_fn:
> -
> - .struct test_data_save + 680
> -test_data_retaddr:
> -
> .text
>
> regs_to_mem:
> @@ -132,23 +116,23 @@ L0:
> call regs_to_mem
>
> # Load register with random data
> - lea test_data + test_data_input(%rip), %rax
> + lea test_data + 224(%rip), %rax
> call mem_to_regs
>
> # Save original return address
> pop %rax
> - movq %rax, test_data + test_data_retaddr(%rip)
> + movq %rax, test_data + 680(%rip)
>
> # Call the test function
> - call *test_data + test_data_fn(%rip)
> + call *test_data + 672(%rip)
>
> # Restore the original return address
> - movq test_data + test_data_retaddr(%rip), %rcx
> + movq test_data + 680(%rip), %rcx
> push %rcx
>
> # Save test function return value and store resulting register values
> push %rax
> - lea test_data + test_data_output(%rip), %rax
> + lea test_data + 448(%rip), %rax
> call regs_to_mem
>
> # Restore registers
> diff --git a/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/ms-sysv.c
> b/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/ms-sysv.c
> index 2a011f5103d..7cec312c386 100644
> --- a/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/ms-sysv.c
> +++ b/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/ms-sysv.c
> @@ -346,6 +346,13 @@ int main (int argc, char *argv[])
> assert (!((long)&test_data.regdata[REG_SET_INPUT] & 15));
> assert (!((long)&test_data.regdata[REG_SET_OUTPUT] & 15));
>
> + /* Verify offsets hard-coded into assembly. */
> + assert (__builtin_offsetof (struct test_data, regdata[REG_SET_SAVE]) == 0);
> + assert (__builtin_offsetof (struct test_data, regdata[REG_SET_INPUT]) ==
> 224);
> + assert (__builtin_offsetof (struct test_data, regdata[REG_SET_OUTPUT]) ==
> 448);
> + assert (__builtin_offsetof (struct test_data, fn) == 672);
> + assert (__builtin_offsetof (struct test_data, retaddr) == 680);
> +
> while ((c = getopt (argc, argv, "s:f")) != -1)
> {
> switch (c)
while .struct is a gas extension and doesn't work with the Solaris/x86
/bin/as, having the same (mostly unexplained) constants hardcoded in two
places isn't exactly helpful. I'd suggest moving them to (say)
ms-sysv.h and include that from both do-test.S (which is preprocessed
assembler after all) and ms-sysv.c.
Rainer
--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University