xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/rseq/compiler.h (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only OR MIT */
2*053f45beSAndroid Build Coastguard Worker /*
3*053f45beSAndroid Build Coastguard Worker  * rseq/compiler.h
4*053f45beSAndroid Build Coastguard Worker  *
5*053f45beSAndroid Build Coastguard Worker  * Work-around asm goto compiler bugs.
6*053f45beSAndroid Build Coastguard Worker  *
7*053f45beSAndroid Build Coastguard Worker  * (C) Copyright 2021 - Mathieu Desnoyers <[email protected]>
8*053f45beSAndroid Build Coastguard Worker  */
9*053f45beSAndroid Build Coastguard Worker 
10*053f45beSAndroid Build Coastguard Worker #ifndef RSEQ_COMPILER_H
11*053f45beSAndroid Build Coastguard Worker #define RSEQ_COMPILER_H
12*053f45beSAndroid Build Coastguard Worker 
13*053f45beSAndroid Build Coastguard Worker /*
14*053f45beSAndroid Build Coastguard Worker  * gcc prior to 4.8.2 miscompiles asm goto.
15*053f45beSAndroid Build Coastguard Worker  * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
16*053f45beSAndroid Build Coastguard Worker  *
17*053f45beSAndroid Build Coastguard Worker  * gcc prior to 8.1.0 miscompiles asm goto at O1.
18*053f45beSAndroid Build Coastguard Worker  * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103908
19*053f45beSAndroid Build Coastguard Worker  *
20*053f45beSAndroid Build Coastguard Worker  * clang prior to version 13.0.1 miscompiles asm goto at O2.
21*053f45beSAndroid Build Coastguard Worker  * https://github.com/llvm/llvm-project/issues/52735
22*053f45beSAndroid Build Coastguard Worker  *
23*053f45beSAndroid Build Coastguard Worker  * Work around these issues by adding a volatile inline asm with
24*053f45beSAndroid Build Coastguard Worker  * memory clobber in the fallthrough after the asm goto and at each
25*053f45beSAndroid Build Coastguard Worker  * label target.  Emit this for all compilers in case other similar
26*053f45beSAndroid Build Coastguard Worker  * issues are found in the future.
27*053f45beSAndroid Build Coastguard Worker  */
28*053f45beSAndroid Build Coastguard Worker #define rseq_after_asm_goto()	asm volatile ("" : : : "memory")
29*053f45beSAndroid Build Coastguard Worker 
30*053f45beSAndroid Build Coastguard Worker #endif  /* RSEQ_COMPILER_H_ */
31