public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
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

  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).