On 08/10/2021 05:39, 余生与君 wrote:
And further investigation shows that a dummy function can also do this trick!
When one wants any sort of barrier (compiler optimization barrier, CPU
execution barrier, memory barriers, etc) that works (and is also
extremely likely to remain working in the future) for both GCC and
CLANG, it is usually a good idea to take a look at what the linux kernel
is using.
--8<-- from include/linux/compiler.h (latest linux kernel source)
/* Optimization barrier */
#ifndef barrier
/* The "volatile" is due to gcc bugs */
# define barrier() __asm__ __volatile__("": : :"memory")
#endif
#ifndef barrier_data
/*
* This version is i.e. to prevent dead stores elimination on @ptr
* where gcc and llvm may behave differently when otherwise using
* normal barrier(): while gcc behavior gets along with a normal
* barrier(), llvm needs an explicit input variable to be assumed
* clobbered. The issue is as follows: while the inline asm might
* access any memory it wants, the compiler could have fit all of
* @ptr into memory registers instead, and since @ptr never escaped
* from that, it proved that the inline asm wasn't touching any of
* it. This version works well with both compilers, i.e. we're telling
* the compiler that the inline asm absolutely may see the contents
* of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
*/
# define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
#endif
--8<--
--
Henrique de Moraes Holschuh
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox