On 11/28/2017 05:22 AM, Jakub Jelinek wrote: > On Mon, Nov 27, 2017 at 05:02:32PM -0600, Daniel Santos wrote: >>> --- gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/gen.cc.jj 2017-05-22 >>> 10:49:45.000000000 +0200 >>> +++ gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/gen.cc 2017-11-27 >>> 11:57:14.889570915 +0100 >>> @@ -392,7 +392,7 @@ static void make_do_tests_decl (const ve >>> continue; >>> >>> comma.reset (); >>> - out << "static __attribute__ ((ms_abi)) long (*const do_test_" >>> + out << "static __attribute__ ((ms_abi)) long (*do_test_" >>> << (unaligned ? "u" : "") >>> << (varargs ? "v" : "") << i << ") ("; >> I don't have a problem with removing const, it's only there for >> const-correctness and caution. I just posted to the PR a bit ago and >> I'm curious if there is a better approach when using assembly stubs that >> are meant to be called in varying ways. CV would work also, although >> there's no real need to refetch the address before each use. >> >> If you don't have a better way to do this then please use this patch. > I've verified the resulting *.optimized dump as well as assembly is > practically identical without/with the patch, only differences are in > SSA_NAME versions, in assembly the .LCNNNN and .LCFINNNN constants are > different but otherwise it is the same - the functions are emitted in > different orders by cgraph and committed the patch. > > Using assembly stubs that are meant to be called in varying ways should > just be avoided in portable programs, you could e.g. in the generator > instead of all those: > extern __attribute__ ((ms_abi)) long do_test_aligned (); > extern __attribute__ ((ms_abi)) long do_test_unaligned (); > static __attribute__ ((ms_abi)) long (*do_test_1) (long a) = > (void*)do_test_aligned; > static __attribute__ ((ms_abi)) long (*do_test_v1) (long a, ...) = > (void*)do_test_aligned; > static __attribute__ ((ms_abi)) long (*do_test_u1) (long a) = > (void*)do_test_unaligned; > static __attribute__ ((ms_abi)) long (*do_test_uv1) (long a, ...) = > (void*)do_test_unaligned; > emit: > extern __attribute__ ((ms_abi)) long do_test_1 (long a); > asm (".text; do_test_1: jmp do_test_aligned; .previous"); > extern __attribute__ ((ms_abi)) long do_test_v1 (long a, ...); > asm (".text; do_test_v1: jmp do_test_aligned; .previous"); > extern __attribute__ ((ms_abi)) long do_test_1 (long a); > asm (".text; do_test_u1: jmp do_test_unaligned; .previous"); > extern __attribute__ ((ms_abi)) long do_test_1 (long a, ...); > asm (".text; do_test_uv1: jmp do_test_unaligned; .previous"); > or something similar. > > Jakub
Ah hah! That would indeed work. Thanks for the tip. I have some improvements to make to this set of tests, mostly tests triggered by GCC_TEST_RUN_EXPENSIVE, but perhaps I can make this modification as well. Come to think of it, attribute naked might work too. Thanks, Daniel