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