diff options
Diffstat (limited to 'include/linux/compiler-gcc.h')
| -rw-r--r-- | include/linux/compiler-gcc.h | 14 | 
1 files changed, 13 insertions, 1 deletions
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 811f7a915658..0efef9cf014f 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h @@ -197,6 +197,17 @@  #endif  #endif +#ifdef CONFIG_STACK_VALIDATION +#define annotate_unreachable() ({					\ +	asm("%c0:\t\n"							\ +	    ".pushsection .discard.unreachable\t\n"			\ +	    ".long %c0b - .\t\n"					\ +	    ".popsection\t\n" : : "i" (__LINE__));			\ +}) +#else +#define annotate_unreachable() +#endif +  /*   * Mark a position in code as unreachable.  This can be used to   * suppress control flow warnings after asm blocks that transfer @@ -206,7 +217,8 @@   * this in the preprocessor, but we can live with this because they're   * unreleased.  Really, we need to have autoconf for the kernel.   */ -#define unreachable() __builtin_unreachable() +#define unreachable() \ +	do { annotate_unreachable(); __builtin_unreachable(); } while (0)  /* Mark a function definition as prohibited from being cloned. */  #define __noclone	__attribute__((__noclone__, __optimize__("no-tracer")))  | 
