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 <daniel.san...@pobox.com>
> ---
>  .../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

Reply via email to