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