On Tue, Dec 07, 2021 at 01:55:34PM +0000, Peter Maydell wrote: > On Tue, 7 Dec 2021 at 13:53, Stefan Hajnoczi <stefa...@redhat.com> wrote: > > > > On Mon, Dec 06, 2021 at 02:34:45PM +0000, Peter Maydell wrote: > > > On Mon, 6 Dec 2021 at 14:33, Stefan Hajnoczi <stefa...@redhat.com> wrote: > > > > > > > > v3: > > > > - Added __attribute__((weak)) to get_ptr_*() [Florian] > > > > > > Do we really need it *only* on get_ptr_*() ? If we need to > > > noinline the other two we probably also should use the same > > > attribute weak to force no optimizations at all. > > > > The weak attribute can't be used on static functions, so I think we need > > a different approach: > > > > In file included from ../util/async.c:35: > > /builds/stefanha/qemu/include/qemu/coroutine-tls.h:201:11: error: weak > > declaration of 'get_ptr_my_aiocontext' must be public > > type *get_ptr_##var(void) > > \ > > ^~~~~~~~ > > ../util/async.c:673:1: note: in expansion of macro > > 'QEMU_DEFINE_STATIC_CO_TLS' > > QEMU_DEFINE_STATIC_CO_TLS(AioContext *, my_aiocontext) > > ^~~~~~~~~~~~~~~~~~~~~~~~~ > > > > Adding asm volatile("") seems to work though: > > https://godbolt.org/z/3hn8Gh41d > > You can see in the clang disassembly there that this isn't > sufficient. The compiler puts in both calls, but it ignores > the return results and always returns "true" from the function.
Specifying a input operand forces the compiler to evaluate the return value of get_ptr_i(): static __attribute__((noinline)) long get_ptr_i() { long l = (long)&i; asm volatile("" : "+rm" (l)); return l; } https://godbolt.org/z/e6ddGdPMv Stefan
signature.asc
Description: PGP signature