From: Daniel Santos <daniel.santos@pobox.com>
To: Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Cc: gcc-patches <gcc-patches@gcc.gnu.org>,
Bernd Edlinger <bernd.edlinger@hotmail.de>
Subject: Re: [PATCH 2/2] [testsuite] PR 80759 Remove gas extensions from do-test.S, fix other problems
Date: Sat, 20 May 2017 00:38:00 -0000 [thread overview]
Message-ID: <22cd31d5-26ac-e7b8-3f7b-dba0b65e8206@pobox.com> (raw)
In-Reply-To: <yddmva9z0u3.fsf@CeBiTec.Uni-Bielefeld.DE>
Thanks you for your assistance Rainer!
On 05/19/2017 04:03 AM, Rainer Orth wrote:
> unfortunately, it still doesn't, as explained in the PR. The multilib
> support is still wrong/non-existant.
I guess I thought for some reason that would magically appear in
TEST_ALWAYS_FLAGS. :) I've explicitly added it for now, but I haven't
yet found where -m64 gets fed in the normal flow of things and I would
rather know I'm doing things as closely as possible to how the rest if
the test harness does it.
>> (I have SVN write privs now, so I can even commit it myself).
> Please always include ChangeLog entries with your patch submissions so
> one can easily see what you've change
> (cf. https://gcc.gnu.org/contribute.html).
>
> Thanks.
> Rainer
I hate when I forget that! I'll be sure to remember when I resubmit.
>> 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.santos@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
Well, I don't have an ms-sysv.h, but I suppose I can add one.
I'm starting to lean more towards the idea of plucking out the portion
of asm that uses these offsets, moving that to an inline asm function
and having the code in do-test.S just jmp to it. I wish there was some
sort of "naked" attribute for x86 since I'm not well versed in every way
that the compiler can change it in a way that wouldn't be friendly.
void __attribute__((optimize ("-O0 -fno-split-stack")))
do_test_body (void)
{
__asm__ __volatile__ (
"# Save registers\n"
" lea %0, %%rax\n"
" call regs_to_mem\n"
"\n"
" # Load registers with random data\n"
" lea %1, %%rax\n"
" call mem_to_regs\n"
"\n"
" # Save original return address\n"
" pop %%rax\n"
" movq %%rax, %4\n"
"\n"
" # Call the test function\n"
" call *%3\n"
"\n"
" # Restore the original return address\n"
" movq %4, %%rcx\n"
" push %%rcx\n"
"\n"
" # Save test function return value and store resulting register values\n"
" push %%rax\n"
" lea %2, %%rax\n"
" call regs_to_mem\n"
"\n"
" # Restore registers\n"
" lea %0, %%rax\n"
" call mem_to_regs\n"
" pop %%rax\n"
" retq\n\t"
FUNC_END("do_test_unaligned")
FUNC_END("do_test_aligned")
::
"m"(test_data.regdata[REG_SET_SAVE]),
"m"(test_data.regdata[REG_SET_INPUT]),
"m"(test_data.regdata[REG_SET_OUTPUT]),
"m"(test_data.fn),
"m"(test_data.retaddr):);
}
Any thoughts on that approach? I haven't actually tested it yet. (It
would probably nice if I put "memory" in the clobber.)
Thanks,
Daniel
next prev parent reply other threads:[~2017-05-19 23:22 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-19 6:29 [PATCH 0/2] [testsuite] PR80759 Fix test breakages on i386-pc-solaris2.* Daniel Santos
2017-05-19 6:29 ` [PATCH 1/2] [testsuite] Move non-standard parallelization support into new lib and fix flaw Daniel Santos
2017-05-19 6:50 ` [PATCH 2/2] [testsuite] PR 80759 Remove gas extensions from do-test.S, fix other problems Daniel Santos
2017-05-19 8:54 ` Rainer Orth
2017-05-20 0:38 ` Daniel Santos [this message]
2017-05-19 9:04 ` [PATCH 0/2] [testsuite] PR80759 Fix test breakages on i386-pc-solaris2.* Rainer Orth
2017-07-02 5:06 ` [PATCH v2 0/2] [testsuite, libgcc] PR80759 Fix FAILs on Solaris and Darwin Daniel Santos
2017-07-02 5:10 ` [PATCH 2/2] [libgcc]: PR80759 fixes for Solaris & Darwin Daniel Santos
2017-07-02 5:10 ` [PATCH 1/2] [testsuite] PR80759 fix tests on Solaris and Darwin Daniel Santos
2017-07-17 16:11 ` PING: [PATCH v2 0/2] [testsuite, libgcc] PR80759 Fix FAILs " Daniel Santos
2017-07-17 16:38 ` Mike Stump
2017-07-17 18:50 ` Uros Bizjak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=22cd31d5-26ac-e7b8-3f7b-dba0b65e8206@pobox.com \
--to=daniel.santos@pobox.com \
--cc=bernd.edlinger@hotmail.de \
--cc=gcc-patches@gcc.gnu.org \
--cc=ro@CeBiTec.Uni-Bielefeld.DE \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).